滤波信号消除相邻峰值matlab

时间:2018-05-07 07:45:07

标签: matlab filtering threshold

我想过滤一个非常嘈杂的信号,以便获得超过某个阈值的峰值数量。这是我使用的matlab代码:

thresh = 3;  % Specify threshold
x = VarName1; 
% Essentially need to pick out values which exceed threshold with the condition that the previous value  
% needs to be below the threshold
idxl = x>=thresh;
idxl(1) = 0;
idx = find(idxl);
yest = x(idx-1)<thresh; 
idx(yest)  % Final output

但是我得到的值太高了,事实上,当我在图中找到峰值时,它还会识别超出阈值的相邻值,如附图所示。但我想在每次超过阈值时计算一个峰值。你知道我怎么能这样做吗? image_matlab

2 个答案:

答案 0 :(得分:1)

假设您有峰值的索引,那么为了计算它们,您将必须对它们进行分段。通过获取指数之间的差异然后应用一些阈值,即每个峰值之间的最小距离,可以最轻松地完成此任务。

peaks = unique([randi([100,110],1,randi(10)),randi([150,160],1,randi(10)),randi([210,220],1,randi(10))]); %Create some peaks
thresh = 20; %Set a threshold
nextPeak = diff([-inf,peaks])>thresh; % Find peak seperators

如果您对峰的数量感兴趣,您可以计算分离器的数量,例如

NumPeaks = sum(nextPeak);

如果您对峰的位置感兴趣,您必须决定如何定义“峰”,它是峰的中心点还是最大值,e.t.c。

在所有情况下,您都必须经历峰值数

nextPeakIdx = [find(nextPeak),length(peaks)+1];
for i = 1:length(nextPeakIdx)-1
    peakIdx = peaks(nextPeakIdx(i):(nextPeakIdx(i+1)-1));
    %Decide which index to keep
end

答案 1 :(得分:1)

Matlab有一个findpeaks()函数可以在你的情况下工作。特别是,您可以将MinPeakDistance参数设置为智能量,以仅检测所需的峰值。

% Build some noisy signal
signal = peaks;  
signal = repmat(signal(18,:) , 1,3);
noisy_signal = signal + randn(1,3*49).*0.5;

% Find peaks and plot them
findpeaks(noisy_signal , 'MinPeakDistance' , 15);
hold on;
plot(signal)

这是我得到的,黄线是原始信号,蓝色是噪声信号,箭头指向检测到的峰值(当然在噪声信号中)。 您只需调整MinPeakDistance参数即可。

enter image description here