2020
2121%% Setting Filters to BOSS Device
2222% this allows calibrating the oscillation analysis to an individual peak frequency
23- bd.alpha.bpf_fir_coeffs = firls(70 , [0 6 9 13 16 (500 / 2 )]/(500 / 2 ), [0 0 1 1 0 0 ], [1 1 1 ]);
23+ % bd.alpha.bpf_fir_coeffs = firls(70, [0 6 9 13 16 (500/2)]/(500/2), [0 0 1 1 0 0], [1 1 1]);
2424% fvtool(bd.alpha.bpf_fir_coeffs, 'Fs', 500) % visualize filter
2525
2626
2727%% Configuring an instrument buffer to acquire data
2828instObj = slrealtime .Instrument ;
29- instObj .addSignal(' spf_sig_500Hz ' );
29+ instObj .addSignal(' spf_sig ' );
3030instObj .addSignal(' osc' ,' BusElement' ,' alpha.ip' );
3131instObj.BufferData = true ;
3232
4242sigData = mapData .values ;
4343
4444% Extract data and downsample fast signal
45- osc_alpha_ipData = sigData{1 }.data;
46- spf_sigData = squeeze(sigData{2 }.data)' ;
45+ osc_alpha_ip = timetable(seconds(sigData{1 }.time),sigData{1 }.data(: ,1 ));
46+ spf_sig = squeeze(sigData{2 }.data)' ;
47+ spf_sig = timetable(seconds(sigData{2 }.time),spf_sig(: ,1 ));
4748
48- % Compute sample frequency
49- fs = 1 / mean(diff(sigData{1 }.time));
49+ syncedData = synchronize(osc_alpha_ip , spf_sig , ' first' , ' nearest' );
5050
5151% Compensante offset in instantaneous predicted phase
5252numSamples = bd .alpha .offset_samples ;
53- assert(numSamples >= 1 )
54- spf_sigData = spf_sigData(1 + numSamples - 1 : end , 1 );
55- osc_alpha_ipData = osc_alpha_ipData(1 : size(spf_sigData ,1 ),end );
53+ assert(numSamples >= 1 );
5654
5755
5856%% Phase error using standard non-causal methods
5957disp(' Determining phase using standard non-causal methods...' );
6058
61- % Build zero phase band-pass filter
62- PhaseErrorFilter = designfilt( ' bandpassfir ' , ' FilterOrder ' , round( fs ), ' CutoffFrequency1 ' , 9 , ' CutoffFrequency2 ' , 13 , ' SampleRate ' , fs );
59+ % Obtain applied filter
60+ oscBPFcoeffs = bd .getparam( ' OSC/alpha ' , ' bpf_fir_coeffs ' );
6361
6462% Compute phase prediction error
65- [phaseError , meanError , meanDev ] = bossapi .boss .computePhasePredictionError(PhaseErrorFilter , spf_sigData(: ,1 ), osc_alpha_ipData(: ,1 ));
63+ [phaseError , meanError , meanDev ] = bossapi .boss .computePhasePredictionError(oscBPFcoeffs ,...
64+ syncedData .Var1_spf_sig(1 + numSamples : end ), syncedData .Var1_osc_alpha_ip(1 : end - numSamples ));
6665
6766disp(' Done.' );
6867
7170polarhistogram(phaseError , ' Normalization' , ' probability' , ' BinWidth' , pi / 36 );
7271ax = gca ;
7372ax.ThetaZeroLocation = ' Top' ;
73+ ax.ThetaLim = [-180 180 ];
7474title(sprintf(' Circular mean = %.1f °\n Circular standard deviation = %.1f °' , meanError , meanDev ));
7575
7676
7777%% Stop and reset instrumentation
78- bd .stop ;
79- bd .removeInstrument(instObj );
78+ bd .stop ;
0 commit comments