Python 中的 Matlab freqz 函数
Matlab freqz function in Python
我正在尝试为 Matlab 频率响应函数实现一个 Python 等价物
[h,f] = freqz(b, 1, 512, 12.5)
在 here 中描述。我目前的尝试
f, h = scipy.signal.freqz(b, 1)
没有给出预期的结果。尝试参数 worN
和 whole
(参见 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
的值不匹配。
在这两种语言中,freqz
期望第一个参数的分子系数为 b
,而不是像您写的那样 a
。应该是
freqz(b, a, ...)
看起来您正在尝试找到 FIR 滤波器的响应,其中只有分子系数并且 a
始终为 1。
在 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
无法选择 return 以赫兹为单位的频率,因此您之后必须自己调整频率。
相当于Matlab的
[h, f] = freqz(b, a, n, fs)
使用 scipy.signal
中的 freqz
是:
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])
我正在尝试为 Matlab 频率响应函数实现一个 Python 等价物
[h,f] = freqz(b, 1, 512, 12.5)
在 here 中描述。我目前的尝试
f, h = scipy.signal.freqz(b, 1)
没有给出预期的结果。尝试参数 worN
和 whole
(参见 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
的值不匹配。
在这两种语言中,freqz
期望第一个参数的分子系数为 b
,而不是像您写的那样 a
。应该是
freqz(b, a, ...)
看起来您正在尝试找到 FIR 滤波器的响应,其中只有分子系数并且 a
始终为 1。
在 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
无法选择 return 以赫兹为单位的频率,因此您之后必须自己调整频率。
相当于Matlab的
[h, f] = freqz(b, a, n, fs)
使用 scipy.signal
中的 freqz
是:
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])