模式匹配检测信号边缘?

Patternmatching to detect signal edge?

我有一个模拟信号,我想检测边缘/'waveforms'。要检测的波形有时与下面的第一个示例(简单的上升沿)一样简单,但也更复杂(如前一个较小 'blob' 的上升沿)。信号有噪声和不需要的较小信号,因此 'matching grade' 0.0 到 1.0 之类的输出很适合设置阈值。 另一个要求是检测时间:算法必须 'trigger' 在 1 'rise time' 以内,就像图像中的红色斑点圆圈一样。尽可能早,但不要在达到最大值之前。

一切都将在STM32 ARM控制器上执行,信号每秒100点。侧翼上升沿需要 0.5 - 2 秒,因此 'look at' 的数据范围约为 250 - 500 个数据点。

我读过相关性和 FFT,但如果我理解正确,这将仅适用于周期波形(因为 FFT 会将信号分解为 sin/cos 个部分)。

FFT 和相关性是否是正确的路径,或者是否有更好的方法满足我们的要求?如果我们的路径是正确的,是否有推荐的 literature/search 术语以便轻松进入该主题?

编辑: 我添加了真实数据的例子。 在 Picture 2 中,您可以看到一个易于检测的边缘。使用基本的边缘检测,我们对这些边缘没有任何问题。

Picture 3 是我们的问题所在: 我们当前的算法在 2565 秒检测边缘,但我们希望在 2574 秒检测。 与要检测的边缘相比,第一个 'blob' 总是出现在大约 40% - 85% 的信号电平中。

傅里叶级数是一个糟糕的选择,你说的完全正确,因为你试图写下没有边的数据描述,然后在该描述中发现边。效果不佳。

您可以采用的一种方法是执行类似于傅里叶级数的方法,但使用更本地化的描述并包括看起来像边缘的东西。 Google "wavelet edge detection" 了解更多相关信息。这将允许您从嘈杂的数据中提取各种形式。例如,人们用它来从图片中提取边缘,从录音中提取音素。小波是一个很大的话题,但您也许可以找到一个库来做一些接近您想要的事情。

但对于像这样的简单一维问题,您可以简单地应用平滑操作,然后寻找感兴趣的形状。你的平滑操作越好,你能容忍的噪音就越大,但也就越难看清形状。

例如,您可以对平滑进行指数阻尼。 next_average = 0.9 * average + 0.1 * next_value。 (更一般地说 (1 - x) * average + x * next_value。)这将使每个点看起来很像移动 window 大约 10 个点的平均值。将现在的平均值与 100 点之前的平均值进行比较,您将能够非常可靠地发现上涨。再多混一些,您可能会发现其他组合。

您必须仔细研究方程式和您的数据,才能找到适合您目的的东西。