如何手动绘制巴特沃斯过滤器?

时间:2019-04-28 15:17:18

标签: python

我想问一些关于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中做到这一点?

1 个答案:

答案 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 Ni, k的结果。可能不是一种非常有效的内存计算方式,尤其是在1.j*s[i]/fCut - sk[k]大但相对较快的情况下。

N计算矩阵每一行的乘积。

相关问题