matlab FAQ 描述了一种查找局部最大值的单行方法:

index = find( diff( sign( diff([0; x(:); 0]) ) ) < 0 );

但我相信这只有在数据或多或少平滑的情况下才有效。假设您的数据以小间隔上下跳跃,但仍然具有一些近似的局部最大值。您将如何找到这些点?您可以将向量分为 n 部分,并找到不在每个部分边缘的最大值,但应该有一个更优雅和更快的解决方案。

单行解决方案也很棒。

编辑: 我正在处理嘈杂的生物图像,我试图将其分成不同的部分。

有帮助吗?

解决方案

根据您的需要,过滤噪声数据通常很有帮助。看一眼 麦德菲尔1, ,或使用 转换 随着 FS特别版. 。在后一种方法中,您可能希望使用 CONV 的“相同”参数和 FSPECIAL 创建的“高斯”滤波器。

完成过滤后,将其输入最大值查找器。

编辑: 运行时复杂度

假设输入向量的长度为 X,滤波器内核的长度为 K。

中值过滤器可以通过运行插入排序来工作,所以它应该是 O(XK + K log K)。我没有看过源代码,其他实现也是可能的,但基本上应该是 O(XK)。

当 K 很小时,conv 使用直接的 O(X*K) 算法。当 X 和 K 几乎相同时,使用快速傅里叶变换会更快。该实现是 O(X log X + K log K)。Matlab 足够智能,可以根据输入大小自动选择正确的算法。

其他提示

我不确定您正在处理什么类型的数据,但这是我用来处理语音数据的方法,可以帮助您找到局部最大值。它使用信号处理工具箱中的三个函数: 希尔伯特, 黄油, , 和 过滤器过滤器.

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.

然后您将执行您的最大值查找 平滑数据. 。使用 HILBERT 首先在数据上创建正包络,然后 FILTFILT 使用 BUTTER 中的滤波器系数对数据包络进行低通滤波。

有关此处理如何工作的示例,下面是一些显示录制语音片段结果的图像。蓝线是原始语音信号,红线是包络(使用HILBERT得到),绿线是低通滤波结果。下图是第一张图的放大版本。

alt text

随机尝试一些东西:

这是我一开始的一个随意的想法......您可以尝试通过找到最大值中的最大值来重复该过程:

index = find(diff(sign(diff([0; x(:); 0]))) < 0);
maxIndex = index(find(diff(sign(diff([0; x(index); 0]))) < 0));

然而,根据信噪比,不清楚需要重复多少次才能获得您感兴趣的局部最大值。这只是一个随机的非过滤选项来尝试。=)

最大值发现:

以防万一您好奇,我见过的另一种单行最大值查找算法(除了您列出的算法之外)是:

index = find((x > [x(1) x(1:(end-1))]) & (x >= [x(2:end) x(end)]));

如果您的数据跳跃上下了很多,那么函数将有许多局部最大值。 所以我假设你不想找到所有的局部最大值。但是,什么是你的一个局部最大值的标准是什么?如果你有一个标准,则可以设计为一个舍姆或算法。

我现在猜测,也许你应该先申请一个低通滤波器,以您的数据,然后找到当地的最大值。虽然滤波后的局部最大值的位置可能不完全对应于那些之前。

有两种方法可以查看这样的问题。一个可以看看这个,主要是一个平滑的问题,采用了过滤工具来平滑数据,仅在之后使用一些各种插值的,也许是一个样条内插来内插。找到一个插值样条的局部最大值是一个很容易的事情。 (请注意,通常应使用真正的花键在这里,不是pchip插值。Pchip,当指定在interp1一个“立方”插值的方法中使用,不会准确地定位的两个数据点之间落入局部极小。)

另一种方法这样的问题是一个我倾向于选择。在这里,人们采用了最小二乘样条模型两者平滑数据,并产生一个近似值而不是插值的。这种最小二乘法的样条允许用户控制大量介绍他们的问题的知识转化为模型的优势。例如,经常是科学家或工程师拥有的信息,如单调性,对所研究的过程。这可以被内置到最小二乘样条模型。另外,相关的选项是使用平滑样条。他们也可以用正则内置了约束来构建。如果你有花工具箱,然后spap2会有一些实用的,以适应样条模型。然后fnmin会发现一个极小。 (A最大化容易从一个最小化码获得的。)

这采用过滤方法平滑方案通常是简单的时,数据点是等间隔的。不等间距可能推动最小二乘样条模型。在另一方面,结位置可以在最小二乘样条的问题。我在这一切的一点是要表明,这两种方法有可取之处,可以做成能产生可行的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top