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