我想问一些关于Python中Butterworth过滤器的问题,我知道这是您为低通Butterworth过滤器绘制图形的方式:
from scipy import signal
import matplotlib.pyplot as plt
b,a=signal.butter(N,fCut,'low',analog=True)
w,h=signal.freqs(b,a)
plt.plot(w,(abs(h)))
其中N为阶数,f为截止频率。 但是我在尝试手动执行而不使用'signal.freqs'时遇到了问题。 这意味着我必须计算模拟传递函数: H(s)= 1 /Σ(s-sk),k = 1..N,sk = e ^((j * pi)((2 * k + n-1)/ 2 * n)) 有没有办法在python中做到这一点?
答案 0 :(得分:0)
以下是与公式对应的Python代码:
Staff B
并对其进行测试:
import numpy as np
def butterTF(s, N, fCut):
sk = np.exp(0.5j*np.pi*(2*np.arange(N) + N + 1)/N)
return 1/np.multiply.reduce(np.subtract.outer(1.j*s/fCut, sk), axis=1)
一些解释:
计算from scipy import signal
import matplotlib.pyplot as plt
b,a=signal.butter(N,fCut,'low',analog=True)
w,h=signal.freqs(b,a)
plt.figure()
plt.plot(w, np.abs(h))
plt.plot(w, np.abs(butterTF(w, N, fCut)), '.')
plt.grid()
plt.show()
很简单,只是我们需要修改一下公式,因为sk
给出了np.arange(N)
而不是0, 1, ... , N-1
。
现在,棘手的部分:1, 2, ... , N
形成矩阵np.subtract.outer
,其元素len(s) x N
是i, k
的结果。可能不是一种非常有效的内存计算方式,尤其是在1.j*s[i]/fCut - sk[k]
大但相对较快的情况下。
N
计算矩阵每一行的乘积。