【问题标题】:Patternmatching to detect signal edge?模式匹配检测信号边缘?
【发布时间】:2023-03-09 19:25:01
【问题描述】:

我有一个模拟信号,我想检测边缘/“波形”。要检测的波形有时与下面的第一个示例一样简单(简单的上升沿),但也更复杂(如前面带有较小“blob”的上升沿)。信号具有噪声和不需要的较小信号,因此像“匹配等级”0.0 到 1.0 这样的输出可以很好地设置阈值。 另一个要求是检测时间:算法必须在 1 个“上升时间”内“触发”,就像图像中的红色斑点圆圈一样。尽早,但不要在达到最大值之前。

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

我已阅读有关相关性和 FFT 的内容,但如果我理解正确的主题,这将仅适用于周期性波形(因为 FFT 会将信号分解为正弦/余弦部分)。

FFT 和相关性是正确的路径,还是有更好的方法满足我们的要求?如果我们的路径是正确的,是否有推荐的文献/搜索词以方便进入该主题?

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

Picture 3 中存在我们的问题: 我们当前的算法在 2565 秒检测到一个边缘,但我们想要在 2574 秒检测。 与要检测的边缘相比,第一个“斑点”始终出现在信号电平的 40% - 85% 左右。

【问题讨论】:

  • 在有效回答这个问题之前,必须:显示真实数据。我从经验中知道,真正的数据从不像 OP 草图。
  • 我建议你在那个地方扔一个小波包变换,看看你得到了什么,并尝试在输出中找到模式。 en.wikipedia.org/wiki/Wavelet_packet_decomposition 的底部链接到您可以尝试的 MATLAB、R、C++ 和 Java 中的现有实现。我建议避免过于平滑。一个 4 抽头的 Daubechies 小波可能会很好地工作。 (Haar 小波太粗糙 - 它不能很好地代表上升沿。)

标签: algorithm signal-processing


【解决方案1】:

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

您可以采取的一种方法是使用傅里叶级数之类的方法,但描述更加本地化,​​并且包含看起来像边缘的事物。谷歌“小波边缘检测”以了解更多相关信息。这将允许您从嘈杂的数据中提取各种形式。例如,人们使用它从图片中提取边缘,从录音中提取音素。小波是一个很大的话题,但您也许可以找到一个库,它可以做一些接近您想要的事情。

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

例如,您可以使用指数阻尼进行平滑处理。 next_average = 0.9 * average + 0.1 * next_value。 (更普遍的是(1 - x) * average + x * next_value。)这将使每个点看起来很像大约10个点的移动窗口的平均值。将现在的平均值与 100 点之前的平均值进行比较,您将能够非常可靠地发现上涨。再搞点乱七八糟的,你可能会发现其他组合。

您必须使用方程式和数据来找到适合您的目的的东西。

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多