使用全变差去噪来清理加速度计数据

信息处理 matlab 离散信号 噪音 去噪 全变
2021-12-29 00:15:45

我知道这可能是一个非常基本的问题,但我这样做是一种爱好,我找不到解决这个问题的方法。基本上我试图从我从加速度计读取的数据中消除一些噪音。这就是我想要实现的(取自 Total Variation Denoising (An MM algorithm)):

在此处输入图像描述

我在为加速度计数据选择正确的过滤器中阅读了Total Variaton Denoising 将满足我的需求。因此,我阅读了Wikipedia - 来自 Wikipedia 的 Total Variation Denoising文章,我认为我必须使用以下方程式之一:

在此处输入图像描述

在此处输入图像描述

但我不明白如何将其应用于我的信号。假设我有一组 x,y 点,如上图所示,我如何将方程应用于该数据?我实现了一些简单的低通和高通滤波器,如下所示:

gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];

但这可能太复杂了,我不知道从哪里开始或如何开始。我想用 Java 或 C 实现这个,所以 Matlab 不是一个选项(我已经看到很多 MatLab 实现这个)。我将不胜感激任何帮助引导我朝着正确的方向前进!

3个回答

除了总变异去噪之外,您还可以尝试第一种更简单的方法:中值滤波器您只需沿数据移动一个窗口,并将当前输入值替换为窗口中所有数据的中位数您只需要优化窗口长度(通过试验)。

顺便说一句,您复制到问题中的方程式适用于二维数据,但您的数据是一维的。

如果您的数据模型是 Piece Wise Smooth Signal,那么您应该使用 Total Variation 作为正则化。

让我们尝试比较 2 种去噪方法和 2 种不同的正则化(两者都适用于信号的导数):

Toal Variation:argminz12zb22+λDz1

Tikhonov Regularization:argminz12zb22+λDz22

在哪里D是有限差分法。

两者都很容易解决(对于小信号,即使是简单的 Sub Gradient Method 也能很好地解决)。

结果

在此处输入图像描述

在此处输入图像描述

可以看出,虽然 Tikhonov 正则化衰减了噪声(使用限制导数)但留下的信号不是 Piece Wise Smooth,但总变化正则化按预期工作并几乎完美地恢复了信号。

完整代码可在我的StackExchange Signal Processing Q14968 GitHub 存储库中找到。

好吧,除非它是一个更编程的问题(如何从 MATLAB 脚本转换为 C 代码),否则您可能会发现以下实现很有趣:点击,本文提出:A direct algorithm for 1D total variation denoising

祝你好运!