algorithm - 模式匹配检测信号边缘?

标签 algorithm signal-processing

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

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

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

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

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

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

Sample waveforms to detect

example of good data

example of bad data

最佳答案

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

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

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

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

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

关于algorithm - 模式匹配检测信号边缘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36557608/

相关文章:

algorithm - 哈希表 quadrtc。试探

c++ - 如何使随机损失位服从高斯分布

matlab - 如何使用 Matlab 提高 PSD 的分辨率

audio - 为什么我的二阶delta sigma编码器实现不起作用?

linux - Sox(瑞士军刀)使用什么算法来消除静音和噪音

c - 给定一个音频流,找到关门的时间(声压级计算?)

c++ - 优化转换算法

c++ - Char 数组上的累积按位或

java - 组织 K 内所有元素所需的最小交换

java - 依赖算法 - 找到要安装的最小包集