我正在使用MatLab进行处理,我必须使用哪些功能来摆脱中间的平坦区域?是否有任何功能可以做到这一点,还是我需要自己编程?目前我只有一个空白功能,因为我不知道从哪里开始:
function removala = removal(a, b)
end
是否有任何可以删除它的快速功能,或者我是否只需要搜索低于阈值的所有值并自行删除它们?作为参考,a和b是振幅点的矢量。
答案 0 :(得分:1)
使用findpeaks
:
% generating signal
x = 1:0.1:10;
y = rand(size(x))*0.5;
y([5,25,84]) = [6,-5.5,7.5];
z = y;
thresh = 0.75; % height threshold
% find peaks
[pks,locs] = findpeaks(z,'MinPeakProminence',thresh);
% remove signal noise between peaks
for ii = 1:length(locs)-1
zz = z(locs(ii)+1:locs(ii+1)-1);
zz(abs(zz) < thresh) = 0;
z(locs(ii)+1:locs(ii+1)-1) = zz;
end
% plot
plot(x,y);
hold on
plot(x,z);
plot(x(locs),pks,'og');
legend('original signal','modified signal','peaks')
答案 1 :(得分:1)
您可能想要移除绝对功率小于某个阈值的信号。 因此,函数的两个输入将是原始信号和阈值。该函数将输出变量“cleanSignal”
function cleanSignal = removal(rawSignal,threshold)
最简单的实现。删除低于阈值的数据。如果rawSignal是一个矩阵,结果变量将是一个连接所有超过阈值的历元的向量。
ind = abs(rawSignal)<threshold;
rawSignal(ind) = [];
cleanSignal = rawSignal;
这可能不是您想要的行为,因为您希望保留rawSignal矩阵的原始形状。所以你可以“低于”阈值以下的值。
ind = abs(rawSignal)<threshold;
rawSignal(ind) = nan;
cleanSignal = rawSignal;
end
请注意,这并不能真正消除平坦信号,而是接近0的信号。 如果你真的想要移除平坦信号,你应该使用
ind = abs(diff(rawSignal))<threshold;