导数计算


9

我有一系列数据(单个数组)。如果我将这些数据绘制并绘制,可以看到有多个峰。但是,如果我放大一部分数据,我会发现有很大的噪音。

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

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

该代码将进入嵌入式系统,内存有限,因此我最好实现不需要大量数据复制的操作。


1
您听起来像是在一家商店里

2
如果噪声的频率相对较高,则可以对数据进行低通滤波
Paul R

4
您可以发布一个或多个数据示例图吗?这将帮助我们了解其外观。峰值检测通常不通过导数估计来完成,因为计算信号的导数对噪声非常敏感(这是高通操作)。您可以利用感兴趣的信号的特征。同样,在正确检测到峰的概率与错误地声明确实不感兴趣的峰的概率之间始终存在折衷。哪个对您的应用程序更重要?
杰森R

2
如果您可以绘制一个图,那将很有帮助。
杰森R

1
您要检测峰,可能要搜索峰检测(请参阅dsp.stackexchange.com/questions/1302/peak-detection-approach)。
Geerten '02

Answers:


1

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.