2012-08-31 109 views
3

在matlab中,我们可以使用filtfilt函数来过滤数据,这些数据实现了导致零相位的前向和后向滤波技术。但由于涉及后向过滤,因此很难实时实现此过滤器。零相位实时数字滤波器

我想要实现零相位的一阶高通或低通滤波器。我怎样才能做到这一点?

我已经在网上搜索了几天,但无法得到任何线索开始吧!

在此先感谢!

回答

20

由于零相位滤波器要求滤波器系数是零对称的,因此不可能实时执行零相位滤波器。这意味着过滤器是非因果的,或者当前的输出取决于未来的输入。当然这在实时情况下是不可能的,并且可能在后处理期间如filtfilt那样伪造。

您可能正在寻找的是linear phase过滤器。不要让名字迷惑你;这并不意味着滤波器会产生任何相位失真。这只意味着时间偏移应用于输出。相对于频率的线性相移导致相对于时间的恒定偏移。所以基本上你的输出会被延迟一些不变的样本数(group delay)。

因此,零相位和线性相位滤波器之间的唯一区别是线性相位滤波器输出是零相位输出的延迟版本。如果您需要保持输出与输入的时间保持一致,则可以通过跟踪群延迟来解决此延迟问题。

响应评论:

FIR滤波器保证是线性相位,如果它们的系数是对称于中心。 MATLAB可以轻松创建这些类型的滤波器,其功能如fir1firpm。这些函数的文档中的示例应该向您展示如何使用它们。

线性相位FIR滤波器的群延迟为(L-1)/2,其中L是滤波器的长度。由于这个和其他一些事情,我通常会选择一个奇数的滤波器长度,所以延迟与样本对齐,而不是在样本之间。这基本上意味着输出信号将从输入延迟(L-1)/2采样。

实现实际的过滤过程基本上是带有过滤器的输入的discrete convolution。这包括反转滤波器系数,将它们乘以最近的输入采样,并将这些结果相加以产生单个输出采样。然后引入一个新的输入样本,并且整个过程再次完成以产生另一个样本(在滑动窗口上进行多项式和求和)。你应该能够在网上找到一些卷积的示例代码。

这是执行FIR滤波的直接方式,但对于较长的滤波器,使用FFT执行fast convolution可能更有效。这样做会变得更加困难,所以除非你在谈论高采样率和长滤波器,否则我会直接采用直接方法。

+3

补偿因果关系... – Throwback1986

+0

谢谢你的宝贵解释!但是如何实时实现它?如何保持团队延迟的轨迹?这种性质是否有任何参考或以前完成的例子?更重要的是,我们如何使用Matlab工具来生成实时线性相位低通/高通滤波器的系数?谢谢!! – sam

+0

@ Throwback1986 - 请帮帮我! – sam

1

“因果”零相滤波器加上足够数量的附加延迟可以通过因果线性相位FIR滤波器进行近似。这假设增加一些延迟符合您的系统要求。在你的情况下,你可以采用正向+反向非对称(或非线性相位)滤波过程的脉冲响应,使脉冲响应使得响应长度有限的窗口,延迟有限长度的内核,使它不需要“未来”样本,并将其用作FIR滤波器内核。你将不得不检查结果,看看你选择的窗口是否适合长度和形状。由于该延迟所需的有限长度窗口,在选择延迟与滤波器质量之间可能存在折衷。

+0

我可以使用高端微控制器实现这种类型的过滤器以实时过滤数据吗?你有没有任何引用遵循上面提到的类似方法? – sam

+0

hotpaw2你能帮我吗? :d – sam