% This example uses the xippmex('cont') command to retrieve continuous 
% data from the Ripple Grapevine processor and compute the sliding window
% power spectral density spectrograms.

% Clean the world
close all; fclose('all'); clc; clear all; 

% Initialize xippmex
status = xippmex;
if status ~= 1; error('Xippmex Did Not Initialize');  end

% Stream Setup
FR = 30;                % Hz, plot update framerate
display_s = 5;        	% seconds, length of display window (0-5 seconds)
pause(display_s);       % pause for display duration to fill signal buffer
stream_ch = 1;          % channel number, 1 denotes A-1
stream = 'raw';
switch(stream)
    case 'raw'
        Fs = 3e4;       % Hz, sampling frequency of signal
    case 'lfp'
        Fs = 1e3;       % Hz, sampling frequency of signal
    case 'hi-res'
        Fs = 2e3;       % Hz, sampling frequency of signal
    case 'hifreq'
        Fs = 7.5e3;     % Hz, sampling frequency of signal
    otherwise
        error('%s is an invalid stream type.\n', stream);
end
if xippmex('signal', stream_ch, stream) == 0
    xippmex('signal', stream_ch, stream, 1);
end

% FFT Setup
window_ms = 512;                    	% FFT window size in ms
window_samp = floor(window_ms*Fs/1e3);	% FFT window size in samples
N = 2^nextpow2(floor(window_samp/2));	% Size of PSD
f_range = [0 75];                   	% Hz, spectrogram display range
n_sig = Fs/1e3 * round(display_s*1e3);
n_psd = round(display_s*FR);
t_sig = linspace(-display_s,0,n_sig);   % Time for Signal
t_psd = linspace(-display_s,0,n_psd);   % Time for Spectrogram
f_psd_total = linspace(0,Fs,2*N);      	% Frequency for Spectrogram
f_ind = find(f_psd_total >= f_range(1)...
    & f_psd_total <= f_range(2) );
f_psd = f_psd_total(f_ind);             % Frequency for Spectrogram display
x_sig = zeros(n_sig,1);                 % Signal Buffer
x_psd = zeros(length(f_psd),n_psd);    	% Spectrogram Buffer

% Plot Setup
psd_plot = figure;
subplot(211);
h_sig = plot(t_sig,x_sig,'b');          % signal plot
x_range = t_sig([1 end]);               % seconds, display range
xlim(x_range);
title(sprintf('Channel #%d, %s',stream_ch,stream)); xlabel('Time (s)'); ylabel('\muV');
subplot(212);
h_psd = imagesc(t_psd,f_psd,x_psd);     % spectrogram plot
set(gca,'ydir','normal','ylim',f_range);
title('Spectrogram'); xlabel('Time (s)'); ylabel('Frequency (Hz)');

% Main Collection/Update Loop while figure is open
t0 = xippmex('time');
while isa(psd_plot,'handle') && isvalid(psd_plot)
    
    t1 = xippmex('time');
    
    if (t1-t0)>=(3e4/FR)
        % Collection
        [x_sig,ts] = xippmex('cont',stream_ch,round(display_s*1e3),stream);
        
        % Calculation
        sig_sample = x_sig(end-window_samp+1:end);
        psd_sample = 2*abs(fft(sig_sample,2*N));
        x_psd(:,1:end-1) = x_psd(:,2:end);
        x_psd(:,end) = (psd_sample(f_ind))';
        
        % Plot
        set(h_sig,'ydata',x_sig);
        set(h_psd,'cdata',(x_psd));
        drawnow;
        
        t0 = t1;
    end

end
disp('Exiting main loop');

% Close xippmex after exiting loop
disp('Closing xippmex connection');
xippmex('close');

Start typing and press Enter to search