【发布时间】:2012-12-20 12:02:40
【问题描述】:
我正在编写一个 C# 应用程序,它以 ~100Hz 的速率从 Wii 遥控器连续获取加速度计数据。此数据在到达时存储在一个列表中(每个轴一个列表)。 我有一个计时器,它每隔一秒触发一次,(所以当它触发时列表包含~100 个元素),然后它对列表应用一个低通滤波器(使用信号处理 Math.NET Neodym 库),并写入将数据保存到文件中,并清除下一批数据的所有列表。
现在的问题是,输出的过滤器数据在开始时波动很大,每次应用过滤器时都会发生这种情况,所以每隔一秒,我的数据中就会出现一些错误值,这使得它完全没用。
我该如何解决这个问题,以便过滤器仍然仅每隔一秒应用一次,但可以避免瞬变。我怀疑这可以使用重叠窗口来完成,但不太确定如何?
这是我的过滤器的代码,此代码每秒执行一次:
listXLow = MathNet.SignalProcessing.Filter.OnlineFilter.CreateLowpass(MathNet.SignalProcessing.Filter.ImpulseResponse.Finite, 100, 1, 30).ProcessSamples(listX.ToArray()).ToList();
在参数中,紧跟在 ImpulseResponse.Finite 之后,100 是采样率,1 是截止频率,30 是滤波器阶数。
这是显示我的 I/O 外观的屏幕截图。输入数据是第一个图,第二个显示过滤器输出:
【问题讨论】:
-
听起来您使用过滤器 API 错误 - 给我们看一些代码!
-
这是您从过滤器中获得的工件,从零开始,需要多个样本才能达到最终值。您需要一个移动平均样式的过滤器或更好的方法来维护过滤器的状态。所以你肯定不想每秒都调用 CreateLowpass()。
-
那么重叠窗口方法(使一个数据的最后 30 个元素“块”另一个数据的前 30 个)是否有效?
-
很好地包含了图表。确实使问题显而易见。
标签: c# filtering signal-processing