我不确定您处理的是哪种类型的数据,但这是我用来处理语音数据的一种方法,可以帮助您找到局部最大值。它使用信号处理工具箱中的三个函数:HILBERT、BUTTER 和 FILTFILT。
data = (...the waveform of noisy data...);
Fs = (...the sampling rate of the data...);
[b,a] = butter(5,20/(Fs/2),'low'); % Create a low-pass butterworth filter;
% adjust the values as needed.
smoothData = filtfilt(b,a,abs(hilbert(data))); % Apply a hilbert transform
% and filter the data.
然后您将在 smoothData 上执行最大值查找。使用 HILBERT 首先在数据上创建一个正包络,然后 FILTFILT 使用来自 BUTTER 的滤波器系数对数据包络进行低通滤波。
有关此处理工作原理的示例,这里有一些图像显示了一段录制语音的结果。蓝线是原始语音信号,红线是包络(使用 HILBERT 获得),绿线是低通滤波结果。下图是第一张的放大图。
随机尝试:
这是我一开始的一个随机想法...您可以尝试通过找到最大值的最大值来重复该过程:
index = find(diff(sign(diff([0; x(:); 0]))) < 0);
maxIndex = index(find(diff(sign(diff([0; x(index); 0]))) < 0));
但是,根据信噪比,不清楚需要重复多少次才能获得您感兴趣的局部最大值。这只是一个随机的非过滤选项。 =)
MAXIMA 发现:
以防你好奇,我见过的另一种单线最大值发现算法(除了你列出的那个)是:
index = find((x > [x(1) x(1:(end-1))]) & (x >= [x(2:end) x(end)]));