Main Content

Acquire Continuous Audio Data

This example shows how to set up a continuous audio acquisition using a microphone.

Create a DataAcquisition

Create a DataAcquisition with directsound as the vendor and add an audio input channel to it using addinput.

dq = daq("directsound");
addinput(dq,"Audio0",1,"Audio");

Set Up the FFT Plot

hf = figure;
hp = plot(zeros(1000,1));
T = title('Discrete FFT Plot');
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
grid on;

Set ScansAvailableFcn

Update the figure with the FFT of the live input signal by setting the ScansAvailableFcn.

dq.ScansAvailableFcn = @(src, evt) continuousFFT(src, hp);

Start Acquisition

The figure updates, for 10 seconds, as the microphone is used.

start(dq,"Duration",seconds(10));
figure(hf);

function continuousFFT(daqHandle, plotHandle)
% Calculate FFT(data) and update plot with it.
data = read(daqHandle, daqHandle.ScansAvailableFcnCount, "OutputFormat", "Matrix");
Fs = daqHandle.Rate;

lengthOfData = length(data);
% next closest power of 2 to the length
nextPowerOfTwo = 2 ^ nextpow2(lengthOfData);

plotScaleFactor = 4;
% plot is symmetric about n/2
plotRange = nextPowerOfTwo / 2; 
plotRange = floor(plotRange / plotScaleFactor);

yDFT = fft(data, nextPowerOfTwo); 

h = yDFT(1:plotRange);
abs_h = abs(h);

% Frequency range
freqRange = (0:nextPowerOfTwo-1) * (Fs / nextPowerOfTwo);
% Only plot up to n/2 (as other half is the mirror image)
gfreq = freqRange(1:plotRange);  

% Update the plot
set(plotHandle, 'ydata', abs_h, 'xdata', gfreq);
drawnow
end