在 matlab 中,我们可以使用 filtfilt 函数过滤掉数据,该函数实现了前向和后向过滤技术,从而导致零相位。但是这个过滤器很难实时实现,因为它涉及反向过滤。
我想实时实现零相位的一阶高通或低通滤波器。我怎样才能做到这一点?
我已经在网上搜索了好几天,但无法从它开始获得任何线索!
提前致谢!
在 matlab 中,我们可以使用 filtfilt 函数过滤掉数据,该函数实现了前向和后向过滤技术,从而导致零相位。但是这个过滤器很难实时实现,因为它涉及反向过滤。
我想实时实现零相位的一阶高通或低通滤波器。我怎样才能做到这一点?
我已经在网上搜索了好几天,但无法从它开始获得任何线索!
提前致谢!
不可能实时执行零相位滤波器,因为零相位滤波器需要围绕零对称的滤波器系数。这意味着过滤器是非因果的,或者当前输出取决于未来的输入。这在实时情况下当然是不可能的,并且可以像在filtfilt
后处理期间一样被伪造。
您可能正在寻找的是线性相位滤波器。不要让名字迷惑你;这并不意味着滤波器会产生任何相位失真。这仅意味着对输出应用了时移。相对于频率的线性相移导致相对于时间的恒定偏移。所以基本上你的输出会从输入延迟一些恒定数量的样本(群延迟)。
因此,零相位滤波器和线性相位滤波器之间的唯一区别是线性相位滤波器输出是零相位输出的延迟版本。如果您需要保持输出与输入在时间上对齐,则可以通过跟踪群延迟来解决此延迟。
回复评论:
如果 FIR 滤波器的系数关于中心对称,则保证 FIR 滤波器是线性相位。MATLAB 可以使用fir1或firpm等函数轻松创建这些类型的滤波器。这些函数的文档中的示例应该向您展示如何使用它们。
(L-1)/2
线性相位 FIR 滤波器的群延迟是滤波器L
的长度。由于这一点和其他一些原因,我通常会选择一个奇数的滤波器长度,以便延迟与样本对齐,而不是在样本之间。这基本上意味着输出信号将从输入延迟(L-1)/2
采样。
实现实际的滤波过程基本上是输入与滤波器的离散卷积。这涉及反转滤波器系数,将它们乘以最近的L
输入样本,然后将这些结果相加以产生单个输出样本。然后引入一个新的输入样本并再次完成整个过程以产生另一个样本(在滑动窗口上相乘和求和)。你应该可以在网上找到一些卷积的示例代码。
这是执行 FIR 滤波的直接方法,但对于较长的滤波器,使用 FFT执行快速卷积可能更有效。这将更加难以正确处理,因此除非您谈论的是高采样率和长滤波器,否则我会采用直接方法。
“非因果”零相位滤波器加上足够量的附加延迟可以通过因果线性相位 FIR 滤波器来近似。这假设添加一些延迟符合您的系统要求。
在您的情况下,您可以采用前向+后向不对称(或非线性相位)滤波过程的脉冲响应,将该脉冲响应窗口化以使响应的长度有限,延迟有限长度内核,使其不需要“未来”样本,并将其用作 FIR 滤波器内核。您必须检查结果以查看您选择的窗口的长度和形状是否合适。由于该延迟所需的有限长度窗口,在选择延迟与滤波器质量时可能存在折衷。