IIR 巴特沃斯滤波器实现(低通、高通、带通、带阻)
基于双线性变换法的IIR巴特沃斯滤波器实现,包含低通、高通、带通、带阻四种类型的流程和代码
一、设计原理与流程
graph TD
A[确定设计指标] --> B[计算模拟滤波器阶数]
B --> C[设计模拟原型滤波器]
C --> D[双线性变换]
D --> E[数字滤波器实现]
E --> F[性能验证]
二、核心设计参数
| 参数类型 | 低通/高通 | 带通/带阻 |
|---|---|---|
| 通带截止频率 | Wp |
[Wp1, Wp2] |
| 阻带截止频率 | Ws |
[Ws1, Ws2] |
| 通带衰减 | Rp (dB) |
Rp (dB) |
| 阻带衰减 | Rs (dB) |
Rs (dB) |
三、Matlab实现代码
1. 低通滤波器
% 设计参数
Fs = 1000; % 采样频率
Fc = 100; % 截止频率
Rp = 3; % 通带衰减
Rs = 40; % 阻带衰减
% 归一化处理
Wp = Fc/(Fs/2);
Ws = 1.2*Fc/(Fs/2);
% 计算阶数和截止频率
[n, Wn] = buttord(Wp, Ws, Rp, Rs);
% 设计滤波器
[b, a] = butter(n, Wn, 'low');
% 频率响应分析
freqz(b, a, 1024, Fs);
2. 高通滤波器
% 参数修改
Wp = 200/(Fs/2);
Ws = 150/(Fs/2);
% 计算阶数
[n, Wn] = buttord(Wp, Ws, Rp, Rs);
% 设计滤波器
[b, a] = butter(n, Wn, 'high');
3. 带通滤波器
% 带通参数
Wp = [100, 300]/(Fs/2);
Ws = [50, 350]/(Fs/2);
% 计算阶数
[n, Wn] = buttord(Wp, Ws, Rp, Rs);
% 设计滤波器
[b, a] = butter(n, Wn, 'bandpass');
4. 带阻滤波器
% 带阻参数
Wp = [50, 350]/(Fs/2);
Ws = [100, 300]/(Fs/2);
% 计算阶数
[n, Wn] = buttord(Wp, Ws, Rp, Rs);
% 设计滤波器
[b, a] = butter(n, Wn, 'stop');
参考代码 IIR 巴特沃斯滤波器实现(低通、高通、带通、带阻), 掌握数字滤波器的设计过程. youwenfan.com/contentcna/71731.html
四、关键算法解析
1. 阶数计算公式
\(N≥2log(ωpωs)log(100.1Rp−1100.1Rs−1)\)
其中:
- \(ωp=2πfp/fs\)
- \(ωs=2πfs/fs\)
2. 双线性变换公式
\(s=T2⋅z+1z−1\)
通过该变换将模拟滤波器转换为数字滤波器,避免频谱混叠。
五、性能验证方法
1. 频率响应分析
[H, W] = freqz(b, a, 1024, Fs);
plot(W, 20*log10(abs(H)));
xlabel('频率 (Hz)');
ylabel('幅度 (dB)');
2. 相位响应分析
phi = angle(H);
plot(W, phi*180/pi);
xlabel('频率 (Hz)');
ylabel('相位 (°)');
3. 零极点图
zplane(b, a);
title('零极点分布图');
六、C语言实现要点
// 直接II型结构实现
double filter(double *x, double *y, double *b, double *a, int order) {
double x0 = x[0];
double y0 = 0;
// 分子部分
for(int i=0; i<=order; i++) {
y0 += b[i] * x0;
x0 = x[i] ? x[i] : 0; // 实现延迟线
}
// 分母部分
for(int i=1; i<=order; i++) {
y0 -= a[i] * y[i-1];
}
// 更新延迟线
for(int i=order; i>0; i--) {
x[i] = x[i-1];
y[i] = y[i-1];
}
x[0] = x0;
y[0] = y0;
return y0;
}
七、设计注意事项
- 预畸变处理:数字频率需通过Ω=2/Ttan(ω/2)转换为模拟频率
- 阶数选择:建议使用
buttord函数自动计算最小阶数 - 量化误差:高阶滤波器需注意系数精度(建议使用双精度浮点)
- 实时性优化:可采用多相结构或SIMD指令加速
八、完整工程示例
% 带通滤波器完整设计
Fs = 8000; % 采样率
f1 = 1000; % 通带下限
f2 = 2000; % 通带上限
Rp = 1; % 通带波纹
Rs = 40; % 阻带衰减
% 归一化
Wp = [f1, f2]/(Fs/2);
Ws = [800, 2200]/(Fs/2);
% 计算阶数
[n, Wn] = buttord(Wp, Ws, Rp, Rs);
% 设计滤波器
[b, a] = butter(n, Wn, 'bandpass');
% 验证设计
fvtool(b, a, 'Fs', Fs);
通过上述设计流程,可系统掌握IIR巴特沃斯滤波器的完整设计方法。建议结合Matlab的filterDesigner工具进行可视化参数调整,再通过C语言实现硬件部署。

浙公网安备 33010602011771号