How do I resample to have a uniform number of samples for each cycle of my signal?
8 次查看(过去 30 天)
显示 更早的评论
I am using MATLAB R2020a on a MacOS. I have an ECG signal with a sampling frequency of 1kHz. From cycle to cycle, there are a different number of samples since the cycle lenghts are different. However, I would like to have an array which has an equal number of samples (around 800) for each cycle such that those 800 sample points are automatically fitted to the original sample points regardless of the number of original sample points. I know that the resample function allows resampling at a fraction of the frequency of the input signal, but I am not sure how this would help me achieve my aim given that I would like to resample for a fixed number of points.
I would very much appreciate any suggestions. Thanks in advance
Here is my code:
% Delimit cycles in original maximum amplitude signal using indices from
% Pan Tompkins algorithm
number_cycles = round(length(qrs_i_raw)/2);
number_samples = 900;
cycle_points_maxamp = zeros(number_cycles, length(number_samples));
x_eachcycle = zeros(number_cycles, length(number_samples));
values_x = zeros(length(number_samples), 1);
y_eachcycle = zeros(number_cycles, length(number_samples));
values_y = zeros(length(number_samples), 1);
z_eachcycle = zeros(number_cycles, length(number_samples));
values_z = zeros(length(number_samples), 1);
v_eachcycle = zeros(number_cycles, length(number_samples));
w_eachcycle = zeros(number_cycles, length(number_samples));
for currentcycle = 1:length(number_cycles)
values_maxamp = maxamp(qrs_i_raw(currentcycle):qrs_i_raw(currentcycle + 1)); % need to resample to only generate 900 samples
cycle_points_maxamp(currentcycle, 1:length(values_maxamp)) = values_maxamp;
values_z(1 + 2*tau_milli_rounded(currentcycle):end) = cycle_points_maxamp(currentcycle, 1:end - 2*tau_milli_rounded(currentcycle));
z_eachcycle(currentcycle, 1:length(values_z)) = values_z;
values_y(1 + tau_milli_rounded(currentcycle):end) = cycle_points_maxamp(currentcycle, 1:end - tau_milli_rounded(currentcycle));
y_eachcycle(currentcycle, 1:length(values_y)) = values_y;
values_x(1:end) = cycle_points_maxamp(currentcycle, 1:end);
x_eachcycle(currentcycle, 1:length(values_x)) = values_x;
values_v = ((1/sqrt(6))*(x_eachcycle(currentcycle, 1:length(values_x))) + (y_eachcycle(currentcycle, 1:length(values_y))) - 2*(z_eachcycle(currentcycle, 1:length(values_z))));
v_eachcycle(currentcycle, 1:length(values_v)) = values_v;
values_w = ((1/sqrt(2))*(x_eachcycle(currentcycle, 1:length(values_x))) - (y_eachcycle(currentcycle, 1:length(values_y))));
w_eachcycle(currentcycle, 1:length(values_w)) = values_w;
end
I have also attached the variable data for 'qrs_i_raw' and 'maxamp' on which the rest of the code is based.
0 个评论
回答(1 个)
Mathieu NOE
2020-11-22
hello Cai
this little demo code for generating exactly 800 samples between each cycles
load('maxamp.mat');
y = maxamp;
samples = length(y);
Fs = 1e3;
dt = 1/Fs;
time = (0:samples-1)*dt;
[b,a] = butter(1,0.05,'high');
y_detrend = filtfilt(b,a,y);
threshold = 0.4*max(y_detrend);
[ind_crossing,x_crossing,y_crossing]= crossing_V6(y_detrend,time,threshold,'linear');
% keep only first crossing event
ind = (1:2:length(ind_crossing));
ind_crossing = ind_crossing(ind);
x_crossing = x_crossing(ind);
y_crossing = y_crossing(ind);
plot(time,y,'b',time,y_detrend,'r',x_crossing,y_crossing,'*k');
offset_samples = 30; % acts a a pre trigger shift to capture the beginning of each cycle
for ci =1:length(ind_crossing)-1
ind = find(time>=x_crossing(ci) & time<=x_crossing(ci+1));
ind = ind - offset_samples;
time_extract = time(ind);
new_time = linspace(time_extract(1),time_extract(end),800);
new_data = interp1(time(ind),y(ind),new_time);
figure(2),plot(new_time,new_data);hold on
end
hold off
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Multirate Signal Processing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!