matlab设计零相位滤波器,零相位实时数字滤波器

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

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

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

响应评论:

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

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

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

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

你可能感兴趣的:(matlab设计零相位滤波器)