在MatLab中去除信号平坦区域的最佳方法是什么?

时间:2017-04-05 14:06:06

标签: matlab signals

说我有一个看起来有点像这样的信号:enter image description here

我正在使用MatLab进行处理,我必须使用哪些功能来摆脱中间的平坦区域?是否有任何功能可以做到这一点,还是我需要自己编程?目前我只有一个空白功能,因为我不知道从哪里开始:

function  removala = removal(a, b)

end

是否有任何可以删除它的快速功能,或者我是否只需要搜索低于阈值的所有值并自行删除它们?作为参考,a和b是振幅点的矢量。

2 个答案:

答案 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')

enter image description here

答案 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;