【发布时间】:2021-12-12 03:14:00
【问题描述】:
我正在处理脑电波数据,并首次尝试使用巴特沃斯滤波器。
这里有很多关于堆栈交换的有用资源 (i) Butterworth filter in python 和这里 (ii) How to implement band-pass Butterworth filter with Scipy.signal.butter
利用这些资源,我实现了以下代码:
from scipy.signal import butter, sosfilt, sosfreqz
def butter_bandpass(lowcut, highcut, fs, order=5):
nyq = 0.5 * fs
low = lowcut / nyq
high = highcut / nyq
sos = butter(order, [low, high], analog=False, btype='band', output='sos')
return sos
def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
sos = butter_bandpass(lowcut, highcut, fs, order=order)
y = sosfilt(sos, data)
return y
我正在使用的数据位于左侧图表中,我尝试过滤它的位于右侧:
neural activity during 700 ms delay period
我认为我遇到的问题与参数有关。
阶数:设置为 5。阶数 5 的频率响应看起来还不错
低切:.5
高帮:60
FS/Sample Rate/Waves:我们每秒能够收集 500 个数据点,因此我将其设置为 500
N:350。我们正在处理 700 毫秒周期内的数据,但仅每隔毫秒采样一次
查看我的数据,我们似乎在 700 毫秒的周期内有大约 2 个正弦波和 11 个更高频率的波......我应该能够看到这个并将低切设置为 2,将高切设置为某个值大于 11?我已经尝试在这一点上迭代几十个值......
感谢任何试图提供帮助的人。在过去的两天里,我一直在试图解决这个问题,但遇到了困难。
更新谢谢 Bob 和 Tim!这绝对是问题所在——信号必须以零为中心。对我来说很严重。以下是更新后的图表:
我不会说这些是我见过的最漂亮的正弦曲线,但它是实时数据,所以我的期望已经降低了。
【问题讨论】:
-
那么,
lowcut、highcut和fs到底传递了什么?
标签: python scipy signal-processing butterworth