如何设计数字巴特沃斯带通滤波器?

信息处理 过滤器 过滤器设计 Python 连续信号
2022-02-18 11:31:37

我正在考虑在 python 中设计一个带通巴特沃斯滤波器,但是,我不确定我是否正确设计了我的滤波器。我有以下内容:

  • 高截止频率 = 200Hz
  • 低截止频率 = 10Hz
  • 采样频率 = 1000Hz
  • 对于我的数据,我使用了 Filter order = 6

我的代码定义如下:

# section of my imports:
from scipy.signal import find_peaks, find_peaks_cwt, argrelextrema, welch, lfilter, butter, savgol_filter, medfilt, freqz, filtfilt
from scipy.signal import argrelextrema, filtfilt, butter, lfilter

def butter_bandpass(lowcut, highcut, fs, order):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='bandpass', output='ba')
    # sos = butter(order, [low, high], btype='bandpass', output='sos')
    return b, a
    # return sos

def butter_bandpass_filter(data, lowcut, highcut, fs, order):
    # sos = butter_bandpass(lowcut, highcut, fs, order=order)
    # y = signal.sosfilt(sos=sos, x=data)
    # y = signal.sosfiltfilt(sos=sos, x=data)
    b, a = butter_bandpass(lowcut, highcut, fs, order=order)
    y = filtfilt(b=b, a=a, x=data)
    # y = lfilter(b, a, data)
    return y

我怎样才能获得通带和阻带衰减,我在哪里可以找到所需的方程来获得我的巴特沃斯滤波器设计方程 |H(w)|?类似于以下链接:(带通和带阻滤波器设计)。我以弧度/秒计算了数字频率:

  • wh = 400π弧度/秒
  • wl = 20π 弧度/秒
  • w(ah) ≈ 21.93 弧度/秒
  • w(al) ≈ 1.096 弧度/秒
  • W ≈ 20.84 弧度/秒
  • w^2 ≈ 578.53

最后的步骤是从低通到带通的原型转换,并将方程转换为双线性变换技术 (BLT) 以获得数字滤波器缺失。那么,我需要什么等式来获得数字滤波器?

1个回答

在 python 中,直接命令是 scipy.signal.butter。这将根据此处描述的临界频率数组返回滤波器系数(分子和分母):

https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.butter.html

获得分子和分母系数后,您可以使用它sicpy.signal.freqz来评估频率响应:

import scipy.signal as sig
w, h = sig.freqz(num, den)

(然后简单地将 w vs h 绘制为以查看以 dB 为单位的幅度,以及 h 的角度以查看相位。20log10(|h|)

freqz简单地评估滤波器的频率响应( )。从中我们可以看到幅度和相位与频率的关系。使用filter coefficients to filter a time domain signal,使用它将提供滤波器系数与信号的卷积以返回滤波结果。是一个“零相位”滤波器,它将通过前向滤波器实现的信号和反向,通过时间反转中的抵消来消除相位分量,但同时幅度响应也加倍。H(z)z=ejωxsicpy.signal.lfiltersig.signal.filtfiltfiltfilt是一个非因果滤波器,当我们希望输出和输入完美对齐而无需补偿输入和输出之间的滤波器延迟时,它在后处理应用程序中很有用,但它不是一个可以实现和提供这样的零相位、零延迟(非因果)。

请注意,我认为从模拟原型映射的数字滤波器通常不如使用优化算法(例如由scipy.signal.firlsand提供的scipy.signal.firpm)的 FIR 滤波器的直接数字设计,而不是用于教育目的或当模拟系统建模。这一点可能是我个人的神话,所以在这里专门作为另一个问题发布