我正在处理脑电波数据,并且第一次尝试使用巴特沃斯过滤器。
在堆栈交换方面有很多有用的资源,这里(i) 蟒蛇中的Butterworth滤波器和(ii) 如何用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我正在处理的数据位于左边的图形上,我试图过滤它的方法是在右边:

我认为我遇到的问题是与参数有关。
顺序:设置为5。频率响应对于5阶看起来没有问题。
低切:.5
高切: 60
FS/Sample /Waves:我们能够每秒收集500个数据点,所以我将其设置为500个
N: 350。我们正在处理700毫秒的数据,但只有每毫秒采样一次。
从我的数据来看,我们大约有两个正弦波,周期为700毫秒,再加上11个高频waves...should,我能看到这一点,并将低切设置为2,并将高切设置为大于11的某个值?我试过在这点上迭代几十个值.
谢谢任何想帮忙的人。在过去的两天里,我一直在努力想办法解决这个问题,结果还是碰壁了。
更新谢谢鲍勃和提姆!这绝对是问题所在--信号必须以零为中心。对我来说是严肃的废话。以下是最新的图表:

我不会说这些是我见过的最漂亮的正弦曲线,但这是实时数据,所以我的期望已经被缓和了。
发布于 2021-10-27 16:59:08
想一想,如果你用零填充你的信号会发生什么。
你就会突然跳到821000岁。
还请注意,带通滤波器在频率为0时增益为0,这意味着直流分量将被滤波,如果在滤波前从信号中减去平均值,可能会得到更好的结果。
https://stackoverflow.com/questions/69728320
复制相似问题