MatLab巴特沃斯高通滤波器转Python等效实现咨询
Matlab高通巴特沃斯滤波器转Python的等效实现问题
将Matlab代码转换为Python代码时,二者的高通巴特沃斯滤波器效果无法匹配。Matlab端使用sos结构的滤波器配合filtfilt实现零相位滤波,Python端最初使用传递函数系数(ba)结构,结果不一致。
两端原始代码
Matlab代码
hp = fdesign.highpass('N, Fc',order, FC, Fs); Hd = design(hp,'butter'); Data(n,:)=filtfilt(Hd.sosMatrix,Hd.ScaleValues,Data(n,:));
Python初始尝试代码
b, a = signal.butter(10, FC, 'highpass', analog=False, fs=config.sampling_rate, output="ba") data7 = signal.filtfilt(b, a, data6)
相关参数
- 阶数(Order)= 10
- 截止频率(FC)= 10 Hz
- 采样频率(Fs)= 256 Hz
Matlab滤波器参数
- Hd.sosMatrix(二阶节矩阵):
1.0000 -2.0000 1.0000 1.0000 -1.8690 0.9268; 1.0000 -2.0000 1.0000 1.0000 -1.7473 0.8013; 1.0000 -2.0000 1.0000 1.0000 -1.6556 0.7068; 1.0000 -2.0000 1.0000 1.0000 -1.5948 0.6441; 1.0000 -2.0000 1.0000 1.0000 -1.5646 0.6129;
- Hd.ScaleValues(缩放因子):
0.9489; 0.8872; 0.8406; 0.8097; 0.7944; 1.0000;
Python初始实现参数
- b系数:
[0.4551791, -4.55179104, 20.48305968, -54.62149247, 95.58761182, -114.70513418, 95.58761182, -54.62149247, 20.48305968, -4.55179104, 0.4551791]
- a系数:
[1.0, -8.43131806, 32.09602996, -72.63325918, 108.1914843, -110.82458397, 79.0501498, -38.76564753, 12.50684932, -2.39689227, 0.20718802]
输入数据
[-4.52524570e-04, -4.15547277e-04, -3.69618477e-04, -3.54294378e-04, -3.49118638e-04, -3.32459161e-04, -2.81526419e-04, -2.27654353e-04, -1.99580728e-04, -1.95510797e-04, -1.61056741e-04, -1.11072974e-04, -5.32648681e-05, -2.46667403e-05, -5.41950912e-06, -2.31557119e-08, 4.65967628e-05, 1.15442535e-04, 1.45564054e-04, 1.41258639e-04, 1.42186569e-04, 1.86131459e-04, 2.58602602e-04, 2.98376655e-04, 2.91488956e-04, 2.84846883e-04, 3.28808363e-04, 4.04729607e-04, 4.05485650e-04, 3.03873916e-04, 1.87973179e-04]
滤波结果对比
- Matlab处理结果:

- Python初始实现处理结果:

等效Python实现
问题根源在于高阶滤波器使用传递函数(ba)结构会引入数值稳定性误差,而Matlab默认使用二阶节(sos)结构。以下是匹配Matlab效果的Python代码:
import scipy.signal as signal # 匹配Matlab的参数 order = 10 FC = 10 Fs = 256 # 设计sos格式的巴特沃斯高通滤波器,与Matlab的sos结构一致 sos = signal.butter(order, FC, 'highpass', fs=Fs, output='sos') # 使用sosfiltfilt进行零相位滤波,对应Matlab的filtfilt(sosMatrix, ScaleValues, ...) data7 = signal.sosfiltfilt(sos, data6)
说明
- Matlab的
design(hp,'butter')默认生成**sos(二阶节)**结构的滤波器,Python需指定output='sos'来匹配,避免ba结构的数值误差。 - Python的
signal.sosfiltfilt会自动处理sos结构中的缩放因子,与Matlab的filtfilt(Hd.sosMatrix, Hd.ScaleValues, ...)行为完全一致。 - 生成的sos矩阵与Matlab的
Hd.sosMatrix在浮点精度范围内完全匹配,确保滤波效果一致。
内容的提问来源于stack exchange,提问作者display_name
相关产品推荐
相关产品推荐

