在Matlab中求含噪数据的近似局部极大值

在Matlab中求含噪数据的近似局部极大值,matlab,maximize,noise,Matlab,Maximize,Noise,matlab常见问题解答介绍了一种查找局部最大值的单线方法: index = find( diff( sign( diff([0; x(:); 0]) ) ) < 0 ); index=find(diff(符号)(diff([0;x(:);0]))

matlab常见问题解答介绍了一种查找局部最大值的单线方法:

index = find( diff( sign( diff([0; x(:); 0]) ) ) < 0 );
index=find(diff(符号)(diff([0;x(:);0]))<0);
但我相信,只有在数据或多或少平稳的情况下,这一点才有效。假设您的数据在很小的时间间隔内上下跳跃,但仍然有一些近似的局部最大值。你将如何找到这些要点?您可以将向量分成n个部分,并在每个部分的边缘找到最大值,但应该有一个更优雅、更快的解决方案

单线解决方案也很好


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

我不确定您处理的是哪种类型的数据,但我使用了一种方法来处理语音数据,可以帮助您定位局部最大值。它使用信号处理工具箱中的三个函数:、和

然后在平滑数据上执行最大值查找。HILBERT的使用首先在数据上创建一个正包络,然后Filt使用从BUTTER到数据包络的低通滤波器系数

以下是一些显示录制语音片段结果的图像,以说明此处理的工作原理。蓝线是原始语音信号,红线是包络线(使用HILBERT获得),绿线是低通滤波结果。下图是第一幅的放大版本

随机尝试的东西:

这是我最初的一个随机想法。。。您可以尝试通过查找最大值中的最大值来重复此过程:

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

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


我想现在也许你应该先对数据应用低通滤波器,然后找到局部最大值。尽管过滤后的局部极大值位置可能与过滤前的位置不完全一致。

根据您的需要,过滤噪声数据通常是有帮助的。看看,或者一起使用。在后一种方法中,您可能希望使用CONV的“相同”参数和FSPECIAL创建的“高斯”滤波器

完成过滤后,将其输入maxima finder

编辑:运行时复杂性

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

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


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

有两种方法可以查看此类问题。我们可以将其主要视为一个平滑问题,使用过滤工具对数据进行平滑,然后使用各种插值,可能是插值样条线进行插值。找到插值样条曲线的局部最大值是一件很容易的事情。(请注意,此处通常应使用真实样条曲线,而不是pchip插值。在interp1中指定“立方”插值时使用的pchip方法将无法准确定位位于两个数据点之间的局部极小值。)

另一种解决此类问题的方法是我倾向于选择的方法。在这里,我们使用最小二乘样条曲线模型来平滑数据,并生成近似值而不是插值。这种最小二乘样条曲线的优点是允许用户进行大量的控制,以便将他们对问题的知识引入模型中。例如,科学家或工程师通常掌握有关研究过程的信息,如单调性。这可以构建到最小二乘样条曲线模型中。另一个相关选项是使用平滑样条线。它们也可以使用内置的正则化约束进行构建。如果您有样条线工具箱,则spap2将在拟合样条线模型方面具有一定的实用价值。然后fnmin将找到一个极小值。(从最小化代码中很容易获得最大值。)


当数据点间距相等时,采用滤波方法的平滑方案通常最简单。不等间距可能会推动最小二乘样条线模型。另一方面,节点位置可能是最小二乘样条曲线中的一个问题。我的观点是,这两种方法都有优点,可以产生可行的结果。

你太棒了!filtfilt是“零相位数字滤波”-这是否意味着它保证滤波数据中的高点是原始数据中的高点?请看我对这个问题的编辑。@Joe S:不。零相位滤波只是意味着,如果输入纯正弦波,输出将共享同一相位。filtfilt的工作原理是先在时间上向前过滤,然后在时间上向后过滤(这在实时信号处理中是无法做到的),以抵消低通滤波器造成的时间延迟。@Jason S:谢谢你回答Joe的问题。我没有太多的空闲时间上车,所以这个周末因为你已经更新了你的问题,说你正在处理图像,那么上面的最大值查找方程(更具体地针对向量)可能不适合你。如果您有权访问,我建议您查看MATLAB中的图像处理工具箱。那里可能会有一些行动来帮助你;只需在MATLAB中键入“帮助图像”即可查看函数列表。
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)]));