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;
}

七、设计注意事项

  1. 预畸变处理:数字频率需通过Ω=2/Ttan(ω/2)转换为模拟频率
  2. 阶数选择:建议使用buttord函数自动计算最小阶数
  3. 量化误差:高阶滤波器需注意系数精度(建议使用双精度浮点)
  4. 实时性优化:可采用多相结构或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语言实现硬件部署。

posted @ 2025-07-24 09:31  u95900090  阅读(914)  评论(0)    收藏  举报