You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Scipy Butterworth带通滤波器的高低频设置不同阶数?

为带通滤波的高低频截止频率设置不同阶数的实现方法

Scipy的butter函数原生带通滤波确实只能给高低频截止频率设置相同阶数,要实现不同阶数,直接组合独立的高通和低通滤波器是可行的,具体步骤如下:

步骤1:分别设计不同阶数的高通、低通滤波器

用butter函数分别生成高通和低通滤波器,注意要将截止频率归一化到奈奎斯特频率(即采样频率的一半),同时指定各自的阶数和滤波器类型。推荐使用sos(二阶节)格式输出,避免高阶滤波器带来的数值稳定性问题。

示例代码:

import numpy as np
from scipy.signal import butter, sosfilt, filtfilt

# 采样频率
fs = 1000
# 高低频截止频率(原始单位:Hz)
high_freq = 10
low_freq = 100

# 归一化截止频率(除以fs/2)
norm_high = high_freq / (fs / 2)
norm_low = low_freq / (fs / 2)

# 设计3阶高通滤波器
sos_high = butter(3, norm_high, btype='highpass', output='sos')
# 设计5阶低通滤波器
sos_low = butter(5, norm_low, btype='lowpass', output='sos')

步骤2:级联两个滤波器实现带通效果

将输入信号依次通过高通和低通滤波器(顺序不影响最终带通特性),可以选择两种滤波方式:

方式一:单次滤波(存在相位偏移)

用sosfilt做单次正向滤波,适合对相位要求不高的场景:

# 假设输入信号为x
x_filtered = sosfilt(sos_high, x)
x_filtered = sosfilt(sos_low, x_filtered)

方式二:零相位滤波(无相位偏移)

用filtfilt做双向滤波,信号先正向滤波再反向滤波,消除相位偏移,但每个滤波器的实际有效阶数会翻倍(比如3阶高通会变成6阶),需要根据需求调整初始阶数:

x_filtered = filtfilt(sos_high, x)
x_filtered = filtfilt(sos_low, x_filtered)

注意事项

  • 优先使用sos格式而非ba(分子分母系数)格式,高阶滤波器用ba容易出现数值误差,导致滤波效果异常
  • 如果对滤波后的相位有严格要求,优先选择filtfilt,但要注意有效阶数翻倍的问题
  • 滤波顺序不影响最终的带通范围,先过高通再低通,或者反过来,结果一致

内容的提问来源于stack exchange,提问作者hamami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:18:17