scipy 中的带通巴特沃斯滤波器频率
回答问题 我正在按照食谱在 scipy 中设计带通滤波器。但是,如果我将过滤频率降低太多,我最终会在高阶过滤器处产生垃圾。我究竟做错了什么? from scipy.signal import butter, lfilter def butter_bandpass(lowcut, highcut, fs, order=5): nyq = 0.5 * fs low = lowcut / nyq hig
·
回答问题
我正在按照食谱在 scipy 中设计带通滤波器。但是,如果我将过滤频率降低太多,我最终会在高阶过滤器处产生垃圾。我究竟做错了什么?
from scipy.signal import butter, lfilter
def butter_bandpass(lowcut, highcut, fs, order=5):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
b, a = butter(order, [low, high], btype='band')
return b, a
if __name__ == "__main__":
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz
# Sample rate and desired cutoff frequencies (in Hz).
fs = 25
# Plot the frequency response for a few different orders.
plt.figure(1)
plt.clf()
for order in [1, 3, 5, 6, 9]:
b, a = butter_bandpass(0.5, 4, fs, order=order)
w, h = freqz(b, a, worN=2000)#np.logspace(-4, 3, 2000))
plt.semilogx((fs * 0.5 / np.pi) * w, abs(h), label="order = %d" % order)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Gain')
plt.grid(True)
plt.legend(loc='best')
plt.figure(2)
plt.clf()
for order in [1, 3, 5, 6, 9]:
b, a = butter_bandpass(0.05, 0.4, fs, order=order)
w, h = freqz(b, a, worN=2000)#np.logspace(-4, 3, 2000))
plt.semilogx((fs * 0.5 / np.pi) * w, abs(h), label="order = %d" % order)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Gain')
plt.grid(True)
plt.legend(loc='best')
plt.show()
更新:在 Scipy 0.14 上讨论并显然解决了这个问题。然而,在 Scipy 更新之后,情节看起来仍然很糟糕。怎么了?
Answers
显然这个问题是一个已知的错误:
Github
更多推荐
已为社区贡献126473条内容
所有评论(0)