我想过滤一个非常嘈杂的信号,以便获得超过某个阈值的峰值数量。这是我使用的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
答案 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参数即可。