python中的巴特沃斯过滤器

信息处理 过滤器 信号分析 Python 过滤
2022-02-09 21:03:07

我正在尝试使用 Python 中的 Butterworth 过滤器,如此线程中所述,具有以下功能:

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


def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
    b, a = butter_bandpass(lowcut, highcut, fs, order=order)
    y = lfilter(b, a, data)
    return y

在不应用过滤器的情况下,我的数据的 FFT 输出给出了以下图:

在此处输入图像描述

但是,在应用上面的过滤器后:

lowcut = 1.0
highcut = 50.0
x2_Vtcr = butter_bandpass_filter(x_Vtcr, lowcut, highcut, fs, order=4)

其中 fs 是采样频率(在我的情况下为 250),我得到 FFT:

在此处输入图像描述

看起来滤波器将频率向左移动,而我没有得到应有的峰值。知道为什么会这样吗?

谢谢!

1个回答

(不是答案,但不能在评论中发布代码)

对我来说很好:

 __future__ import division
from numpy.random import randn
from numpy.fft import rfft
from scipy.signal import butter, lfilter
from matplotlib.pyplot import loglog

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

def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
    b, a = butter_bandpass(lowcut, highcut, fs, order=order)
    y = lfilter(b, a, data)
    return y

fs = 250
lowcut = 1.0
highcut = 50.0
x_Vtcr = randn(10000)
x2_Vtcr = butter_bandpass_filter(x_Vtcr, lowcut, highcut, fs, order=4)
loglog(abs(rfft(x_Vtcr)))
loglog(abs(rfft(x2_Vtcr)))

你得到什么和这个不同?