C# 过滤连续数据,如何消除瞬变?

C# 过滤连续数据,如何消除瞬变?,c#,filtering,signal-processing,C#,Filtering,Signal Processing,我正在编写一个C#应用程序,它可以从Wii遥控器以大约100Hz的频率连续获取加速度计数据。该数据到达时存储在列表中(每个轴一个列表)。 我有一个计时器,它每秒钟触发一次(因此当它触发包含约100个元素的列表时),它会对列表应用一个低通滤波器(使用信号处理Math.NET Neodynm库),然后将数据写入一个文件,并清除下一批数据的所有列表 现在的问题是,输出的过滤器数据在开始时有很大的波动,每次应用过滤器时都会发生这种情况,因此每隔一秒钟,数据中就会出现一些错误值,这使得它完全无用 我如何着

我正在编写一个C#应用程序,它可以从Wii遥控器以大约100Hz的频率连续获取加速度计数据。该数据到达时存储在列表中(每个轴一个列表)。 我有一个计时器,它每秒钟触发一次(因此当它触发包含约100个元素的列表时),它会对列表应用一个低通滤波器(使用信号处理Math.NET Neodynm库),然后将数据写入一个文件,并清除下一批数据的所有列表

现在的问题是,输出的过滤器数据在开始时有很大的波动,每次应用过滤器时都会发生这种情况,因此每隔一秒钟,数据中就会出现一些错误值,这使得它完全无用

我如何着手解决这个问题,使过滤器仍然只应用每一秒,但瞬变可以避免。我怀疑这可以通过重叠窗口实现,但不太确定如何实现

这是我的过滤器的代码,该代码每秒执行一次:

 listXLow = MathNet.SignalProcessing.Filter.OnlineFilter.CreateLowpass(MathNet.SignalProcessing.Filter.ImpulseResponse.Finite, 100, 1, 30).ProcessSamples(listX.ToArray()).ToList();
在参数中,在脉冲响应.Finite之后,100是采样率,1是截止频率,30是滤波器阶数

下面是显示我的I/O外观的屏幕截图。输入数据是第一个图形,第二个图形显示过滤器输出:

FIR滤波器在阶数长度上具有瞬态响应。对于30个瞬态长度,您可以保存前100个样本中的最后30个样本,并将其挂起到当前数据,然后在过滤后丢弃该瞬态(130个过滤样本中的前30个)。

好的,问题解决了,将此问题留给面临类似问题的任何其他人,如hotpaw2所述,这可以通过重叠窗口来实现,但我发现我根本没有正确使用Math.NET Neodynm库中的过滤器

问题是每次启动计时器时都会创建一个新的过滤器,我通过创建一个全局过滤器对象,并在计时器滴答声事件中每次调用它的ProcessSamples方法来解决这个问题

现在,在程序开始时创建一个过滤器对象:

  MathNet.SignalProcessing.Filter.OnlineFilter XlowFilter = MathNet.SignalProcessing.Filter.FIR.OnlineFirFilter.CreateLowpass(MathNet.SignalProcessing.Filter.ImpulseResponse.Finite, 100, 1.5, 30);
并且在计时器滴答声事件中仅调用过滤器的一个方法:

 listXLow = XlowFilter.ProcessSamples(listX.ToArray()).ToList();

听起来你用错了过滤API-给我们看一些代码!这是从零开始的过滤器得到的伪影,需要几个样本才能达到最终值。您需要一个移动平均样式的过滤器或更好的方法来维护过滤器的状态。所以你肯定不想每秒调用CreateLowpass()。那么重叠窗口方法(使一个数据块的最后30个元素成为另一个数据块的前30个元素)会起作用吗?很好地包含了graph。这让问题变得显而易见。