为二阶导数平滑 3D 数据

信息处理 过滤器 采样 平滑 3d C++
2022-02-19 16:22:45

我不是信号处理专家,我在解决这个问题上的微弱尝试都失败了。

我有一个 C++ 应用程序,它被定期(及时)提供 3D 位置样本。样本通常是准确的,并且如果绘制,看起来非常平滑。但是,当计算二阶导数(以查看加速度)时,数据中偶尔/罕见的尖峰是不合理的。(我知道可能加速的一般范围。“罕见”是指在大约两个我们的数据中,我通常看到不到十几个超出可能性范围的尖峰。)我想做的越少越好尽可能地对数据进行处理,但要对其进行平滑处理以消除尖峰。

我的第一次尝试是在我们的数学库中使用卡尔曼滤波器。这消除了尖峰,但对数据的改变远远超过了我真正想要的,而且对于我需要的东西似乎过于严厉。

2D 数据似乎有很多选择,但我没有足够的信号处理背景来理解权衡或必然会很好地转换为 3D 数据。任何教育或建议将不胜感激!

1个回答

我一直发现“中值过滤器”,https: //en.wikipedia.org/wiki/Median_filter 对流数据有效。
下面是一个简短的直观描述;但是您必须采取措施确保将带宽限制为您期望的真实数据源。虽然您可能不知道噪声和尖峰的来源/频谱/时序(在这种情况下,中值滤波器实际上非常好),但您希望知道您正在寻找的信号和信号的特征。对于广泛的分析,恕我直言,沿着 PDF(概率分布函数)和光谱分析的路线:有一些 IEEE 文章;但我对大多数文章的分析是,它们在面对未知干扰时并没有真正有用。除了仅容纳真实信号带宽之外,如果没有充分的理由,我不会尝试 zs 域滤波。

------------------------ 中值滤波器缩写描述 基本上你将数据传递到移位寄存器并选择中间值。示例总是显示排序过程;但是由于您在轮班期间仅丢失一个值并仅获得一个值,因此您可以绕过每一步都进行完整排序话虽如此:如果峰值出现在输入数据中,那么这就是应该应用的地方;但如果尖峰是真正的“混蛋”(即出现在二阶导数中),那么这就是应该应用的地方。由于导数过程会放大高阶噪声,因此必须小心。如果我按照您的描述进行操作,我将对源数据、一阶差分和二阶差分(加速度)施加中值滤波器。然后检查结果;查看算法内部并了解丢弃了哪些数据!
这两种技术都会导致一些必须考虑的数据丢失。您可以进行插值,这有点贵,或者只是适应较低的采样率;说十分之一的样本总是会被扔掉。