Python/Scipy有firls( )替代方案吗(即加权的最小二乘FIR滤波器设计)?
我正在把代码从Matlab移植到Python,但在寻找firls( )这个函数的替代品时遇到了困难。这个函数是用来设计最小二乘线性相位有限脉冲响应(FIR)滤波器的。
我查看了scipy.signal,但里面没有找到合适的替代方案。当然,我已经成功替换了我的remez和freqz算法,这点还不错。
在一个博客上,我找到了一种没有加权的滤波器实现算法,但我需要的是带有权重的版本。
谢谢,David
7 个回答
显然,这篇帖子有点过时了,但也许对某些人来说仍然有趣:
我认为在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滤波器)才需要。
这篇 博客文章 里有代码,讲解了如何使用 scipy.signal
来实现FIR滤波器。
在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滤波器)时,我会选择使用带有凯瑟窗的窗函数设计方法。我发现凯瑟窗的解决方案与最优的最小二乘解决方案非常接近。