Spectrum Analyzer
Read a single channel and plot the power spectrum over time
Good for visualization and online analysis
Housekeeping
Clear workspace and close existing figures. Add SDK directories to MATLAB path.
close all; clc;
[MAINEXAMPLEPATH,name,ext] = fileparts(cd); % \TDTMatlabSDK\Examples
[SDKPATH,name,ext] = fileparts(MAINEXAMPLEPATH); % \TDTMatlabSDK
addpath(genpath(SDKPATH));
Variable Setup
load and run demo experiment
syn = SynapseAPI('localhost');
if syn.setCurrentExperiment('APIStreamer1ChDemo') == 0
error('trouble loading experiment');
end
syn.setModeStr('Preview');
pause(4);
Setup APIStreamer
s = APIStreamer('GIZMO', 'APIStreamer1Ch1','HISTORY', 30, 'DO_FFT', 1, 'WINSIZE', 1, 'FREQ', [1 20]);
h = figure;
set(gcf, 'Position', [800, 200, 600, 900])
APIStreamer on
Resetting APIStreamer
1 channels in 100000 sample buffer at 6103.515625 Hz
APIStreamer off
The Main Loop
while size(findobj(h)) > 0 % run while the figure is open
[fft_data, ts, fft_freq] = s.get_data();
if ~any(fft_data(:)), continue, end
psdx = fft_data/(s.fs*size(fft_data,2));
%20*log10(fft_data) for power in dB
last_psd = psdx(:,end);
spectral_peak = max(last_psd);
peak_freq = fft_freq(last_psd == spectral_peak);
% calculate power and normalize color bar
Power = fft_data;
if any(isinf(Power(:))), continue, end
Z_STD = 6 * std(Power(:));
Z_MEAN = mean(Power(:));
% plot it
subplot(2,1,1);
plot(fft_freq, last_psd);
grid on
title('Periodogram Using FFT')
xlabel('Frequency (Hz)')
ylabel('Energy/Frequency (1/Hz)')
subplot(2,1,2);
imagesc(ts, fft_freq, Power, [Z_MEAN-Z_STD, Z_MEAN+Z_STD]);
h_colorbar = colorbar;
colormap(jet);
set(gca,'fontsize',12);
xlabel('Time (s)','fontsize',15);
ylabel('Frequency (Hz)','fontsize',15);
ylabel(h_colorbar,'Energy','Rotation',-90,'fontsize',15,'VerticalAlignment','baseline');
title(sprintf('Spectrogram'))
axis xy;
% force the plots to update
try
snapnow
catch
drawnow
end
% for publishing, end early
if max(ts) > 30
s.stop()
syn.setModeStr('Idle'); % set to idle mode
break
end
end
APIStreamer off