理论实验目的
- 理解 FIR 滤波器的基本原理和特性
- 掌握线性相位滤波器的设计方法和四种类型
- 学习窗函数法设计 FIR 滤波器
- 使用 MATLAB 函数(
fir1、freqz等)进行滤波器设计和分析 - 应用 FIR 滤波器进行实际信号处理(语音信号滤波)
phdist.mat- 包含三组滤波器系数 (a1,b1,a2,b2,a3,b3) 和加噪语音 (xnoise)orig.mat- 包含原始语音信号 (x) 和采样率 (Fs=8000Hz)
理论理论基础
1. FIR滤波器基本原理
FIR滤波器的差分方程为:
其中 $M$ 是滤波器阶数,$N = M+1$ 是滤波器长度(系数个数)。
2. 线性相位条件
线性相位FIR滤波器的相位响应为 $\phi(\omega) = -\tau \omega$,其中 $\tau = M/2$ 是群延迟(常数)。实现线性相位需要脉冲响应满足对称性:
| 类型 | N | M | 对称性 | $H(e^{j\omega})$ 在 $\omega=0$ | $H(e^{j\omega})$ 在 $\omega=\pi$ |
|---|---|---|---|---|---|
| Type I | 奇数 | 偶数 | $h[n]=h[M-n]$ | 任意 | 任意 |
| Type II | 偶数 | 奇数 | $h[n]=h[M-n]$ | 任意 | = 0 |
| Type III | 奇数 | 偶数 | $h[n]=-h[M-n]$ | = 0 | = 0 |
| Type IV | 偶数 | 奇数 | $h[n]=-h[M-n]$ | = 0 | 任意 |
3. 窗函数法设计步骤
- 确定理想滤波器的频率响应 $H_d(e^{j\omega})$
- 计算理想脉冲响应 $h_d[n]$(通常是无限长的非因果序列)
- 选择窗函数 $w[n]$ 并确定长度 $N$
- 计算实际脉冲响应 $h[n] = h_d[n] \cdot w[n]$
4. 常用窗函数特性
| 窗函数 | MATLAB函数 | 主瓣宽度 | 旁瓣衰减 | 过渡带 |
|---|---|---|---|---|
| 矩形窗 | rectwin(N) | $4\pi/N$ | -13 dB | 最窄 |
| 汉宁窗 | hann(N) | $8\pi/N$ | -32 dB | 中等 |
| 汉明窗 | hamming(N) | $8\pi/N$ | -43 dB | 中等 |
| 布莱克曼窗 | blackman(N) | $12\pi/N$ | -58 dB | 最宽 |
| 凯泽窗 | kaiser(N,β) | 可调 | 可调 | 可调 |
- 过渡带窄 → 选择汉宁窗或汉明窗
- 阻带衰减 > 50 dB → 选择布莱克曼窗
- 灵活调节 → 使用凯泽窗
- 避免使用矩形窗(振铃效应严重)
实践练习一:汉明窗FIR低通滤波器设计与信号滤波
任务
设计一个 31 阶(N=32)的汉明窗 FIR 低通滤波器,截止频率 $\omega_c = \pi/4$,并对双频信号进行滤波。
任务一:设计滤波器
使用 fir1(M, Wn) 函数设计滤波器,其中 $M=31$,$Wn = \omega_c/\pi = 0.25$。
M = 31; % 滤波器阶数
Wn = 0.25; % 归一化截止频率
h = fir1(M, Wn); % 设计汉明窗FIR滤波器
任务二:分析频率响应
使用 freqz 计算 1024 点频率响应,绘制幅度响应(dB)和相位响应。
- 观察通带平坦性和阻带衰减
- 验证相位是否为线性(斜率 $= -M/2 = -15.5$)
任务三:双音信号滤波
生成输入信号 $x[n] = \cos(\omega_1 n) + \cos(\omega_2 n)$,其中 $\omega_1 = \pi/3$(阻带),$\omega_2 = \pi/6$(通带),$n = 0, 1, \ldots, 127$。
- 使用
y = conv(h, x)进行滤波 - 计算 x 和 y 的 1024 点 FFT
- 绘制频谱对比图,验证哪个频率成分被滤除
📊 思考题
- $\omega_1 = \pi/3 > \omega_c = \pi/4$,位于阻带,应被滤除
- $\omega_2 = \pi/6 < \omega_c = \pi/4$,位于通带,应保留
- 如果要保留 $\omega_1$ 而滤除 $\omega_2$,应该设计什么类型的滤波器?
预期图像
幅度响应 (dB)
滤波后频谱
实践练习二:语音信号滤波综合实验
背景
本题旨在检验你对 FIR 滤波器设计和应用的综合理解。我们将对实际语音信号进行滤波处理,并分析滤波器的幅度和相位特性对语音质量的影响。
实验数据:给定 phdist.mat 文件,包含三组滤波器系数(a1, a2, a3, b1, b2, b3)和一个加噪语音信号 xnoise。另有 orig.mat 文件包含原始语音信号 x 和采样率 Fs。
任务一:幅度响应对比
使用 freqz 计算三个滤波器的 1024 点频率响应,在同一张图上绘制幅度谱(dB)。
思考:从幅度特性角度,哪两个滤波器可能得到相似的滤波结果?
任务二:相位响应对比
在同一张图上绘制三个滤波器的相位响应。使用 unwrap(angle(H)) 避免相位折叠。
思考:从相位特性角度,哪两个滤波器可能得到相似的滤波结果?
任务三:主观听觉测试
用三个滤波器分别对原始语音 x 进行滤波,使用 soundsc 播放并对比:
- 语音内容是否仍然可理解?
- 哪两个滤波后的语音听起来最相似?
- 这个结果与任务一和任务二的分析是否一致?
y1 = filter(b1, a1, x); % 滤波器1
y2 = filter(b2, a2, x); % 滤波器2
y3 = filter(b3, a3, x); % 滤波器3
soundsc(y1, Fs); % 播放滤波后语音
任务四:噪声分析与去噪
播放 xnoise,对比原始信号 x。对两者分别做 8192 点 FFT,绘制频谱。
- 你能从频谱中识别出噪声的特征吗?
- 用三个滤波器分别对
xnoise去噪,哪个滤波器效果最好?
📊 综合思考题
- 滤波器的幅度特性和相位特性哪个对语音质量更重要?为什么?
- 如果两个滤波器的幅度响应完全相同,但相位响应不同,滤波后的语音会有什么差别?
- 为什么线性相位在语音处理中如此重要?举例说明。
实践练习三:窗函数长度对滤波器性能的影响
任务
分析窗函数长度对矩形窗频谱和FIR滤波器性能的影响。
任务一:矩形窗频谱分析
生成两种长度的矩形窗($N_1=31$, $N_2=121$),计算 4096 点 FFT 频谱并对比。
- 验证主瓣宽度公式:$\Delta\omega = 4\pi/N$
- 观察第一旁瓣相对主瓣的衰减(应为 -13.3 dB,与 N 无关)
矩形窗的频谱(Dirichlet核):
$$W(e^{j\omega}) = \frac{\sin(\omega N/2)}{\sin(\omega/2)}$$任务二:FIR滤波器性能对比
设计两种阶数的汉明窗FIR低通滤波器($M_1=30$, $M_2=120$),截止频率 $\omega_c=0.4\pi$。
- 绘制幅度响应对比图
- 测量过渡带宽度(-3dB 到 -40dB)
- 验证过渡带宽度比值是否接近阶数比值(4:1)
任务三:计算复杂度分析
假设采样率 $F_s = 48000$ Hz,CPU时钟 $f_{cpu} = 100$ MHz。分析实时处理能力:
- 每样本需要的 MAC(乘累加)操作数:$M+1$
- 采样周期:$T_s = 1/F_s$
- CPU利用率:$(M+1) \cdot T_{clk} / T_s$
- 判断两种阶数的滤波器是否能实时处理
📊 设计权衡总结
| 阶数增加的优势 | 阶数增加的代价 |
|---|---|
| 过渡带更窄 | 计算量增加 |
| 更接近理想滤波器 | 群延迟增加 |
| 通带更平坦 | 存储需求增加 |
实践练习四:窗函数性能对比与优化设计
任务一:不同窗函数对比实验
设计 4 个 31 阶低通滤波器,截止频率 $\omega_c = 0.4\pi$,分别使用矩形窗、汉宁窗、汉明窗和布莱克曼窗。
- 在同一图上绘制所有滤波器的幅度响应(dB)
- 测量并记录各窗函数的阻带衰减
- 观察过渡带宽度的差异
任务二:凯泽窗的参数优化
凯泽窗通过 $\beta$ 参数在过渡带宽度和阻带衰减之间权衡。使用 $\beta = 3, 5, 7, 9$ 设计滤波器,观察性能变化。
for beta = [3, 5, 7, 9]
h = fir1(31, 0.4, kaiser(32, beta));
[H, w] = freqz(h, 1, 1024);
plot(w/pi, 20*log10(abs(H))); hold on;
end
任务三:滤波器阶数的影响
固定使用汉明窗,改变滤波器阶数 $M = 15, 31, 63, 127$,观察频率响应变化。
任务四:实际应用设计挑战
设计要求:
- 通带边界:$\omega_p = 0.3\pi$
- 阻带边界:$\omega_s = 0.5\pi$
- 通带波纹:$\delta_p \leq 0.01$(约 0.086 dB)
- 阻带衰减:$\delta_s \leq 0.001$(约 -60 dB)
设计步骤:
- 根据阻带衰减要求选择合适的窗函数(提示:需要 -60 dB,应选布莱克曼窗)
- 估算阶数:$N \approx \frac{A_s - 8}{2.285 \Delta\omega}$
- 设计滤波器并验证是否满足规格
预期图像
不同窗函数的幅度响应对比
📊 综合分析
- 在实际应用中,如何根据设计要求选择合适的窗函数?
- 如果要求阻带衰减至少 -60 dB,应该选择哪种窗函数?
- 如果计算资源有限但又需要较好的阻带衰减,应该如何权衡?
- 线性相位特性在什么应用场景下最重要?