《数字信号处理 》第 7 章-无限长单位冲激响应 (IIR) 数字滤波器设计方法

前言

大家好!今天给大家带来《数字信号处理》中IIR 数字滤波器设计的完整解析,这是数字信号处理的核心知识点之一,从基础概念到设计流程,再到 MATLAB 实战代码,全程通俗易懂、层层递进,配套效果对比图和 流程图 / 思维导图,方便大家理解和动手实操。

本文所有 MATLAB 代码均经过验证,可直接运行,关键步骤附带详细注释,同时每个核心知识点搭配综合应用案例,助力大家吃透 IIR 滤波器设计的精髓。


7.1 概述

无限长单位冲激响应(IIR, Infinite Impulse Response)数字滤波器,核心特征是单位冲激响应 h (n) 具有无限长 ,其系统函数为有理分式形式 (包含分子和分母,对应反馈环节):

IIR 滤波器的核心特点

  1. 结构紧凑:用较少的阶数就能实现陡峭的幅频特性,计算效率高;
  2. 存在反馈:设计不当易产生不稳定问题,需保证极点全部在单位圆内;
  3. 相位特性:一般为非线性相位,若需线性相位需额外设计相位补偿器;
  4. 设计方法:以模拟滤波器设计为基础 (模拟滤波器理论成熟),通过 "模拟→数字" 的映射实现,即间接法(主流),也可直接在数字域设计(计算机辅助设计法)。

核心设计思路

IIR 滤波器设计的主流思路是间接法(经典设计法):

先设计满足指标的模拟低通原型滤波器

再通过频带变换得到模拟高通 / 带通 / 带阻滤波器,

最后通过模拟→数字的映射方法将模拟滤波器转换为数字滤波器;

也可直接将模拟低通原型通过一次变换得到各类数字滤波器,或在数字域进行频带变换。


7.2 数字滤波器的实现步骤

IIR 数字滤波器的设计并非单一步骤,而是从指标分析到最终实现的完整流程 ,经典间接法的通用实现步骤为标准化流程,可直接指导工程实践,流程图如下:

关键说明

  1. 指标转换:数字频率与模拟频率存在对应关系(如双线性变换的频率预畸变),需将数字滤波器的截止频率、衰减指标转换为模拟滤波器的对应指标;
  2. 原型设计:模拟低通原型为基础,所有其他类型滤波器均由其变换得到;
  3. 结构实现:IIR 滤波器的系统函数可分解为一阶 / 二阶子系统的级联 / 并联,有效避免直接型的系数灵敏度问题,提高工程稳定性。

7.3 数字滤波器的技术指标

设计滤波器的前提是明确技术指标 ,IIR 滤波器的指标主要针对幅频特性 (非线性相位为固有特性,一般不做硬性要求),分为通带、过渡带、阻带 三个频段,核心指标为频率指标衰减指标 ,均基于数字频率 ω(单位:rad,0≤ω≤π,对应实际频率f=ωfs​/(2π),fs​为采样频率)。

核心技术指标(以低通为例)

指标转换公式


7.4 IIR 数字滤波器的设计方法分类

IIR 数字滤波器的设计方法按设计域 可分为经典间接法现代直接法 两大类,思维导图清晰展示分类及子方法:

方法详解

  1. 经典间接法:最常用,利用模拟滤波器的成熟理论,设计流程标准化、易实现,包含两种核心设计方案(后续 7.9/7.11 详细讲解);
  2. 现代直接法:不依赖模拟滤波器,直接在数字域通过优化算法设计满足指标的 H (z),适用于经典方法无法满足的特殊指标要求,需借助计算机(MATLAB)实现。

间接法又可根据变换顺序 细分,核心是模拟低通原型频带变换模拟→数字映射三个核心环节的不同组合。


7.5 模拟原型低通滤波器设计

经典的模拟低通原型滤波器有五类 ,各有优劣,适用于不同工程场景,其中巴特沃思切贝雪夫为最常用的两类,椭圆和贝塞尔为特殊场景选用。

7.5.1 引言

核心设计步骤:

7.5.2 模拟巴特沃思低通滤波器

巴特沃思(Butterworth)滤波器 的核心特点是通带幅频特性最平坦,无纹波,阻带单调衰减,又称为 "最平幅度滤波器"。

核心特性

关键公式

MATLAB 综合案例:巴特沃思模拟低通滤波器设计 + 幅频特性对比

复制代码
% 7.5.2 模拟巴特沃思低通滤波器设计 + 阶数对比
clear; clc; close all; % 清理工作区、命令行、关闭已有窗口,避免干扰

% 1. 定义技术指标
Omega_p = 100;    % 通带截止频率 (rad/s)
Alpha_p = 3;      % 通带最大衰减 (dB)
Omega_s = 200;    % 阻带截止频率 (rad/s)
Alpha_s = 40;     % 阻带最小衰减 (dB)

% 2. 计算巴特沃思滤波器的最小阶数N和归一化截止频率Omega_c
[N, Omega_c] = buttord(Omega_p, Omega_s, Alpha_p, Alpha_s, 's'); % 's'表示模拟滤波器
fprintf('巴特沃思滤波器最小阶数:N = %d\n', N);
fprintf('巴特沃思滤波器归一化截止频率:Omega_c = %.2f rad/s\n', Omega_c);

% 3. 设计不同阶数的巴特沃思模拟低通滤波器(N、N+2、N+4),对比幅频特性
orders = [N, N+2, N+4]; % 待对比的阶数
colors = ['r', 'g', 'b']; % 颜色区分
Omega = 0:0.1:500; % 频率范围,覆盖通带和阻带

figure('Name','巴特沃思模拟低通滤波器-不同阶数幅频特性对比');
hold on; grid on; box on; % 保持窗口、显示网格、显示边框
for i = 1:length(orders)
    [b, a] = butter(orders(i), Omega_c, 's'); % 设计模拟巴特沃思低通滤波器
    [H, w] = freqs(b, a, Omega); % 计算幅频响应(模拟频率)
    mag_dB = 20*log10(abs(H)); % 转换为dB值
    plot(w, mag_dB, colors(i), 'LineWidth',1.5, ...
         'DisplayName',sprintf('N=%d', orders(i)));
end

% 绘制指标线,方便验证
plot([Omega_p, Omega_p], [-100, 0], 'k--', 'LineWidth',1, 'DisplayName','通带截止');
plot([Omega_s, Omega_s], [-100, 0], 'm--', 'LineWidth',1, 'DisplayName','阻带截止');
plot([0, 500], [-Alpha_p, -Alpha_p], 'c--', 'LineWidth',1, 'DisplayName',sprintf('通带衰减(%ddB)',Alpha_p));
plot([0, 500], [-Alpha_s, -Alpha_s], 'y--', 'LineWidth',1, 'DisplayName',sprintf('阻带衰减(%ddB)',Alpha_s));

% 图形标注
xlabel('模拟角频率 Ω (rad/s)');
ylabel('幅频响应 (dB)');
title('巴特沃思模拟低通滤波器-不同阶数幅频特性对比');
legend('Location','best');
ylim([-80, 5]); % 限定纵轴范围,突出关键区域

运行效果

生成 1 个窗口,显示最小阶数、最小阶数 + 2、最小阶数 + 4 的巴特沃思滤波器幅频特性,同时标注通带 / 阻带截止频率和衰减指标线,可直观看到:阶数越高,过渡带越窄,阻带衰减越快,通带始终保持无纹波平坦特性。

7.5.3 模拟切贝雪夫低通滤波器

切贝雪夫(Chebyshev)滤波器分为Ⅰ 型Ⅱ 型 ,核心特点是以纹波换取更窄的过渡带,相同衰减要求下阶数远低于巴特沃思滤波器。

切贝雪夫 Ⅰ 型

切贝雪夫 Ⅱ 型

  1. 核心特性:通带单调平坦阻带等纹波,又称为 "逆切贝雪夫滤波器";
  2. 幅频特性无通带纹波,阻带存在可控纹波,过渡带同样陡峭;
  3. 适用场景:对通带纹波要求严格,同时需要窄过渡带的场景。

共同特性

  1. 过渡带远窄于同阶数巴特沃思滤波器,阶数更低;
  2. 相位特性非线性,且纹波越大,相位非线性越明显;
  3. 稳定性好(极点均在 s 左半平面);
  4. 优缺点:过渡带窄、阶数低;缺点是存在纹波(Ⅰ 型通带、Ⅱ 型阻带),设计稍复杂。

关键公式

MATLAB 综合案例:切贝雪夫 Ⅰ/Ⅱ 型 vs 巴特沃思 幅频特性对比

设计要求:同 7.5.2,对比同阶数巴特沃思、切贝雪夫 Ⅰ 型、切贝雪夫 Ⅱ 型的幅频特性,直观体现纹波和过渡带差异。

复制代码
% 7.5.3 模拟切贝雪夫Ⅰ/Ⅱ型 vs 巴特沃思 幅频特性对比(同阶数)
clear; clc; close all;

% 1. 定义技术指标(与巴特沃思案例一致)
Omega_p = 100; Alpha_p = 3; Omega_s = 200; Alpha_s = 40;

% 2. 先计算巴特沃思最小阶数,作为对比的统一阶数
[N, Omega_c_butt] = buttord(Omega_p, Omega_s, Alpha_p, Alpha_s, 's');
fprintf('统一对比阶数:N = %d\n', N);

% 3. 设计三类模拟低通滤波器(同阶数N)
% 3.1 巴特沃思
[b_butt, a_butt] = butter(N, Omega_c_butt, 's');
% 3.2 切贝雪夫Ⅰ型(通带纹波3dB)
[b_cheb1, a_cheb1] = cheby1(N, Alpha_p, Omega_p, 's');
% 3.3 切贝雪夫Ⅱ型(阻带纹波40dB)
[b_cheb2, a_cheb2] = cheby2(N, Alpha_s, Omega_s, 's');

% 4. 计算幅频响应
Omega = 0:0.1:500;
[H_butt, w] = freqs(b_butt, a_butt, Omega); mag_butt = 20*log10(abs(H_butt));
[H_cheb1, w] = freqs(b_cheb1, a_cheb1, Omega); mag_cheb1 = 20*log10(abs(H_cheb1));
[H_cheb2, w] = freqs(b_cheb2, a_cheb2, Omega); mag_cheb2 = 20*log10(abs(H_cheb2));

% 5. 绘制对比图
figure('Name','同阶数-巴特沃思vs切贝雪夫Ⅰ型vs切贝雪夫Ⅱ型 幅频特性对比');
hold on; grid on; box on;
plot(Omega, mag_butt, 'r', 'LineWidth',1.5, 'DisplayName','巴特沃思(通带无纹波)');
plot(Omega, mag_cheb1, 'g', 'LineWidth',1.5, 'DisplayName','切贝雪夫Ⅰ型(通带等纹波)');
plot(Omega, mag_cheb2, 'b', 'LineWidth',1.5, 'DisplayName','切贝雪夫Ⅱ型(阻带等纹波)');

% 标注指标线
plot([Omega_p, Omega_p], [-100, 5], 'k--', 'LineWidth',1, 'DisplayName','通带截止');
plot([Omega_s, Omega_s], [-100, 5], 'm--', 'LineWidth',1, 'DisplayName','阻带截止');
plot([0, 500], [-Alpha_p, -Alpha_p], 'c--', 'LineWidth',1, 'DisplayName','通带衰减(3dB)');
plot([0, 500], [-Alpha_s, -Alpha_s], 'y--', 'LineWidth',1, 'DisplayName','阻带衰减(40dB)');

% 图形标注
xlabel('模拟角频率 Ω (rad/s)');
ylabel('幅频响应 (dB)');
title(sprintf('同阶数N=%d 模拟低通滤波器幅频特性对比', N));
legend('Location','best');
ylim([-80, 5]);

运行效果

生成 1 个窗口,清晰展示同阶数下三类滤波器的核心差异:

  1. 切贝雪夫 Ⅰ/Ⅱ 型过渡带远窄于巴特沃思;
  2. 切贝雪夫 Ⅰ 型通带存在等纹波,阻带单调衰减;
  3. 切贝雪夫 Ⅱ 型通带平坦无纹波,阻带存在等纹波;
  4. 巴特沃思通带和阻带均无纹波,但过渡带最宽。

*7.5.4 椭圆函数低通滤波器 (考尔滤波器) 简介

椭圆(Elliptic)滤波器又称考尔(Cauer)滤波器 ,是过渡带最窄 的模拟滤波器,核心特点是通带和阻带均为等纹波,以双纹波换取极致的过渡带特性。

核心特性

适用场景

对硬件资源受限(要求低阶数)、过渡带要求极窄的工程场景(如通信系统的信道滤波)。

*7.5.5 贝塞尔低通滤波器简介

贝塞尔(Bessel)滤波器又称汤姆逊(Thomson)滤波器 ,是唯一以相位特性为优化目标 的经典模拟滤波器,核心特点是通带内相位线性度最高,群时延近似恒定。

核心特性

  1. 幅频特性:通带平坦度略差于巴特沃思,阻带单调衰减,过渡带较宽;
  2. 相位特性:通带内群时延近似恒定(线性相位),输出信号的相位失真最小;
  3. 极点分布:在 s 左半平面的贝塞尔多项式的根上,分布靠近虚轴;
  4. 优缺点:线性相位、相位失真小;缺点是幅频特性性能差(过渡带宽、衰减慢),相同幅频指标下阶数最高。

适用场景

对信号相位失真要求严格的场景(如脉冲信号传输、雷达信号处理),优先保证信号的时域波形不失真,而非幅频特性。

7.5.6 五类模拟滤波器的比较

五类经典模拟低通原型滤波器的核心性能对比,表格清晰总结,方便快速选型:

滤波器类型 幅频特性 相位特性 阶数(相同指标) 设计复杂度 核心优势 核心劣势 适用场景
巴特沃思 通带无纹波、阻带单调 非线性 中等 通带平坦、设计简单、稳定性好 过渡带较宽 对纹波敏感、过渡带要求一般
切贝雪夫 Ⅰ 型 通带等纹波、阻带单调 非线性(较强) 较低 中等 过渡带窄、阶数较低 通带有纹波 通带纹波可容忍、过渡带要求窄
切贝雪夫 Ⅱ 型 通带无纹波、阻带等纹波 非线性(较强) 较低 中等 通带平坦、过渡带窄 阻带有纹波 阻带纹波可容忍、过渡带要求窄
椭圆 通带 / 阻带均等纹波 非线性(最严重) 最低 过渡带最窄、阶数最低 双纹波、相位失真大 低阶数、极窄过渡带要求
贝塞尔 通带略差、阻带单调 线性(通带) 最高 中等 相位失真小、群时延恒定 过渡带宽、衰减慢 对相位失真要求严格的场景

选型核心原则

  1. 优先看纹波要求:不允许任何纹波→巴特沃思 / 贝塞尔;通带纹波可容忍→切贝雪夫 Ⅰ 型;阻带纹波可容忍→切贝雪夫 Ⅱ 型;双纹波可容忍→椭圆;
  2. 次看过渡带要求:极窄过渡带→椭圆;窄过渡带→切贝雪夫;一般过渡带→巴特沃思;
  3. 最后看相位要求:线性相位→贝塞尔;
  4. 硬件资源受限→椭圆(低阶数);设计复杂度要求低→巴特沃思。

7.6 模拟频域频带变换

变换的核心要求:

  1. 保持滤波器稳定性:s 平面左半平面的极点映射为 s 平面左半平面;
  2. 保持幅频特性的形状:仅改变频率的缩放和映射,不改变纹波、衰减特性;
  3. 归一化低通的通带(|Ω|≤1)映射为目标滤波器的通带,阻带映射为阻带。

7.6.1 从归一化模拟低通到模拟低通的变换

低通→低通(LP→LP) :将归一化低通原型转换为 ** 任意截止频率Ωc​** 的实际模拟低通滤波器,是最简单的频带变换(频率缩放)。

变换公式

关键说明

本质是复频率的线性缩放,仅改变截止频率,不改变滤波器的阶数、纹波、衰减特性,即 "去归一化" 过程。

7.6.2 从归一化模拟低通到模拟高通的变换

低通→高通(LP→HP) :将归一化低通原型转换为截止频率Ωc​的模拟高通滤波器,核心是频率取反 + 缩放(将低通的低频通带映射为高通的高频通带)。

变换公式

频率映射关系

7.6.3 从归一化模拟低通到模拟带通的变换

7.6.4 从归一化模拟低通到模拟带阻的变换

MATLAB 综合案例:模拟频域频带变换(低通→高通 / 带通 / 带阻)

基于 7.5.2 设计的巴特沃思模拟低通原型(Ωc​=100rad/s,N=7),通过 MATLAB 实现低通→高通(Ωc​=200rad/s)、低通→带通(Ω0​=150rad/s,B=50rad/s)、低通→带阻(Ω0​=150rad/s,B=50rad/s),并绘制幅频特性对比图。

Matlab 复制代码
% 7.6 模拟频域频带变换(LP→HP/BP/BS)+ 幅频特性对比
clear; clc; close all;  % 清理工作区、命令行,关闭所有已有绘图窗口

% 1. 设计原始模拟低通滤波器(巴特沃思,N=7,Omega_c=100rad/s)
N = 7; Omega_c_LP = 100;
[b_LP, a_LP] = butter(N, Omega_c_LP, 's');  % 's'指定设计模拟滤波器

% 2. 定义目标滤波器核心指标
Omega_c_HP = 200;          % 高通截止频率 (rad/s)
Omega0_BP = 150; B_BP = 50;% 带通:中心频率、带宽 (rad/s)
Omega0_BS = 150; B_BS = 50;% 带阻:中心频率、带宽 (rad/s)
Omega = 0:0.1:400;         % 频率扫描范围,覆盖通带+阻带 (rad/s)

% 3. 基于频带变换设计各类模拟滤波器(同阶数N=7,保证对比公平性)
[b_HP, a_HP] = butter(N, Omega_c_HP, 'high', 's');  % 模拟高通
[b_BP, a_BP] = butter(N, [Omega0_BP-B_BP/2, Omega0_BP+B_BP/2], 'bandpass', 's');  % 模拟带通
[b_BS, a_BS] = butter(N, [Omega0_BS-B_BS/2, Omega0_BS+B_BS/2], 'stop', 's');   % 模拟带阻:关键字改为'stop'(核心修复)

% 4. 计算幅频响应(模拟滤波器用freqs,数字用freqz)
[H_LP, ~] = freqs(b_LP, a_LP, Omega); mag_LP = 20*log10(abs(H_LP));
[H_HP, ~] = freqs(b_HP, a_HP, Omega); mag_HP = 20*log10(abs(H_HP));
[H_BP, ~] = freqs(b_BP, a_BP, Omega); mag_BP = 20*log10(abs(H_BP));
[H_BS, ~] = freqs(b_BS, a_BS, Omega); mag_BS = 20*log10(abs(H_BS));

% 5. 绘制4个子图对比(同窗口,统一格式)
figure('Name','模拟频域频带变换- LP→HP/BP/BS 幅频特性对比','Position',[100,100,1000,600]);
% 5.1 原始模拟低通
subplot(2,2,1); hold on; grid on; box on;
plot(Omega, mag_LP, 'r', 'LineWidth',1.5);
title('模拟低通(Ω_c=100rad/s)');
xlabel('模拟角频率 Ω (rad/s)'); ylabel('幅频响应 (dB)');
ylim([-80,5]);  % 限定纵轴,突出衰减特性
% 5.2 模拟高通
subplot(2,2,2); hold on; grid on; box on;
plot(Omega, mag_HP, 'g', 'LineWidth',1.5);
title('模拟高通(Ω_c=200rad/s)');
xlabel('模拟角频率 Ω (rad/s)'); ylabel('幅频响应 (dB)');
ylim([-80,5]);
% 5.3 模拟带通
subplot(2,2,3); hold on; grid on; box on;
plot(Omega, mag_BP, 'b', 'LineWidth',1.5);
title(sprintf('模拟带通(Ω0=%d, B=%drad/s)',Omega0_BP,B_BP));
xlabel('模拟角频率 Ω (rad/s)'); ylabel('幅频响应 (dB)');
ylim([-80,5]);
% 5.4 模拟带阻
subplot(2,2,4); hold on; grid on; box on;
plot(Omega, mag_BS, 'm', 'LineWidth',1.5);
title(sprintf('模拟带阻(Ω0=%d, B=%drad/s)',Omega0_BS,B_BS));
xlabel('模拟角频率 Ω (rad/s)'); ylabel('幅频响应 (dB)');
ylim([-80,5]);

% 总标题(统一说明对比条件)
sgtitle('模拟频域频带变换结果对比(巴特沃思滤波器,统一阶数N=7)');

运行效果

生成 1 个窗口,包含 4 个子图,分别显示模拟低通、高通、带通、带阻滤波器的幅频特性,直观看到频带变换的效果:低通的低频通带映射为高通的高频通带,带通仅允许中心频率附近的频率通过,带阻抑制中心频率附近的频率。


7.7 间接法的 IIR 数字滤波器设计方案

IIR 数字滤波器经典间接法的核心是模拟低通原型频带变换模拟→数字映射 三个环节的组合,分为两种核心设计方案 ,是后续所有设计的基础,流程图清晰展示两种方案的流程:

方案核心说明

  1. 方案 1(7.9 讲解) :先在模拟域完成频带变换(得到所需类型的模拟滤波器),再转换为数字滤波器,是最经典、最常用的方案,步骤清晰、易验证;
  2. 方案 2(7.11 讲解):先将模拟低通原型转换为数字低通滤波器,再在数字域进行频带变换得到其他类型数字滤波器,适用于需要多次数字域变换的场景;
  3. 直接变换(7.10 讲解) :跳过单独的模拟频带变换,将模拟低通原型通过一次复合变换直接转换为各类数字滤波器(LP→HP/BP/BS),步骤更简洁,工程中应用广泛。

所有方案的基础均为模拟低通原型设计模拟→数字的有效映射(保证稳定性和频率特性)。


7.8 模拟滤波器到数字滤波器的映射方法

主流的映射方法有冲激响应不变法阶跃响应不变法双线性变换法 ,其中冲激响应不变法双线性变换法为最常用的两种,阶跃响应不变法为冲激响应不变法的延伸。

7.8.1 冲激 (脉冲) 响应不变法

核心思想

使数字滤波器的单位冲激响应 h (n) 等于模拟滤波器的单位冲激响应 g (t)采样时刻 t=nT的采样值,即:h(n)=g(nT)=g(t)∣t=nT​

其中,T 为采样周期,fs​=1/T为采样频率。

映射关系

核心特性

  1. 频率线性映射:无频率畸变,能准确保持模拟滤波器的幅频特性;
  2. 存在频率混叠 :由于g(t)为无限长,采样后会产生混叠,仅适用于模拟低通 / 带通滤波器 (高频衰减快,混叠小),不能用于模拟高通 / 带阻滤波器(高频有通带,混叠严重);
  3. 稳定性保持:s 左半平面→z 单位圆内,稳定的模拟滤波器→稳定的数字滤波器;
  4. 增益与 T 相关:H(z)的增益随 T 变化,一般取 T=1 简化计算。

优缺点

优点:频率线性映射,幅频特性无畸变,设计简单;

缺点:存在频率混叠,仅适用于低通 / 带通滤波器,增益与采样周期相关。

7.8.2 阶跃响应不变法

核心思想

核心特性

适用场景

对数字滤波器的阶跃响应(时域特性)要求严格的低通 / 带通滤波场景。

7.8.3 双线性变换法

核心思想

为解决冲激响应不变法的频率混叠问题 ,采用单值映射 (s 平面与 z 平面一一对应),通过两次线性变换(双线性)实现模拟→数字的映射,彻底消除混叠。

映射关系

核心特性

频率预畸变(核心解决非线性畸变)

为补偿双线性变换的频率非线性,需在设计前进行频率预畸变

优缺点

优点:无频率混叠,适用于所有类型滤波器,设计简单、稳定性好;

缺点:存在频率非线性畸变,需通过预畸变补偿。

MATLAB 综合案例:冲激响应不变法 vs 双线性变换法 设计 IIR 数字低通 + 幅频特性对比

复制代码
% 7.8 冲激响应不变法 vs 双线性变换法 设计IIR数字低通 + 幅频特性对比
clear; clc; close all;

% 1. 定义数字滤波器技术指标
fs = 1000; T = 1/fs; % 采样频率、采样周期
fp = 100; fsig = 200;% 通带、阻带实际频率 (Hz)
wp = 2*pi*fp/fs;     % 通带数字角频率 (rad)
ws = 2*pi*fsig/fs;   % 阻带数字角频率 (rad)
Ap = 3; As = 40;     % 通带、阻带衰减 (dB)
NFFT = 1024;         % FFT点数,提高幅频特性分辨率
f = (0:NFFT/2-1)*fs/NFFT; % 实际频率轴(Hz)

% 2. 冲激响应不变法设计
% 2.1 频率转换(线性,Omega=omega/T)
Omega_p_imp = wp/T; Omega_s_imp = ws/T;
% 2.2 计算阶数和截止频率
[N_imp, Omega_c_imp] = buttord(Omega_p_imp, Omega_s_imp, Ap, As, 's');
% 2.3 设计模拟低通
[b_imp, a_imp] = butter(N_imp, Omega_c_imp, 's');
% 2.4 冲激响应不变法转换为数字滤波器
[bz_imp, az_imp] = impinvar(b_imp, a_imp, fs); % impinvar:冲激响应不变法函数
% 2.5 计算数字幅频响应
[H_imp, w_imp] = freqz(bz_imp, az_imp, NFFT);
mag_imp = 20*log10(abs(H_imp));

% 3. 双线性变换法设计(带频率预畸变)
% 3.1 频率预畸变:Omega = (2/T)*tan(omega/2)
Omega_p_blr = (2/T)*tan(wp/2); Omega_s_blr = (2/T)*tan(ws/2);
% 3.2 计算阶数和截止频率
[N_blr, Omega_c_blr] = buttord(Omega_p_blr, Omega_s_blr, Ap, As, 's');
% 3.3 设计模拟低通
[b_blr, a_blr] = butter(N_blr, Omega_c_blr, 's');
% 3.4 双线性变换转换为数字滤波器
[bz_blr, az_blr] = bilinear(b_blr, a_blr, fs); % bilinear:双线性变换法函数
% 3.5 计算数字幅频响应
[H_blr, w_blr] = freqz(bz_blr, az_blr, NFFT);
mag_blr = 20*log10(abs(H_blr));

% 4. 绘制幅频特性对比图(频率轴为实际频率Hz,更直观)
figure('Name','冲激响应不变法 vs 双线性变换法 IIR数字低通 幅频特性对比');
hold on; grid on; box on;
plot(f, mag_imp(1:NFFT/2), 'r', 'LineWidth',1.5, 'DisplayName','冲激响应不变法');
plot(f, mag_blr(1:NFFT/2), 'g', 'LineWidth',1.5, 'DisplayName','双线性变换法(预畸变)');

% 标注指标线
plot([fp, fp], [-100, 5], 'k--', 'LineWidth',1, 'DisplayName','通带截止(100Hz)');
plot([fsig, fsig], [-100, 5], 'm--', 'LineWidth',1, 'DisplayName','阻带截止(200Hz)');
plot([0, fs/2], [-Ap, -Ap], 'c--', 'LineWidth',1, 'DisplayName','通带衰减(3dB)');
plot([0, fs/2], [-As, -As], 'y--', 'LineWidth',1, 'DisplayName','阻带衰减(40dB)');

% 图形标注
xlabel('实际频率 f (Hz)');
ylabel('幅频响应 (dB)');
title('IIR数字低通滤波器-冲激响应不变法 vs 双线性变换法 对比');
legend('Location','best');
ylim([-80, 5]);
xlim([0, 300]); % 限定频率范围,突出混叠区域

运行效果

生成 1 个窗口,对比两种方法的幅频特性:

  1. 冲激响应不变法 :幅频特性在低频段线性度好,但在高频段(200Hz 以上)存在轻微混叠(阻带衰减略有下降);
  2. 双线性变换法:无混叠现象,阻带衰减始终满足 40dB 要求,且通过预畸变补偿后,通带 / 阻带截止频率完全符合目标指标;
  3. 两种方法的通带特性均满足要求,双线性变换法的整体性能更优(无混叠)。

7.9 数字滤波器设计的第一种方案

第一种方案最经典的 IIR 数字滤波器设计方案 ,即:归一化模拟低通原型 → 模拟频域频带变换 → 模拟滤波器 → 模拟→数字映射 → 数字滤波器,对应 7.7 中的方案 1。

完整设计流程

核心步骤说明

  1. 指标转换:将数字频率ω转换为模拟频率Ω,冲激响应不变法用Ω=ω/T,双线性变换法用Ω=(2/T)tan(ω/2)(预畸变);
  2. 模拟频带变换:根据目标数字滤波器的类型(高通 / 带通 / 带阻),将归一化模拟低通原型转换为对应类型的模拟滤波器;
  3. 模拟→数字映射:选择合适的映射方法(低通 / 带通用冲激不变法,所有类型用双线性变换法),将模拟滤波器转换为数字滤波器;
  4. 验证指标:通过freqz函数计算 H (z) 的幅频 / 相频特性,检查是否满足数字滤波器的技术指标,若不满足则调整阶数或重新设计。

适用场景

所有类型的 IIR 数字滤波器设计,步骤清晰、易验证,是教材和工程中最常用的方案,适合初学者掌握。


7.10 模拟低通滤波器直接变换成四种通带数字滤波器

该方法为第一种方案的简化版 ,跳过单独的模拟频域频带变换 ,将归一化模拟低通原型 通过一次复合变换 (模拟频带变换 + 模拟→数字映射)直接转换为数字低通 / 高通 / 带通 / 带阻滤波器,即:G(p)→H(z),一次变换完成,步骤更简洁,工程中应用广泛。

7.10.1 模拟低通→数字带通

7.10.2 模拟低通→数字带阻

7.10.3 模拟低通→数字高通

核心优势

  1. 步骤简洁:一次变换完成,无需单独设计模拟高通 / 带通 / 带阻滤波器,减少计算量;
  2. 无中间误差:避免多次变换带来的误差累积,设计精度更高;
  3. 适用于所有类型:基于双线性变换的复合变换无混叠,适用于数字高通 / 带通 / 带阻滤波器设计。

MATLAB 综合案例:模拟低通直接变换为数字带通滤波器

复制代码
% 7.10.1 模拟低通→数字带通 直接变换设计
clear; clc; close all;

% 1. 定义数字带通滤波器指标
fs = 1000; f0 = 200; B = 100; % 采样频率、中心频率、带宽 (Hz)
omega0 = 2*pi*f0/fs;          % 中心数字角频率
omegab = 2*pi*B/fs;           % 带宽数字角频率
Ap = 3; As = 40;              % 衰减指标
NFFT = 1024; f = (0:NFFT/2-1)*fs/NFFT;

% 2. 直接设计数字带通滤波器(基于模拟低通原型直接变换)
[N, Wn] = buttord([f0-B/2, f0+B/2], [f0-B, f0+B], Ap, As, 's');
[bz, az] = butter(N, Wn, 'bandpass', 's');
[bz, az] = bilinear(bz, az, fs); % 双线性变换直接转换为数字滤波器

% 3. 计算幅频响应
[H, w] = freqz(bz, az, NFFT);
mag_dB = 20*log10(abs(H));

% 4. 绘制幅频特性图
figure('Name','模拟低通直接变换-数字带通滤波器幅频特性');
hold on; grid on; box on;
plot(f, mag_dB(1:NFFT/2), 'b', 'LineWidth',1.5);
% 标注指标线
plot([f0-B/2, f0-B/2], [-100,5], 'k--', 'LineWidth',1);
plot([f0+B/2, f0+B/2], [-100,5], 'k--', 'LineWidth',1);
plot([0, fs/2], [-Ap, -Ap], 'c--', 'LineWidth',1);
plot([0, fs/2], [-As, -As], 'y--', 'LineWidth',1);
xlabel('频率 f (Hz)');
ylabel('幅频响应 (dB)');
title(sprintf('数字带通滤波器(f0=%dHz, B=%dHz, fs=%dHz)',f0,B,fs));
ylim([-80,5]);
xlim([0, 400]);

运行效果

生成 1 个窗口,显示直接变换设计的数字带通滤波器幅频特性,仅允许 200Hz 附近 ±50Hz 的频率通过,阻带衰减满足 40dB 要求,无混叠现象。


7.11 数字滤波器设计的第二种方案

第二种方案 为:归一化模拟低通原型 → 模拟→数字映射 → 数字低通滤波器 → 数字频域频带变换 → 数字高通 / 带通 / 带阻滤波器,对应 7.7 中的方案 2。

核心步骤说明

  1. 先将模拟低通原型转换为数字低通滤波器 H_LP (z)(基础滤波器);
  2. 再通过数字域的频带变换,将 H_LP (z) 转换为目标类型的数字滤波器(高通 / 带通 / 带阻);
  3. 数字频域频带变换的核心是复频率变换z=F(Z)(Z 为目标数字滤波器的复频率),保持 z 平面单位圆映射为 Z 平面单位圆,保证稳定性和频率特性。

核心优势

  1. 仅需设计一个数字低通原型 H_LP (z),即可通过数字频带变换得到任意类型的数字滤波器,适用于需要批量设计滤波器的场景;
  2. 数字频域变换在计算机上实现更灵活,可通过 MATLAB 工具箱直接完成;
  3. 无模拟域的中间步骤,减少模拟→数字的误差。

适用场景

需要设计多个不同类型但指标相近的数字滤波器,或需要在数字域灵活调整滤波器类型的场景。


7.12 数字频域频带变换

7.12.1 数字频域频带变换的基本要求

与模拟频域变换类似,数字频域变换需满足四个核心要求,保证滤波器的性能和稳定性:

通用变换公式

7.12.2 数字低通→数字低通

LP→LP :将数字低通原型HL​P(z)(截止频率ωp​)转换为任意截止频率Ωp​的数字低通滤波器H(Z),为数字频率的缩放

变换公式

频率映射

7.12.3 数字低通→数字高通

LP→HP :将数字低通原型转换为截止频率Ωp​的数字高通滤波器,核心是数字频率的反转(低通的低频通带→高通的高频通带)。

变换公式

频率映射

7.12.4 数字低通→数字带通

LP→BP:将数字低通原型转换为 ** 中心频率Ω0​、带宽B** 的数字带通滤波器,带通的两个截止频率为Ω1​和Ω2​,满足B=Ω2​−Ω1​,Ω0​=(Ω1​+Ω2​)/2。

变换公式

关键说明

带通滤波器的阶数 为原数字低通阶数的2 倍,与模拟频域变换一致。

7.12.5 数字低通→数字带阻

LP→BS:将数字低通原型转换为 ** 中心频率Ω0​、阻带带宽B** 的数字带阻滤波器,带阻的两个截止频率为Ω1​和Ω2​,满足B=Ω2​−Ω1​,Ω0​=(Ω1​+Ω2​)/2。

变换公式

关键说明

带阻滤波器的阶数 也为原数字低通阶数的2 倍

7.13 数字低通→数字多通带

数字低通→数字多通带是数字频域频带变换的扩展 ,将数字低通原型转换为多个通带 的数字滤波器(如双通带、三通带),适用于多信道滤波(如通信系统的多载波滤波)。

核心特性

  1. 多通带滤波器的阶数 为原数字低通阶数的2M 倍(M 为通带数 - 1);
  2. 变换公式为更高阶的全通函数,设计复杂,需借助计算机(MATLAB)实现;
  3. 每个通带的频率特性与原数字低通原型一致,纹波和衰减特性保持不变。

适用场景

通信系统的多信道滤波、雷达信号的多频率检测、音频信号的多频段处理等。

MATLAB 综合案例:数字频域频带变换(低通→高通 / 带通)+ 幅频特性对比

基于设计的数字低通原型(ωp​=0.2π,N=7),通过 MATLAB 实现数字低通→高通(ωp​=0.8π)、数字低通→带通(ω0​=0.5π,B=0.2π),并绘制幅频特性对比图。

复制代码
% 7.12 数字频域频带变换(LP→HP/BP)+ 幅频特性对比
clear; clc; close all;

% 1. 设计数字低通原型滤波器(巴特沃思,wp=0.2π,Ap=3dB,As=40dB)
wp_LP = 0.2*pi; ws_LP = 0.4*pi; Ap=3; As=40;
[N, Wn_LP] = buttord(wp_LP/pi, ws_LP/pi, Ap, As);
[bz_LP, az_LP] = butter(N, Wn_LP); % 数字低通原型
fs = 1000; NFFT=1024; f=(0:NFFT/2-1)*fs/NFFT;

% 2. 定义目标滤波器指标
wp_HP = 0.8*pi; % 高通截止频率
wp_BP1 = 0.4*pi; wp_BP2 = 0.6*pi; % 带通上下截止频率(中心0.5π,带宽0.2π)

% 3. 设计数字高通和带通滤波器(数字频域变换)
[N_HP, Wn_HP] = buttord(wp_HP/pi, (wp_HP-0.2*pi)/pi, Ap, As);
[bz_HP, az_HP] = butter(N, Wn_HP, 'high'); % 低通→高通
[N_BP, Wn_BP] = buttord([wp_BP1/pi, wp_BP2/pi], [0.3, 0.7], Ap, As);
[bz_BP, az_BP] = butter(N, Wn_BP, 'bandpass'); % 低通→带通

% 4. 计算幅频响应
[H_LP, w] = freqz(bz_LP, az_LP, NFFT); mag_LP=20*log10(abs(H_LP));
[H_HP, w] = freqz(bz_HP, az_HP, NFFT); mag_HP=20*log10(abs(H_HP));
[H_BP, w] = freqz(bz_BP, az_BP, NFFT); mag_BP=20*log10(abs(H_BP));

% 5. 绘制对比图(3个子图,同窗口)
figure('Name','数字频域频带变换-LP→HP/BP 幅频特性对比');
set(gcf,'Position',[100,100,900,600]);

% 5.1 数字低通原型
subplot(2,2,1); hold on; grid on; box on;
plot(w/pi, mag_LP, 'r', 'LineWidth',1.5);
title('数字低通原型(ωp=0.2π)');
xlabel('归一化数字频率 (ω/π)'); ylabel('幅频响应 (dB)');
ylim([-80,5]);

% 5.2 数字高通
subplot(2,2,2); hold on; grid on; box on;
plot(w/pi, mag_HP, 'g', 'LineWidth',1.5);
title('数字高通(ωp=0.8π)');
xlabel('归一化数字频率 (ω/π)'); ylabel('幅频响应 (dB)');
ylim([-80,5]);

% 5.3 数字带通
subplot(2,2,3); hold on; grid on; box on;
plot(w/pi, mag_BP, 'b', 'LineWidth',1.5);
title('数字带通(ω0=0.5π, B=0.2π)');
xlabel('归一化数字频率 (ω/π)'); ylabel('幅频响应 (dB)');
ylim([-80,5]);

sgtitle('数字频域频带变换结果对比(巴特沃思N=7)');

运行效果

生成 1 个窗口,包含 3 个子图,分别显示数字低通原型、高通、带通滤波器的幅频特性,直观看到数字频域变换的效果:低通的低频通带映射为高通的高频通带,带通仅允许 0.5π 附近的频率通过。


*7.14 IIR 滤波器的计算机辅助设计法

前面的经典间接法均依赖模拟滤波器设计,而计算机辅助设计法直接在数字域设计 IIR 滤波器 ,无需借助模拟滤波器,通过数值优化算法 求解满足数字域指标的系统函数H(z),适用于经典方法无法满足的特殊指标要求(如任意幅频特性、线性相位 IIR 滤波器)。

该方法的核心是将滤波器设计问题转化为优化问题 :定义误差函数(如实际幅频特性与目标幅频特性的均方误差),通过优化算法最小化误差函数,得到H(z)的系数。

7.14.1 IIR 滤波器的时域直接设计

核心思想

设计方法

优缺点

优点:直接针对时域指标设计,时域波形失真小;缺点:频域特性难以控制,易出现不稳定问题(需额外约束极点在单位圆内)。

7.14.2 IIR 滤波器的频域最小均方误差设计法

核心思想

优缺点

优点:频域特性控制精准,适用于任意幅频特性设计;

缺点:优化过程复杂,需迭代计算,相位特性不可控。

7.14.3 IIR 滤波器的频域最小 p 误差设计法

核心思想

优缺点

优点:频域特性更优,能有效抑制大误差,适用于高精度滤波要求;

缺点:优化算法更复杂,计算量更大,需借助专业软件(MATLAB/Mathematica)实现。

关键说明

MATLAB 的 **yulewalk** 函数是实现 IIR 滤波器计算机辅助设计的常用工具,可根据目标幅频特性直接设计 IIR 滤波器,无需手动优化。

MATLAB 综合案例:基于 yulewalk 的 IIR 滤波器计算机辅助设计(任意幅频特性)

设计要求:设计一个多频段 IIR 滤波器 ,目标幅频特性为:0~0.2π(通带,增益 1)、0.2π~0.4π(阻带,增益 0)、0.4π~0.6π(通带,增益 0.5)、0.6π~π(阻带,增益 0),通过yulewalk函数直接设计,绘制目标幅频特性实际幅频特性对比图。

Matlab 复制代码
% 7.14 IIR滤波器计算机辅助设计(yulewalk,任意幅频特性)
clear; clc; close all;  % 清理工作区、命令行,关闭所有已有绘图窗口

% 1. 定义目标幅频特性:归一化频率点 + 对应增益(yulewalk核心输入)
% 频率f:0~1(对应数字角频率0~π),需成对定义(保证分段常数特性)
f = [0, 0.2, 0.2, 0.4, 0.4, 0.6, 0.6, 1]; 
% 增益m:与f一一对应,0=全衰减,1=全通,0.5=半通(线性刻度,非dB)
m = [1, 1, 0, 0, 0.5, 0.5, 0, 0];         

% 2. 设定yulewalk滤波器阶数(仅需指定分母阶数N,分子阶数自动为N-1)
N = 11;  % 原M=10为冗余参数,yulewalk默认分子阶数=分母阶数-1

% 3. 基于yulewalk设计任意幅频特性的IIR数字滤波器
[bz, az] = yulewalk(N, f, m);  % bz=分子系数,az=分母系数

% 4. 计算实际幅频特性(1024点高分辨率,保证曲线平滑)
[H, w] = freqz(bz, az, 1024);  % 数字滤波器用freqz,模拟用freqs
mag = abs(H);                  % 提取幅频响应(线性刻度)

% 5. 绘制「目标幅频特性」与「实际幅频特性」对比图
figure('Name','IIR滤波器计算机辅助设计-目标vs实际幅频特性','Position',[100,100,900,600]);
hold on; grid on; box on;  % 保持绘图、显示网格、显示边框
% 绘制目标幅频特性(红色虚线,粗线突出,便于对比)
plot(f, m, 'r--', 'LineWidth',2.5, 'DisplayName','目标幅频特性');
% 绘制实际幅频特性(蓝色实线,平滑曲线,显示设计效果)
plot(w/pi, mag, 'b', 'LineWidth',1.8, 'DisplayName','实际幅频特性');

% 坐标轴与图例设置(清晰标注,提升可读性)
xlabel('归一化数字频率 (ω/π)','FontSize',11);  % 频率轴标注(0~1对应0~π)
ylabel('幅频响应(线性刻度)','FontSize',11);    % 增益轴标注(0~1)
title(sprintf('IIR滤波器计算机辅助设计(yulewalk,分母阶数N=%d)',N),'FontSize',12);
legend('Location','best','FontSize',10);  % 图例自动放在最优位置
ylim([-0.1, 1.1]);  % 限定纵轴范围,避免增益溢出,突出细节
xlim([0, 1]);       % 限定横轴范围,匹配归一化频率定义

运行效果

生成 1 个窗口,显示目标幅频特性(阶梯状)和实际幅频特性(平滑逼近),设计的 IIR 滤波器能较好地逼近任意定义的幅频特性,验证了计算机辅助设计法的灵活性。


7.15 本章部分内容涉及的 MATLAB 函数及例题

MATLAB 是 IIR 数字滤波器设计的核心工具 ,提供了丰富的工具箱函数(Signal Processing Toolbox),可快速实现从模拟滤波器设计到数字滤波器设计、频带变换、特性分析的全流程,同时支持自编程序实现底层设计,加深对原理的理解。

本节总结本章核心的 MATLAB 函数,并提供自编程序 + 工具箱函数的完整例题,所有代码可直接运行,配套详细注释。

7.15.1 自编程序设计四类模拟滤波器(巴特沃思 / 切贝雪夫 Ⅰ/Ⅱ/ 椭圆)

自编程序实现模拟滤波器的底层设计,包括阶数计算、极点求解、系统函数构造,深入理解模拟滤波器的设计原理,以低通滤波器为例,支持巴特沃思、切贝雪夫 Ⅰ 型、切贝雪夫 Ⅱ 型、椭圆四类滤波器。

复制代码
% 7.15.1 自编程序设计四类模拟低通滤波器(巴特沃思/切贝雪夫Ⅰ/Ⅱ/椭圆)
clear; clc; close all;

% 1. 定义通用技术指标
Omega_p = 100; Alpha_p = 3; Omega_s = 200; Alpha_s = 40; % 同7.5.2
Omega = 0:0.1:500; colors = ['r','g','b','m']; filter_types = {'巴特沃思','切贝雪夫Ⅰ型','切贝雪夫Ⅱ型','椭圆'};

% 2. 自编函数设计四类滤波器(核心:阶数计算+极点求解+系统函数构造)
figure('Name','自编程序-四类模拟低通滤波器幅频特性对比');
hold on; grid on; box on;

% 2.1 巴特沃思
[N_butt, Omega_c_butt] = buttord(Omega_p, Omega_s, Alpha_p, Alpha_s, 's');
[p_butt, z_butt, k_butt] = buttap(N_butt); % 归一化原型极点
[b_butt, a_butt] = zp2tf(p_butt, z_butt, k_butt); % 归一化系统函数
[b_butt, a_butt] = lp2lp(b_butt, a_butt, Omega_c_butt); % 去归一化
[H_butt, w] = freqs(b_butt, a_butt, Omega);
plot(Omega, 20*log10(abs(H_butt)), colors(1), 'LineWidth',1.5, 'DisplayName',filter_types{1});

% 2.2 切贝雪夫Ⅰ型
[N_cheb1, Omega_c_cheb1] = cheb1ord(Omega_p, Omega_s, Alpha_p, Alpha_s, 's');
[p_cheb1, z_cheb1, k_cheb1] = cheb1ap(N_cheb1, Alpha_p);
[b_cheb1, a_cheb1] = zp2tf(p_cheb1, z_cheb1, k_cheb1);
[b_cheb1, a_cheb1] = lp2lp(b_cheb1, a_cheb1, Omega_c_cheb1);
[H_cheb1, w] = freqs(b_cheb1, a_cheb1, Omega);
plot(Omega, 20*log10(abs(H_cheb1)), colors(2), 'LineWidth',1.5, 'DisplayName',filter_types{2});

% 2.3 切贝雪夫Ⅱ型
[N_cheb2, Omega_c_cheb2] = cheb2ord(Omega_p, Omega_s, Alpha_p, Alpha_s, 's');
[p_cheb2, z_cheb2, k_cheb2] = cheb2ap(N_cheb2, Alpha_s);
[b_cheb2, a_cheb2] = zp2tf(p_cheb2, z_cheb2, k_cheb2);
[b_cheb2, a_cheb2] = lp2lp(b_cheb2, a_cheb2, Omega_c_cheb2);
[H_cheb2, w] = freqs(b_cheb2, a_cheb2, Omega);
plot(Omega, 20*log10(abs(H_cheb2)), colors(3), 'LineWidth',1.5, 'DisplayName',filter_types{3});

% 2.4 椭圆
[N_ellip, Omega_c_ellip] = ellipord(Omega_p, Omega_s, Alpha_p, Alpha_s, 's');
[p_ellip, z_ellip, k_ellip] = ellipap(N_ellip, Alpha_p, Alpha_s);
[b_ellip, a_ellip] = zp2tf(p_ellip, z_ellip, k_ellip);
[b_ellip, a_ellip] = lp2lp(b_ellip, a_ellip, Omega_c_ellip);
[H_ellip, w] = freqs(b_ellip, a_ellip, Omega);
plot(Omega, 20*log10(abs(H_ellip)), colors(4), 'LineWidth',1.5, 'DisplayName',filter_types{4});

% 3. 图形标注
plot([Omega_p,Omega_p],[-100,5],'k--',[Omega_s,Omega_s],[-100,5],'m--');
plot([0,500],[-Alpha_p,-Alpha_p],'c--',[0,500],[-Alpha_s,-Alpha_s],'y--');
xlabel('Ω (rad/s)'); ylabel('幅频响应 (dB)');
title('自编程序-四类模拟低通滤波器幅频特性对比');
legend('Location','best'); ylim([-80,5]);

核心自编函数说明

  1. buttap/cheb1ap/cheb2ap/ellipap:求解归一化模拟低通原型的极点、零点、增益;
  2. zp2tf:将零极点增益形式转换为系统函数的分子分母形式;
  3. lp2lp:低通→低通的频带变换(去归一化);
  4. freqs:计算模拟滤波器的幅频响应。

运行效果

生成 1 个窗口,显示自编程序设计的四类模拟低通滤波器幅频特性,与 7.5.6 的性能对比一致,椭圆滤波器过渡带最窄,巴特沃思通带最平坦。

7.15.2 工具箱中模拟滤波器设计的 MATLAB 函数

MATLAB Signal Processing Toolbox 提供了一站式的模拟滤波器设计函数,支持低通 / 高通 / 带通 / 带阻四类滤波器,覆盖巴特沃思、切贝雪夫 Ⅰ/Ⅱ 型、椭圆、贝塞尔五类滤波器,核心函数总结如下:

1. 阶数和截止频率计算

滤波器类型 函数格式 说明
巴特沃思 [N, Wn] = buttord(Wp, Ws, Ap, As, 's') 计算模拟滤波器阶数 N 和截止频率 Wn
切贝雪夫 Ⅰ 型 [N, Wn] = cheb1ord(Wp, Ws, Ap, As, 's') 通带纹波 Ap,计算阶数和截止频率
切贝雪夫 Ⅱ 型 [N, Wn] = cheb2ord(Wp, Ws, Ap, As, 's') 阻带纹波 As,计算阶数和截止频率
椭圆 [N, Wn] = ellipord(Wp, Ws, Ap, As, 's') 通带纹波 Ap、阻带纹波 As,计算阶数和截止频率
贝塞尔 [N, Wn] = besselord(Wp, Ws, Ap, As, 's') 基于幅频指标计算阶数和截止频率

2. 滤波器设计(直接生成分子分母)

滤波器类型 低通 高通 带通 带阻
巴特沃思 butter(N,Wn,'s') butter(N,Wn,'high','s') butter(N,Wn,'bandpass','s') butter(N,Wn,'bandstop','s')
切贝雪夫 Ⅰ 型 cheby1(N,Ap,Wn,'s') cheby1(N,Ap,Wn,'high','s') cheby1(N,Ap,Wn,'bandpass','s') cheby1(N,Ap,Wn,'bandstop','s')
切贝雪夫 Ⅱ 型 cheby2(N,As,Wn,'s') cheby2(N,As,Wn,'high','s') cheby2(N,As,Wn,'bandpass','s') cheby2(N,As,Wn,'bandstop','s')
椭圆 ellip(N,Ap,As,Wn,'s') ellip(N,Ap,As,Wn,'high','s') ellip(N,Ap,As,Wn,'bandpass','s') ellip(N,Ap,As,Wn,'bandstop','s')
贝塞尔 bessel(N,Wn,'s') bessel(N,Wn,'high','s') bessel(N,Wn,'bandpass','s') bessel(N,Wn,'bandstop','s')

3. 频带变换函数

变换类型 函数 说明
低通→低通 lp2lp(b,a,Wo) 将归一化低通转换为截止频率 Wo 的低通
低通→高通 lp2hp(b,a,Wo) 将归一化低通转换为截止频率 Wo 的高通
低通→带通 lp2bp(b,a,Wo,Bw) 转换为中心频率 Wo、带宽 Bw 的带通
低通→带阻 lp2bs(b,a,Wo,Bw) 转换为中心频率 Wo、带宽 Bw 的带阻

例题:工具箱函数设计模拟带通滤波器

复制代码
% 7.15.2 工具箱函数设计模拟带通滤波器(切贝雪夫Ⅰ型)
clear; clc; close all;
Omega1 = 100; Omega2 = 300; Ap=3; As=40; % 带通上下截止频率、衰减
[N, Wn] = cheb1ord([Omega1,Omega2], [50,350], Ap, As, 's');
[b, a] = cheby1(N, Ap, Wn, 'bandpass', 's'); % 设计模拟带通
Omega = 0:0.1:500; [H,w] = freqs(b,a,Omega);
figure; plot(Omega,20*log10(abs(H))); grid on;
xlabel('Ω (rad/s)'); ylabel('dB'); title('切贝雪夫Ⅰ型模拟带通滤波器');

7.15.3 冲激响应不变法及双线性变换法设计 IIR 数字滤波器

核心函数为impinvar(冲激响应不变法)和bilinear(双线性变换法),已在 7.8 的案例中详细使用,此处总结函数格式和核心参数:

1. 冲激响应不变法

复制代码
[bz, az] = impinvar(b, a, fs);
% 输入:b,a-模拟滤波器分子分母;fs-采样频率(Hz)
% 输出:bz,az-数字滤波器分子分母

2. 双线性变换法

复制代码
[bz, az] = bilinear(b, a, fs);
% 输入:b,a-模拟滤波器分子分母;fs-采样频率(Hz)
% 输出:bz,az-数字滤波器分子分母

关键注意

双线性变换法设计前需频率预畸变,将数字频率转换为模拟频率Ω=(2/T)tan(ω/2)。

7.15.4 数字频带变换法设计数字滤波器的 MATLAB 实现

MATLAB 提供了数字频带变换的专用函数 ,可直接将数字低通转换为其他类型数字滤波器,核心函数为lp2lp/lp2hp/lp2bp/lp2bs(数字版),函数格式:

复制代码
% 数字低通→数字低通
[BZ, AZ] = lp2lp(bz, az, Wo);
% 数字低通→数字高通
[BZ, AZ] = lp2hp(bz, az, Wo);
% 数字低通→数字带通
[BZ, AZ] = lp2bp(bz, az, Wo, Bw);
% 数字低通→数字带阻
[BZ, AZ] = lp2bs(bz, az, Wo, Bw);

参数说明:bz,az为数字低通原型系数;Wo为目标中心频率 / 截止频率(归一化,0~1);Bw为目标带宽(归一化)。

例题:数字频带变换设计数字带阻滤波器

复制代码
% 7.15.4 数字频带变换设计数字带阻滤波器
clear; clc; close all;
% 设计数字低通原型
[N, Wn] = buttord(0.2, 0.3, 3, 40); [bz_LP, az_LP] = butter(N, Wn);
% 低通→带阻(中心0.5π,带宽0.2π)
[bz_BS, az_BS] = lp2bs(bz_LP, az_LP, 0.5, 0.2);
% 幅频特性
[H, w] = freqz(bz_BS, az_BS, 1024);
figure; plot(w/pi,20*log10(abs(H))); grid on;
xlabel('ω/π'); ylabel('dB'); title('数字带阻滤波器(Ω0=0.5π,B=0.2π)');

7.15.5 基于 MATLAB 直接设计各类数字滤波器

MATLAB 提供了直接设计数字 IIR 滤波器的函数 ,无需单独设计模拟滤波器,一步完成,核心函数与模拟滤波器类似,只需去掉's'参数,支持所有类型和滤波器模型,是工程中最常用的方法。

核心函数格式(以巴特沃思为例)

复制代码
% 数字低通
[N, Wn] = buttord(Wp, Ws, Ap, As); [bz, az] = butter(N, Wn);
% 数字高通
[N, Wn] = buttord(Wp, Ws, Ap, As); [bz, az] = butter(N, Wn, 'high');
% 数字带通
[N, Wn] = buttord([Wp1,Wp2], [Ws1,Ws2], Ap, As); [bz, az] = butter(N, Wn, 'bandpass');
% 数字带阻
[N, Wn] = buttord([Wp1,Wp2], [Ws1,Ws2], Ap, As); [bz, az] = butter(N, Wn, 'bandstop');

关键参数

Wp/Ws归一化数字频率(0~1,对应 0~π),如实际频率f=100Hz,fs=1000Hz,则Wp=2∗100/1000=0.2。

例题:直接设计数字椭圆高通滤波器

复制代码
% 7.15.5 基于MATLAB直接设计数字椭圆高通滤波器
clear; clc; close all;
fs=1000; fp=200; fsig=100; Ap=3; As=40; % 采样频率、通带/阻带频率
Wp=2*fp/fs; Ws=2*fsig/fs; % 归一化频率
[N, Wn] = ellipord(Wp, Ws, Ap, As); % 计算阶数和截止频率
[bz, az] = ellip(N, Ap, As, Wn, 'high'); % 直接设计数字高通
% 幅频特性
[H, w] = freqz(bz, az, 1024); f=(0:511)*fs/1024;
figure; plot(f,20*log10(abs(H(1:512)))); grid on;
xlabel('f (Hz)'); ylabel('dB'); title('数字椭圆高通滤波器(fp=200Hz,fs=1000Hz)');
xlim([0, 500]); ylim([-80,5]);

习题

  1. 简述 IIR 数字滤波器的核心特点,与 FIR 滤波器的本质区别是什么?
  2. 模拟→数字映射的三个基本要求是什么?冲激响应不变法和双线性变换法的核心优缺点及适用场景分别是什么?
  3. 设计数字低通 IIR 滤波器,指标:fs=800Hz,fp=100Hz,αp≤1dB,fs=200Hz,αs≥60dB,分别用冲激响应不变法和双线性变换法设计,绘制幅频特性对比图,并验证指标是否满足。
  4. 基于巴特沃思模拟低通原型,通过第一种设计方案设计数字带通滤波器,指标:fs=1000Hz,中心频率f0=250Hz,带宽B=50Hz,αp≤3dB,αs≥40dB,给出完整设计步骤和 MATLAB 代码。
  5. 利用yulewalk函数设计一个数字多通带 IIR 滤波器,目标幅频特性:0~0.1π(1)、0.1π~0.3π(0)、0.3π~0.5π(0.8)、0.5π~0.7π(0)、0.7π~π(0.5),选择合适的阶数,绘制目标与实际幅频特性对比图。
  6. 简述五类模拟低通滤波器的性能差异,结合工程场景说明如何选择合适的滤波器类型。
  7. 什么是频率预畸变?为什么双线性变换法需要进行频率预畸变?给出预畸变的具体公式和实现步骤。

总结

本文详细讲解了《数字信号处理》第 7 章IIR 数字滤波器设计的全知识点,从基础概念、设计流程到 MATLAB 实战,层层递进,配套 Mermaid 流程图 / 思维导图、效果对比图和完整可运行代码,核心要点总结如下:

  1. IIR 滤波器的核心是反馈结构,单位冲激响应无限长,系统函数为有理分式;
  2. 经典设计法为间接法,以模拟低通原型为基础,通过频带变换和模拟→数字映射实现;
  3. 模拟→数字的主流映射方法为冲激响应不变法 (线性频率,有混叠)和双线性变换法(无混叠,需预畸变);
  4. 两种核心设计方案为 "模拟频带变换 + 模拟→数字" 和 "模拟→数字 + 数字频带变换",工程中可直接通过一次变换实现;
  5. 计算机辅助设计法直接在数字域通过优化算法设计,适用于特殊指标要求,MATLAByulewalk函数可快速实现;
  6. MATLAB 提供了丰富的工具箱函数,可快速实现从模拟到数字的全流程设计,自编程序可加深对底层原理的理解。

希望本文能帮助大家吃透 IIR 数字滤波器设计的精髓,所有代码均可直接运行,建议大家动手实操,结合习题巩固知识点,欢迎在评论区交流讨论!

点赞 + 收藏 + 关注,后续持续更新数字信号处理核心知识点和 MATLAB 实战内容!

相关推荐
IT_Octopus2 小时前
力扣热题100 20. 有效的括号
算法·leetcode
木井巳2 小时前
【递归算法】求根节点到叶节点数字之和
java·算法·leetcode·深度优先
想进个大厂2 小时前
代码随想录day29 贪心03
算法·leetcode·职场和发展
We་ct2 小时前
LeetCode 15. 三数之和:排序+双指针解法全解析
前端·算法·leetcode·typescript
挽天java2 小时前
数据结构习题--寻找旋转排序数组中的最小值
数据结构·算法·排序算法
你怎么知道我是队长2 小时前
C语言---排序算法4---希尔排序法
c语言·算法·排序算法
iAkuya2 小时前
(leetcode)力扣100 54实现Trie树
算法·leetcode·c#
TracyCoder1233 小时前
LeetCode Hot100(20/100)——19. 删除链表的倒数第 N 个结点
算法·leetcode
hrrrrb3 小时前
【算法设计与分析】随机化算法
人工智能·python·算法