Python/Scipy有firls( )替代方案吗(即加权的最小二乘FIR滤波器设计)?

3 投票
7 回答
5110 浏览
提问于 2025-04-15 21:10

我正在把代码从Matlab移植到Python,但在寻找firls( )这个函数的替代品时遇到了困难。这个函数是用来设计最小二乘线性相位有限脉冲响应(FIR)滤波器的。

我查看了scipy.signal,但里面没有找到合适的替代方案。当然,我已经成功替换了我的remez和freqz算法,这点还不错。

在一个博客上,我找到了一种没有加权的滤波器实现算法,但我需要的是带有权重的版本。

谢谢,David

7 个回答

1

显然,这篇帖子有点过时了,但也许对某些人来说仍然有趣:

我认为在Python中有两个和firls差不多的函数:

  • 你可以试试firwin函数,设置window='boxcar'。这和Matlab中的fir1函数很像,使用boxcar窗口的结果和firls的结果是一样的(或者至少非常相似)。
  • 你也可以尝试firwin2方法(频率采样方法,类似于Matlab中的fir2),同样使用window='boxcar'。

我尝试了一个来自Matlab firls参考的例子,得到了几乎完全相同的结果:

Matlab:

F = [0 0.3  0.4 0.6  0.7 0.9];
A = [0  1   0  0  0.5 0.5];
b = firls(24,F,A,'hilbert');

Python:

F = [0, 0.3,  0.4, 0.6,  0.7, 0.9, 1]
A = [0,  1,   0,  0,  0.5, 0.5, 0]
bb = sig.firwin2( 25, F,A, window='boxcar', antisymmetric=True )

我不得不把阶数增加到N = 25,并且还需要添加一个数据点(F = 1, A = 0),这是Python要求的;选项antisymmetric = True只在这个特殊情况下(Hilbert滤波器)才需要。

1

这篇 博客文章 里有代码,讲解了如何使用 scipy.signal 来实现FIR滤波器。

3

在Python中,firls的功能现在似乎已经作为信号处理包的一部分实现了,具体可以查看这个链接:https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.firls.html#scipy.signal.firls

我也同意@pev hall上面说的所有观点,特别是firls在很多情况下是最优的(比如在给定的抽头数量下优化信号与噪声的比率),而且他提到的不要使用矩形窗,这两者根本不一样!在设计传统的FIR滤波器时,firls通常比所有窗函数和频率采样的方法表现得更好。

根据我目前的理解,scipy.signal和Octave只支持奇数长度(偶数阶)的最小二乘滤波器。在这种情况下,当我需要偶数长度(类型II或类型IV滤波器)时,我会选择使用带有凯瑟窗的窗函数设计方法。我发现凯瑟窗的解决方案与最优的最小二乘解决方案非常接近。

撰写回答