更新:
我找到了一个基于这个问题的 Scipy 食谱!因此,对于任何感兴趣的人,请直接转到: 目录 » 信号处理 » 巴特沃斯带通
我很难实现最初看起来很简单的任务,即为一维 numpy 数组(时间序列)实现巴特沃斯带通滤波器。
我必须包括的参数是 sample_rate、截止频率 IN HERTZ 和可能的顺序(其他参数,如衰减、自然频率等对我来说更模糊,所以任何“默认”值都可以)。
我现在拥有的是这个,它似乎可以用作高通滤波器,但我不确定我是否做对了:
def butter_highpass(interval, sampling_rate, cutoff, order=5):
nyq = sampling_rate * 0.5
stopfreq = float(cutoff)
cornerfreq = 0.4 * stopfreq # (?)
ws = cornerfreq/nyq
wp = stopfreq/nyq
# for bandpass:
# wp = [0.2, 0.5], ws = [0.1, 0.6]
N, wn = scipy.signal.buttord(wp, ws, 3, 16) # (?)
# for hardcoded order:
# N = order
b, a = scipy.signal.butter(N, wn, btype='high') # should 'high' be here for bandpass?
sf = scipy.signal.lfilter(b, a, interval)
return sf
文档和示例令人困惑和晦涩,但我想实现标记为“用于带通”的推荐中提供的表格。评论中的问号显示我只是复制粘贴了一些示例而没有理解正在发生的事情。
我不是电气工程师或科学家,只是一名医疗设备设计师,需要对 EMG 信号执行一些相当简单的带通滤波。
原文由 heltonbiker 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以跳过 buttord 的使用,而只是为过滤器选择一个顺序,看看它是否符合您的过滤条件。要生成带通滤波器的滤波器系数,请给 butter() 滤波器阶数、截止频率
Wn=[lowcut, highcut]
、采样率fs
(以与截止频率相同的单位表示)和波段类型btype="band"
。下面是一个脚本,它定义了几个使用巴特沃斯带通滤波器的便利函数。当作为脚本运行时,它会生成两个图。一张图显示了相同采样率和截止频率下多个滤波器阶数的频率响应。另一个图展示了过滤器(阶数 = 6)对样本时间序列的影响。
以下是此脚本生成的图: