如何检测一维信号中方差最大的峰值和区域?

信息处理 离散信号 信号分析 平滑
2021-12-24 10:23:30

我根本不是信号处理人员,所以希望我没有问一个明显的问题(如果我是,我会很感激任何有助于提供更多上下文的资源)。

我有一个一维向量,其中的值给出了某个位置的温度。我想找出变化最大的区域在哪里,然后标记这些区域以供将来采样。

我目前的方法是获取信号的梯度,然后将该梯度与某个窗口进行卷积,或者将过去的信号(及时)与当前的信号进行平均。这两种方法都是为了及时减少噪声和/或对一个特定信号的过度拟合。一旦我得到这个平滑的信号,我就会对其拟合一个高斯函数,并标出平均值的 4 个标准差以内的区域。(如果有多个峰值,希望平滑或卷积将使其足够平滑,以便高斯将捕获两个峰值,但这有时会失败,这就是为什么我正在寻找更强大的东西。对此的扩展将如果总体上是一个明智的想法,也可以尝试拟合多个高斯。)

这是我用来比较不同平滑窗口的快速图(原始信号是我正在使用的真实数据,通常只有一个大峰值,但可能有更多)。

原始信号和具有多个不同窗口的卷积图。

(此外,卷积似乎使峰值远离它们的实际位置。如果没有更好的解决方案,我该如何阻止这种情况发生?编辑: Peter K. 的评论帮助我解决了这个愚蠢的错误。)

但这是我刚刚提出的一种非常菜鸟的方法。有没有更好的办法?我要采样的地方显然是局部最大值附近的区域,但是定义局部最大值的含义似乎很棘手,而且并不总是能产生很好的结果。不过,总的来说,我希望在峰值区域周围连续采样,即如果我有两个峰值,一个在 5m,一个在 10m,我想在 2m 和 13m 之间进行采样,而不是在中间截断它. 值得注意的是,这些信号是时间的快照,所以也许我也可以以某种方式利用过去的信号?

编辑:根据@Phonon 的建议,我想我会添加有关该问题的更多细节。该信号实际上来自一个传感器,该传感器沿湖中的水柱进行采样(图表的 x 轴是深度,最高 40 米)。季节性变化和其他变量(如风速、湿度等)会在这个水柱中产生变化。我要做的是弄清楚如何使用最少的能量(传感器必须上下移动)来捕获最相关的信息。因此,需要找到最大梯度和围绕它的阈值进行采样的方法。但是,我想知道是否有更好的方法。我能想到的另一个方法是查看信号在不同深度随时间变化的程度,并对这些区域进行采样。我主要想知道是否已经存在一些标准方法来做这种事情。

1个回答

我会做以下事情:

  1. 点平均窗口创建平滑信号以估计局部平均值。N
  2. 在更平滑的信号上,我会找到一个对梯度的范数进行正则化的近似值。L1
  3. 在 (2) 个样本的输出上找到发生大跳跃的位置。