sam*_*sam 4 matlab filtering signal-processing filter
在matlab中,我们可以使用filtfilt函数来过滤掉实现前向和后向过滤技术的数据,从而产生零相位.但实时实现此过滤器很困难,因为它涉及反向过滤.
我想实现零相位的一阶高通或低通滤波器.我怎样才能实现这一目标?
我已经在网上搜索了几天,但无法从中获取任何线索!
提前致谢!
Jas*_*n B 24
由于零相位滤波器需要在零附近对称的滤波器系数,因此不可能实时执行零相位滤波器.这意味着过滤器是非因果的,或者当前输出取决于未来的输入.这当然在实时情况下是不可能的,并且可以像在filtfilt后处理期间那样伪造.
您可能正在寻找的是线性相位滤波器.不要让这个名字混淆你; 这并不意味着滤波器会产生任何相位失真.它只表示将时移应用于输出.相对于频率的线性相移导致相对于时间的恒定偏移.所以基本上你的输出会从输入延迟一些恒定的样本数(组延迟).
因此,零相位和线性相位滤波器之间的唯一区别在于线性相位滤波器输出是零相位输出的延迟版本.如果需要保持输出与输入保持一致,则可以通过跟踪群延迟来解决此延迟.
回复评论:
如果FIR滤波器的系数关于中心对称,则保证FIR滤波器为线性相位.MATLAB可以使用fir1或firpm等函数轻松创建这些类型的过滤器.这些函数文档中的示例应该向您展示如何使用它们.
的线性相位FIR滤波器的群时延是(L-1)/2其中L是滤波器的长度.由于这个和其他一些事情,我通常会选择一个奇数的滤波器长度,因此延迟与样本对齐,而不是在样本之间.这基本上意味着输出信号将通过(L-1)/2采样延迟输入.
实现实际的滤波过程基本上是输入与滤波器的离散卷积.这涉及反转滤波器系数,将它们乘以最近的L输入样本,并将这些结果相加以产生单个输出样本.然后引入新的输入样本并再次完成整个过程以产生另一个样本(在滑动窗口上进行多次和求和).您应该能够在网上找到一些卷积的示例代码.
这是执行FIR滤波的直接方式,但对于更长的滤波器,使用FFT 执行快速卷积可能更有效.这将是更难以正确的,所以除非你在谈论高采样率和长滤波器,我会采用直接方法.