我正在处理脑电波数据,并且第一次尝试使用巴特沃斯滤波器。
这里有很多关于堆栈交换的有用资源(i)python 中的 Butterworth 滤波器和这里(ii)如何使用 Scipy.signal.butter 实现带通 Butterworth 滤波器
利用这些资源,我实现了以下代码:
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
我正在使用的数据在左侧图表上,我过滤它的尝试在右侧:
我相信我遇到的问题是参数。
阶数:设置为 5。阶数 5 的频率响应看起来不错
低切:0.5
高帮:60
FS/Sample Rate/Waves:我们能够每秒收集 500 个数据点,所以我将其设置为 500
N:350。我们正在处理 700 毫秒周期内的数据,但每隔一毫秒采样一次
查看我的数据,似乎我们在 700 ms 周期内大约有 2 个正弦波和 11 个更高频率的波......我应该能够看到这个并将低切设置为 2,将高切设置为更大的某个值吗?超过 11?我已经尝试在这一点上迭代几十个值......
感谢任何试图提供帮助的人。在过去的两天里,我一直在试图解决这个问题并且遇到了困难。
更新谢谢鲍勃和蒂姆!这绝对是问题所在——信号必须以零为中心。对我来说很严重。以下是更新的图表:
我不会说这些是我见过的最漂亮的正弦曲线,但它是实时数据,所以我的期望已经降低了。