导数计算

信息处理 峰值检测
2021-12-21 17:45:39

我有一系列数据(单个数组)。如果我把这些数据绘制出来,我可以看到有多个峰值。但是,如果我放大一部分数据,我会发现存在大量噪音。

我喜欢使用很少的 CPU 时间和精力来检测数据中有多少峰值。我想检测这些峰的斜率(可能是陡峭或平滑的上升或下降)并查看斜率的数量以确定峰的数量。(每个峰 2 个斜率正负)

在存在噪声的情况下如何计算斜率的任何指针?

代码将进入嵌入式系统,内存有限,所以最好我喜欢实现不需要任何重要数据副本的东西。

1个回答

这取决于噪声的类型和信号的类型。如果您想要一个好的答案,请举一个例子。但是,也就是说,通常您可能希望对信号进行低通滤波。如果我是你,我会采用傅立叶功率谱来查看大部分噪声是否为高频,而我关心的信号主要在较低范围内。如果它们重叠,那么这就是生活。我将不得不考虑更多的事情。

在许多情况下,一种适用于噪声信号的低通滤波器是 Savitzky-Golay 滤波器。它在 Numerical Recipes 中有描述,对于 Python,Python Numpy Cookbook 中有一个函数。它只是一个带有小内核的卷积。您可以根据峰的宽度或其他特征选择窗口大小,宽度足以消除噪音,但不能比特征宽。它可以很小,比如五点,也可以更大,比如几十个,也许是一百个。

您还可以选择多项式阶数 - 通常我使用 2 或 4。阶数 2 适用于窗口较小、< 10 点或跨越不到半个周期左右(如果您的信号类似于正弦),而阶数 4 是更好地匹配扭曲的峰形,但喜欢有大约 9 个或更多的点。但很大程度上取决于噪声的形状和频率。

正如评论中的其他人所说,寻找导数可能不是最好的策略,但如果你无论如何都想找到导数,Savitzky-Golay 滤波器可以做到这一点 - 同时平滑和报告导数而不是信号。