首页 > 解决方案 > 随着阶数的增加,巴特沃斯滤波器看起来很奇怪

问题描述

我正在尝试在 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)

这给出了奇怪的结果,如下图所示(巴特沃斯滤波器从 1-10 阶)。我认为随着订单的增加,过滤器应该变得越来越矩形?

在此处输入图像描述

有谁知道如何在 SciPy 中设计一个简单的巴特沃斯滤波器?

标签: pythonscipyfilteringsignal-processingbutterworth

解决方案


Butterworth 滤波器的频率响应不是实值。使用 绘制复值响应plt.plot()时,仅显示实部。你应该看到一个警告:

ComplexWarning: Casting complex values to real discards the imaginary part

要检查滤波器的增益,请绘制频率响应的幅度:

plt.plot(np.abs(h))

正如预期的那样,您将看到越来越方的响应:

OP 代码的输出,此处建议进行少量更改


推荐阅读