function spectrumscope_ex3
% SPECTRUMSCOPE_EX3   Spectrum scope example, using the Data Acquisition Toolbox
%
% See comments on bottom of file for extra notes on this application

%    Scott Hirsch 2-25-04
%    shirsch@mathworks.com
%    Copyright 1998-2004 The MathWorks, Inc.

%%
% Create analoginput object (Data Acquisition Toolbox)
daqreset
ai = analoginput('winsound');
chan = addchannel(ai,1:2);

%%
% Configure analoginput object
Fs = 44100;     % Sample Rate
set(ai,'SampleRate',Fs);
set(ai,'SamplesPerTrigger',4096);

%%
% Initialize scope
Nfft = ai.SamplesPerTrigger/2;                  % FFT Length.
NTraces = length(chan);                         % Number of traces on scope 
hSpectrumScope = spectrumscope(Fs,Nfft,NTraces);% Initialize spectrum scope

%%
% Configure acquisition to update scope
set(ai,'TriggerRepeat',inf)
set(ai,'TriggerFcn',{@updateplot,hSpectrumScope,Nfft});

% Put a stop button on the scope 
% This is available on MATLAB Central
if exist('daqstopbutton','file')
    daqstopbutton(gcf,ai);
else
    start(ai);
    disp('Type "stop(daqfind)" to stop the application.  Then, go to MATLAB Central and download daqstopbutton.m!');
end;


function updateplot(ai,event,hSpectrumScope,Nfft)
d = peekdata(ai,Nfft);
spectrumscope(hSpectrumScope,d);


%%
% Comments:
%
% For an application that simple gives me some real-time visualization of
% the data that I am acquiring, I prefer to use PEEKDATA instead of
% GETDATA.  Since GETDATA always grabs the oldest data in the buffer, there
% can easily be a significant lag from when an event occurs to when the
% response to the event is shown on the screen. PEEKDATA grabs the most
% recently acquired data, so it makes for much more responsive
% applications.  PEEKDATA is also non-blocking, so it won't slow down your
% application while waiting for data.  This means that you need to make
% sure there is enough data in the buffer before you call PEEKDATA.  This
% is why I set the amount of data I grab per call to peekdata (Nfft) to
% something less than the amount of data acquired per trigger.
%
% There are a bunch of different callback functions for running continuous
% applications.  I happen to like using Triggers, but you could just as
% easily use TimerFcn or SamplesAcquiredFcn