Python/Scipy是否有firls()替换(即加权、最小二乘、FIR滤波器设计)?
我正在将代码从Matlab移植到Python,但很难找到firls()例程的替代品。它用于最小二乘线性相位有限脉冲响应(FIR)滤波器设计 我看了看scipy.signal,那里没有任何东西能起作用。当然,我可以替换我的remez和freqz算法,所以这很好 在一个博客上,我发现了一个算法,它实现了这个过滤器而不需要加权,但我需要一个加权算法Python/Scipy是否有firls()替换(即加权、最小二乘、FIR滤波器设计)?,python,algorithm,math,matlab,digital-filter,Python,Algorithm,Math,Matlab,Digital Filter,我正在将代码从Matlab移植到Python,但很难找到firls()例程的替代品。它用于最小二乘线性相位有限脉冲响应(FIR)滤波器设计 我看了看scipy.signal,那里没有任何东西能起作用。当然,我可以替换我的remez和freqz算法,所以这很好 在一个博客上,我发现了一个算法,它实现了这个过滤器而不需要加权,但我需要一个加权算法 谢谢,David,您似乎不太可能找到用Python编写的确切的搜索内容,但也许Matlab函数的帮助页面给出或引用了算法的描述?这包含了详细说明如何使用s
谢谢,David,您似乎不太可能找到用Python编写的确切的搜索内容,但也许Matlab函数的帮助页面给出或引用了算法的描述?这包含了详细说明如何使用
scipy.signal
实现FIR滤波器的代码 显然,这篇文章有些过时,但对一些人来说可能仍然很有趣:
我认为Python中的FIRL有两个近似等价物:
- 您可以使用window='boxcar'尝试firwin功能。这类似于Matlab,其中带有boxcar车窗的fir1与FIRL提供相同(?或至少非常相似的结果)
- 您还可以再次使用window='boxcar'尝试firwin2方法(频率采样方法,类似于Matlab中的fir2)
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,还必须添加Python坚持的另一个数据点(F=1,A=0);选项antisymetric=True仅在这种特殊情况下才是必需的(希尔伯特滤波器)这篇文章是对 您可以使用window='boxcar'尝试firwin函数 不要使用boxcar,这意味着根本没有窗口(这是理想的,但只有在无限多个乘法器的情况下才能“理想地”工作——时间上为sinc)。使用窗口的全部好处是减少获得良好阻带衰减所需的乘法器数量。看 比较过滤器时,请使用dB/log刻度 Scipy没有firls(FIR最小二乘滤波器)功能是一个很大的限制(因为它在许多情况下生成最佳滤波器) 雷米兹有它的位置,但当你试图获得最好的结果(而不仅仅是满足一些经理的要求)时,平滚是一个真正的杀手。() 如果您正在使用python(或需要使用某些窗口),我建议使用kasiar窗口,它可以获得非常好的结果,并且可以根据衰减与转换与乘法器的要求轻松调整()。它的性能不如firls好,但它的优点是快速且易于计算(如果不存储系数,那就太好了)。我在中找到了一个firls()实现 为使其正常工作而进行的小改动:
波段,所需,权重=阵列(波段),阵列(所需),阵列(权重)
如果重量=无:重量=一(长度(带)/2)
python中的firls等价物现在似乎是作为信号包的一部分实现的:
此外,我同意@pev hall在上文中所述的一切,尤其是firls在许多情况下是如何最佳的(例如,当针对给定数量的抽头优化整体信噪比时),并且如他所述,不使用boxcar车窗,它们根本不等效!在设计传统FIR滤波器时,firls通常优于所有窗口和频率采样方法进行滤波器设计。自2016年7月以来,scipy包括firls的实现,正如。好吧,这是一篇有趣的博客文章,但并不完全是我想要的。我看到了firwin()函数,但它没有能力以核磁共振成像所需的方式表达频率响应。。。我不希望重新发明轮子,但看起来我更有可能需要这样做。谢谢,请查看更多回复,尤其是@Pev Hall。这些不是数字滤波器实现的最佳实践,性能相对较差(如建议的,应在对数范围内进行比较)。