0

我正在处理脑电波数据,并且第一次尝试使用巴特沃斯滤波器。

这里有很多关于堆栈交换的有用资源(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

我正在使用的数据在左侧图表上,我过滤它的尝试在右侧: 700 ms 延迟期间的神经活动

700 ms 延迟期间的神经活动

我相信我遇到的问题是参数。

阶数:设置为 5。阶数 5 的频率响应看起来不错

低切:0.5

高帮:60

FS/Sample Rate/Waves:我们能够每秒收集 500 个数据点,所以我将其设置为 500

N:350。我们正在处理 700 毫秒周期内的数据,但每隔一毫秒采样一次

查看我的数据,似乎我们在 700 ms 周期内大约有 2 个正弦波和 11 个更高频率的波......我应该能够看到这个并将低切设置为 2,将高切设置为更大的某个值吗?超过 11?我已经尝试在这一点上迭代几十个值......

感谢任何试图提供帮助的人。在过去的两天里,我一直在试图解决这个问题并且遇到了困难。

更新谢谢鲍勃和蒂姆!这绝对是问题所在——信号必须以零为中心。对我来说很严重。以下是更新的图表:

700 ms 延迟期间的集中神经活动

我不会说这些是我见过的最漂亮的正弦曲线,但它是实时数据,所以我的期望已经降低了。

4

1 回答 1

0

想想如果你用零填充你的信号会发生什么。

你会突然跳到〜821000。

另请注意,带通滤波器在频率 0 处的增益为 0,这意味着将过滤直流分量,如果在过滤之前从信号中减去平均值,您可能会得到更好的结果。

于 2021-10-27T16:59:08.230 回答