随着阶数的增加,巴特沃斯滤波器看起来很奇怪
Butterworth filters look very strange as increasing order
我正在尝试在 SciPy 中设计一个简单的 Butterworth 带通滤波器,但我 运行 遇到了一些奇怪的结果。
import scipy.signal as signal
import numpy as np
import matplotlib.pyplot as plt
def butter_bandpass(lowcut, highcut, fs, freqs,order=3, label=None):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
sos = signal.butter(order, [low, high], btype='band', output='sos')
w, h = signal.sosfreqz(sos,worN=freqs,whole=True,fs=fs)
return w,h
freqs = 650
for i in np.arange(1,10):
w,h = butter_bandpass(0.01, 0.1, fs=1/0.68, freqs=freqs, order=i)
plt.plot(h)
这给出了奇怪的结果,如下图所示(Butterworth 滤波器顺序为 1-10)。我认为过滤器应该随着订单的增加而变得越来越长方形?
有谁知道如何在SciPy中设计一个简单的巴特沃斯滤波器?
巴特沃斯滤波器的频率响应不是实值。使用 plt.plot()
绘制复值响应时,仅显示实部。您应该会看到一条警告:
ComplexWarning: Casting complex values to real discards the imaginary part
要检查滤波器的增益,绘制频率响应的幅度:
plt.plot(np.abs(h))
如预期的那样,您会看到越来越方形的响应:
我正在尝试在 SciPy 中设计一个简单的 Butterworth 带通滤波器,但我 运行 遇到了一些奇怪的结果。
import scipy.signal as signal
import numpy as np
import matplotlib.pyplot as plt
def butter_bandpass(lowcut, highcut, fs, freqs,order=3, label=None):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
sos = signal.butter(order, [low, high], btype='band', output='sos')
w, h = signal.sosfreqz(sos,worN=freqs,whole=True,fs=fs)
return w,h
freqs = 650
for i in np.arange(1,10):
w,h = butter_bandpass(0.01, 0.1, fs=1/0.68, freqs=freqs, order=i)
plt.plot(h)
这给出了奇怪的结果,如下图所示(Butterworth 滤波器顺序为 1-10)。我认为过滤器应该随着订单的增加而变得越来越长方形?
有谁知道如何在SciPy中设计一个简单的巴特沃斯滤波器?
巴特沃斯滤波器的频率响应不是实值。使用 plt.plot()
绘制复值响应时,仅显示实部。您应该会看到一条警告:
ComplexWarning: Casting complex values to real discards the imaginary part
要检查滤波器的增益,绘制频率响应的幅度:
plt.plot(np.abs(h))
如预期的那样,您会看到越来越方形的响应: