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

Scipy Butterworth带通滤波器输出振幅异常问题求助

问题修复方案

你的滤波器存在几个关键问题,导致振幅异常和波形不纯,以下是具体修复步骤:

1. 修正带通滤波器的截止频率顺序

Butterworth带通滤波器的butter函数要求传入的截止频率列表是**[低截止频率, 高截止频率]**,但你的代码里把highcut和lowcut的顺序搞反了,这直接导致滤波器的通带范围错误。

原代码中:

b, a = butter(order, [high, low], btype='band')

需要改为:

b, a = butter(order, [low, high], btype='band')

同时注意:当要保留周期30-96的信号时,对应的频率是1/96(低频,对应长周期)到1/30(高频,对应短周期),所以low应该是1/96 / nyq,high是1/30 / nyq,顺序不能反。

2. 替换边缘效应处理方式,改用零相位滤波

你用随机数据补全信号的方式会引入额外噪声,导致波形不纯。推荐使用scipy.signal.filtfilt(零相位双向滤波),它会先正向滤波再反向滤波,既消除了相位偏移,也大幅缓解边缘效应,同时让通带内的振幅更准确。

3. 使用二阶节(SOS)滤波器提升稳定性

高阶滤波器用b,a形式容易出现数值不稳定,改用output='sos'生成二阶节,再用sosfiltfilt滤波,能避免数值误差。


修正后的完整代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, sosfiltfilt

# 生成原始信号
x = np.arange(1, 365, 1)
y1 = 1 * np.sin((1/10) * x)
y2 = 5 * np.sin((1/45) * x)
y3 = 10 * np.sin((1/120) * x)
y_total = y1 + y2 + y3

def butter_bandpass_sos(lowcut, highcut, fs, order=2):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    # 生成二阶节形式的滤波器参数,更稳定
    sos = butter(order, [low, high], btype='band', output='sos')
    return sos

def butter_bandpass_filter(data, min_period, max_period, order=2):
    fs = 1  # 采样频率,每天一个点
    # 周期转频率:频率=1/周期,保留周期在min_period到max_period之间的信号
    lowcut = 1 / max_period  # 对应长周期的低频
    highcut = 1 / min_period  # 对应短周期的高频
    sos = butter_bandpass_sos(lowcut, highcut, fs, order=order)
    # 使用sosfiltfilt做零相位双向滤波,消除相位偏移和边缘效应
    y = sosfiltfilt(sos, data)
    return y

# 应用滤波器:保留周期30-96的信号(对应y2,振幅5)
filtered_y = butter_bandpass_filter(y_total, 30, 96)

# 绘图对比
plt.figure(figsize=(12,6))
plt.scatter(x, y_total, label='原始信号', s=5)
plt.scatter(x, filtered_y, label='滤波后信号', s=5, color='red')
plt.legend()
plt.show()

关键修正点说明

  • 截止频率顺序:明确带通滤波器的通带是低频到高频,对应长周期到短周期,所以lowcut是1/最大周期,highcut是1/最小周期,传入butter时顺序为[lowcut/nyq, highcut/nyq]。
  • 零相位滤波:sosfiltfilt避免了lfilter的相位偏移和单次滤波的振幅衰减,同时通过双向滤波减少了边缘失真,不需要额外添加随机数据。
  • 二阶节滤波器:sos形式比b,a形式的数值稳定性更高,尤其是高阶滤波时,不会出现系数溢出问题。

运行修正后的代码,滤波后的信号振幅会接近5,波形也会更纯净,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:07:36