Matlab 如何为不同数量的样本重新采样数据输入信号?

Matlab 如何为不同数量的样本重新采样数据输入信号?,matlab,signals,Matlab,Signals,我正在MacOS上使用MatlabR2020A。我有一个采样频率为1kHz的ECG信号。由于循环长度不同,每个循环的样本数量也不同。但是,我希望有一个数组,每个循环有相同数量的样本(大约800个),这样无论原始样本点的数量如何,这800个样本点都会自动拟合到原始样本点。我知道重采样功能允许以输入信号频率的一小部分进行重采样,但我不确定这将如何帮助我实现目标,因为我想对固定数量的点进行重采样。 如果有任何建议,我将不胜感激。提前谢谢 这是我的密码: % Delimit cycles in orig

我正在MacOS上使用MatlabR2020A。我有一个采样频率为1kHz的ECG信号。由于循环长度不同,每个循环的样本数量也不同。但是,我希望有一个数组,每个循环有相同数量的样本(大约800个),这样无论原始样本点的数量如何,这800个样本点都会自动拟合到原始样本点。我知道重采样功能允许以输入信号频率的一小部分进行重采样,但我不确定这将如何帮助我实现目标,因为我想对固定数量的点进行重采样。 如果有任何建议,我将不胜感激。提前谢谢

这是我的密码:

% 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
以下是相关变量:


要对单个周期的信号进行重采样,使其长度达到800点/采样,
resample()
函数可与参数
800
长度(随机循环)
一起使用。这里我任意使用了sinc信号。
resample()
函数将根据原始信号中可用采样点的数量进行插值(上采样)或抽取(下采样)。我会首先将你的信号划分为不同的周期,应用这种类型的重采样,然后连接重采样的分量,生成完整的重采样ECG信号


使用MATLAB R2019b运行

,没有任何周期开始和结束的指标,我认为这是一项困难的任务。但是,如果你能将信号划分成不同的周期,那么对每个周期进行重采样/降采样就不会有很多问题。嗨,MichaelTr7,我创建了一个数组,其中包含周期编号的索引和每个周期内的采样点。然而,我不知道如何改变样本数量,以便每个周期都有一个统一的数量。我将非常感谢任何关于如何做到这一点的建议。谢谢如果您想了解详细信息,可以将您创建的此阵列和ECG数据阵列作为
.mat
文件上传。否则,我可以给你一个广义的方法。嗨,非常感谢。现在请查找我的数据文件的附加超链接。您是否也可以将数组包含在cycles数据中?我现在已经包含了它,它被称为“cyclepointsarray”。但是请注意,它在某些循环的采样数不如其他循环的采样数多的位置包含零。我计划在一个周期一个周期的基础上对点重新采样,这样就不需要在以后的阶段删除零点和重塑阵列。实际上,我自己也尝试过你的方法,效果非常好,非常感谢!
Random_Cycle = sinc(-2*pi:0.5:2*pi);
subplot(1,2,1); stem(Random_Cycle);
title("Number of Samples: " + num2str(length(Random_Cycle)));

Resampled_Signal = resample(Random_Cycle,800,length(Random_Cycle));
subplot(1,2,2); stem(Resampled_Signal);
title("Number of Samples: " + num2str(length(Resampled_Signal)));