【问题标题】:Setting Parameters for a Butterworth Filter设置巴特沃斯滤波器的参数
【发布时间】: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!这绝对是问题所在——信号必须以零为中心。对我来说很严重。以下是更新后的图表:

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

【问题讨论】:

  • 那么,lowcuthighcutfs 到底传递了什么?

标签: python scipy signal-processing butterworth


【解决方案1】:

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

你会突然跳到 ~821000。

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

【讨论】:

  • 谢谢鲍勃!这绝对是问题所在——我必须过滤信号(对我来说很严重)。我会编辑帖子
  • 还有什么问题吗?
  • 我的另一个问题是是否有任何方法可以选择最佳的“低切”和“高切”频率?我通过迭代低切和高切值以及“修修补补”得出了上述结果。有没有更精致的方法?在上面的 url 链接中,作者知道要削减哪些频率,因为噪声是人为制造的——在我的示例中,我不知道先验。再次感谢您的帮助
  • 如果您想查看谐波,也许您应该考虑使用傅里叶变换,并查看频域的信号。巴特沃斯滤波器具有其历史重要性,如果您要实现模拟电路,它可能是最佳选择之一,但对于数字信号处理,您绝对可以使用更强大的东西。
猜你喜欢
  • 1970-01-01
  • 2019-10-09
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多