想要实现的:数组cycle_durations,在数组更新过程中对其中的所有元素求平均值ave_breath_duration.
现在发现不管cycle_durations长度多少,得到的平均值始终不变。
显然不对,但不知道问题出在哪
a=csvread('C:\Users\Administrator\Desktop\ppgsource\BVP.csv');
rel_data=a(50624:53568);
Fs=64;
t=[];
rel_data=filter(ditong3,rel_data);
rel_data=filter(bandpass_hann,rel_data);
n=length(rel_data);
for i=1:n
t(i)=i/Fs;
end
wins.t_start=0;
wins.t_end=n;
t=t';
%rel_data=[t;rel_data];
%field={'t','v'};
data=struct('t',t,'v',data);
rel_data=struct('t',t,'v',rel_data);
%rr.t = mean([wins.t_start(:)' ; wins.t_end(:)']);
rr.t = t(:);
rr.v = nan(length(rr.t),1);
for win_no = 1 : length(wins.t_start:wins.t_end)
%% extract relevant data
rel_els = find(rel_data.t >= wins.t_start& rel_data.t < wins.t_end);
data.v = rel_data.v(rel_els);
data.t = rel_data.t(rel_els);
%% eliminate nans
good_els = ~isnan(data.v);
data.v = data.v(good_els); data.v = data.v(:);
data.t = data.t(good_els); data.t = data.t(:);
%% identify peaks
diffs_on_left_of_pt = diff(data.v);diffs_on_left_of_pt = diffs_on_left_of_pt(1:(end-1)); diffs_on_left_of_pt = logical(diffs_on_left_of_pt>0);
diffs_on_right_of_pt = diff(data.v);diffs_on_right_of_pt = diffs_on_right_of_pt(2:end); diffs_on_right_of_pt = logical(diffs_on_right_of_pt<0);
peaks = find(diffs_on_left_of_pt & diffs_on_right_of_pt)+1;
%% identify troughs
diffs_on_left_of_pt = diff(data.v); diffs_on_left_of_pt = diffs_on_left_of_pt(1:(end-1)); diffs_on_left_of_pt = logical(diffs_on_left_of_pt<0);
diffs_on_right_of_pt = diff(data.v); diffs_on_right_of_pt = diffs_on_right_of_pt(2:end); diffs_on_right_of_pt = logical(diffs_on_right_of_pt>0);
troughs = find(diffs_on_left_of_pt & diffs_on_right_of_pt)+1;
%% define threshold
q3 = quantile(data.v(peaks), 0.5);
thresh = 0.2*q3;
%% find relevant peaks and troughs
extrema = sort([peaks(:); troughs(:)]);
rel_peaks = peaks(data.v(peaks) > thresh);
rel_troughs = troughs(data.v(troughs) < 0);
%% find valid breathing cycles
% valid cycles start with a peak:
valid_cycles = zeros(length(rel_peaks)-1,1);
cycle_durations = nan(length(rel_peaks)-1,1);
for peak_no = 1 : (length(rel_peaks)-1)
% valid if there is only one rel_trough between this peak and the
% next
cycle_rel_troughs = rel_troughs(rel_troughs > rel_peaks(peak_no) & rel_troughs < rel_peaks(peak_no+1));
if length(cycle_rel_troughs) == 1
valid_cycles(peak_no) = 1;
cycle_durations(peak_no) = data.t(rel_peaks(peak_no+1)) - data.t(rel_peaks(peak_no));
end
end
if sum(valid_cycles) == 0
rr.v(win_no) = nan;
continue
end
%% Calc RR
% Using average breath length
ave_breath_duration= nanmean(cycle_durations);
rr.v(win_no) = 60/ave_breath_duration;
end