Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/Scipy是否有firls()替换(即加权、最小二乘、FIR滤波器设计)?_Python_Algorithm_Math_Matlab_Digital Filter - Fatal编程技术网

Python/Scipy是否有firls()替换(即加权、最小二乘、FIR滤波器设计)?

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

我正在将代码从Matlab移植到Python,但很难找到firls()例程的替代品。它用于最小二乘线性相位有限脉冲响应(FIR)滤波器设计

我看了看scipy.signal,那里没有任何东西能起作用。当然,我可以替换我的remez和freqz算法,所以这很好

在一个博客上,我发现了一个算法,它实现了这个过滤器而不需要加权,但我需要一个加权算法


谢谢,David,您似乎不太可能找到用Python编写的确切的搜索内容,但也许Matlab函数的帮助页面给出或引用了算法的描述?

这包含了详细说明如何使用
scipy.signal
实现FIR滤波器的代码

显然,这篇文章有些过时,但对一些人来说可能仍然很有趣:

我认为Python中的FIRL有两个近似等价物:

  • 您可以使用window='boxcar'尝试firwin功能。这类似于Matlab,其中带有boxcar车窗的fir1与FIRL提供相同(?或至少非常相似的结果)
  • 您还可以再次使用window='boxcar'尝试firwin2方法(频率采样方法,类似于Matlab中的fir2)
我确实尝试了一个例子,并取得了几乎相同的结果:

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,还必须添加Python坚持的另一个数据点(F=1,A=0);选项antisymetric=True仅在这种特殊情况下才是必需的(希尔伯特滤波器)

这篇文章是对

您可以使用window='boxcar'尝试firwin函数

不要使用boxcar,这意味着根本没有窗口(这是理想的,但只有在无限多个乘法器的情况下才能“理想地”工作——时间上为sinc)。使用窗口的全部好处是减少获得良好阻带衰减所需的乘法器数量。看

比较过滤器时,请使用dB/log刻度

Scipy没有firls(FIR最小二乘滤波器)功能是一个很大的限制(因为它在许多情况下生成最佳滤波器)

雷米兹有它的位置,但当你试图获得最好的结果(而不仅仅是满足一些经理的要求)时,平滚是一个真正的杀手。()

如果您正在使用python(或需要使用某些窗口),我建议使用kasiar窗口,它可以获得非常好的结果,并且可以根据衰减与转换与乘法器的要求轻松调整()。它的性能不如firls好,但它的优点是快速且易于计算(如果不存储系数,那就太好了)。

我在中找到了一个firls()实现

为使其正常工作而进行的小改动:

  • 交换以下两行:
    
    波段,所需,权重=阵列(波段),阵列(所需),阵列(权重)
    如果重量=无:重量=一(长度(带)/2)
    

  • 从numpy而不是scipy.signal导入根


  • python中的firls等价物现在似乎是作为信号包的一部分实现的:


    此外,我同意@pev hall在上文中所述的一切,尤其是firls在许多情况下是如何最佳的(例如,当针对给定数量的抽头优化整体信噪比时),并且如他所述,不使用boxcar车窗,它们根本不等效!在设计传统FIR滤波器时,firls通常优于所有窗口和频率采样方法进行滤波器设计。

    自2016年7月以来,scipy包括firls的实现,正如。

    好吧,这是一篇有趣的博客文章,但并不完全是我想要的。我看到了firwin()函数,但它没有能力以核磁共振成像所需的方式表达频率响应。。。我不希望重新发明轮子,但看起来我更有可能需要这样做。谢谢,请查看更多回复,尤其是@Pev Hall。这些不是数字滤波器实现的最佳实践,性能相对较差(如建议的,应在对数范围内进行比较)。