【问题标题】:Matlab freqz function in PythonPython中的Matlab freqz函数
【发布时间】:2015-06-19 16:05:47
【问题描述】:

我正在尝试为 Matlab 频率响应函数实现 Python 等效项

[h,f] = freqz(b, 1, 512, 12.5)

here 中描述。我目前的尝试

f, h = scipy.signal.freqz(b, 1)

没有给出预期的结果。尝试参数worNwhole(请参阅here)似乎无法解决问题。

应该怎么做?

编辑:

Matlab 示例:

>> [h, f] = freqz(1:5, 1, 512, 12.5)

h =

  15.0000 + 0.0000i
  14.9976 - 0.2454i
  14.9902 - 0.4907i
  14.9780 - 0.7358i
  14.9609 - 0.9806i
  14.9389 - 1.2250i
  ...

f =

         0
    0.0122
    0.0244
    0.0366
    0.0488
    0.0610
    ...

Python 示例:

>>> f, h = scipy.signal.freqz(range(1,6), 1)
>>> h
array([ 15.00000000 +0.j        ,  14.99755288 -0.24541945j,
        14.99021268 -0.49073403j,  14.97798292 -0.73583892j,
        14.96086947 -0.98062944j,  14.93888050 -1.22500102j,
        ...])
>>> f
array([ 0.        ,  0.00613592,  0.01227185,  0.01840777,  0.02454369,
        0.03067962,  ...])

换句话说,Scipy 函数为 h 提供了良好的值,但 f 的值不匹配。

【问题讨论】:

  • 你能举一个a的例子和预期的输出吗?
  • 另外,您对freqz() 的使用似乎与您的链接中显示的任何使用都不匹配...

标签: python matlab numpy scipy signal-processing


【解决方案1】:

在两种语言中,freqz 的第一个参数都需要分子系数 b,而不是像你写的 a。应该是

freqz(b, a, ...)

看起来您正在尝试查找 FIR 滤波器的响应,该滤波器只有分子系数,a 始终为 1。

【讨论】:

    【解决方案2】:

    在 SciPy 1.2.0 版中,fs 参数已添加到 scipy.signal.freqz。所以你可以写

    f, h = freqz(range(1, 6), 1, fs=12.5)
    

    例如,

    In [18]: f, h = freqz(range(1, 6), 1, fs=12.5)                                                
    
    In [19]: len(f)                                                                               
    Out[19]: 512
    
    In [20]: f[:10]  # Matches the Matlab output shown in the question.                                                                       
    Out[20]: 
    array([0.        , 0.01220703, 0.02441406, 0.03662109, 0.04882812,
           0.06103516, 0.07324219, 0.08544922, 0.09765625, 0.10986328])
    

    在旧版本的 SciPy 中, signal.signal.freqz 没有以Hz 为单位返回频率的选项,因此您之后必须自己调整频率。

    相当于Matlab的

    [h, f] = freqz(b, a, n, fs)
    

    使用来自scipy.signalfreqz 是:

    w, h = freqz(b, a, worN=n)
    f = fs * w / (2*np.pi)
    

    例如,

    In [15]: import numpy as np
    
    In [16]: from scipy.signal import freqz
    
    In [17]: w, h = freqz(range(1,6), 1, worN=512)
    
    In [18]: h[:6]
    Out[18]: 
    array([ 15.00000000+0.j        ,  14.99755288-0.24541945j,
            14.99021268-0.49073403j,  14.97798292-0.73583892j,
            14.96086947-0.98062944j,  14.93888050-1.22500102j])
    
    In [19]: w[:6]
    Out[19]: 
    array([ 0.        ,  0.00613592,  0.01227185,  0.01840777,  0.02454369,
            0.03067962])
    
    In [20]: f = 12.5*w/(2*np.pi)
    
    In [21]: f[:6]
    Out[21]: 
    array([ 0.        ,  0.01220703,  0.02441406,  0.03662109,  0.04882812,
            0.06103516])
    

    【讨论】:

      猜你喜欢
      • 2012-07-15
      • 2018-08-15
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 2017-07-01
      相关资源
      最近更新 更多