零相位实时数字滤波器
Posted
技术标签:
【中文标题】零相位实时数字滤波器【英文标题】:Real time digital filter with zero phase 【发布时间】:2012-08-25 20:21:35 【问题描述】:在 matlab 中,我们可以使用 filtfilt 函数过滤掉数据,该函数实现了前向和后向过滤技术,从而导致零相位。但是这个过滤器很难实时实现,因为它涉及到反向过滤。
我想实时实现零相位的一阶高通或低通滤波器。我怎样才能做到这一点?
我已经在网上搜索了几天,但无法找到任何开始的线索!
提前致谢!
【问题讨论】:
【参考方案1】:不可能实时执行零相位滤波器,因为零相位滤波器需要围绕零对称的滤波器系数。这意味着过滤器是非因果的,或者当前输出取决于未来的输入。这在实时情况下当然是不可能的,并且可以在后期处理过程中像filtfilt
一样伪造。
您可能正在寻找的是linear phase 过滤器。不要让名字迷惑你;这并不意味着滤波器会产生任何相位失真。这仅意味着将时移应用于输出。相对于频率的线性相移导致相对于时间的恒定偏移。所以基本上你的输出会从输入延迟一些恒定数量的样本(group delay)。
因此,零相位滤波器和线性相位滤波器之间的唯一区别是线性相位滤波器输出是零相位输出的延迟版本。如果您需要保持输出与输入在时间上对齐,则可以通过跟踪群延迟来解决此延迟。
对评论的回应:
如果 FIR 滤波器的系数关于中心对称,则可以保证它们是线性相位。 MATLAB 可以使用fir1 或firpm 等函数轻松创建这些类型的过滤器。这些函数的文档中的示例应该向您展示如何使用它们。
线性相位 FIR 滤波器的群延迟为(L-1)/2
,其中L
是滤波器的长度。由于这一点和其他一些原因,我通常会选择一个奇数的滤波器长度,以便延迟与样本对齐,而不是在样本之间。这基本上意味着输出信号将比输入延迟(L-1)/2
个样本。
实现实际的过滤过程基本上是discrete convolution的输入加上过滤器。这涉及反转滤波器系数,将它们乘以最近的L
输入样本,然后将这些结果相加以产生单个输出样本。然后引入一个新的输入样本并再次完成整个过程以产生另一个样本(在滑动窗口上相乘和求和)。你应该可以在网上找到一些卷积的示例代码。
这是执行 FIR 滤波的直接方法,但对于较长的滤波器,使用 FFT 执行 fast convolution 可能更有效。这将更加难以正确处理,因此除非您谈论的是高采样率和长过滤器,否则我会采用直接方法。
【讨论】:
感谢您的宝贵解释!!但是如何实时实现呢?如何跟踪群时延?有没有这种性质的参考资料或以前完成的例子?更重要的是,我们如何使用 Matlab 工具生成实时线性相位低通/高通滤波器的系数?谢谢!! @Throwback1986 - 请帮帮我!【参考方案2】:“非因果”零相位滤波器加上足够量的附加延迟可以近似为因果线性相位 FIR 滤波器。这假设添加一些延迟符合您的系统要求。
在您的情况下,您可以采用前向+后向不对称(或非线性相位)滤波过程的脉冲响应,将该脉冲响应窗口化以使响应的长度有限,延迟有限长度内核,使其不会不需要“未来”样本,并将其用作 FIR 滤波器内核。您必须检查结果以查看您选择的窗口的长度和形状是否合适。由于延迟需要有限长度的窗口,因此在选择延迟与滤波器质量时可能需要权衡取舍。
【讨论】:
我可以使用高端微控制器实现这种类型的过滤器来实时过滤数据吗?您是否有任何参考与您上面提到的类似方法?以上是关于零相位实时数字滤波器的主要内容,如果未能解决你的问题,请参考以下文章