实验三 - FIR滤波器设计

数字信号处理 | 窗函数法与线性相位滤波器
南京工业大学浦江学院 | 计算机与通信工程学院 | 通信工程专业 | DSP课程实验

理论实验目的

  • 理解 FIR 滤波器的基本原理和特性
  • 掌握线性相位滤波器的设计方法和四种类型
  • 学习窗函数法设计 FIR 滤波器
  • 使用 MATLAB 函数(fir1freqz等)进行滤波器设计和分析
  • 应用 FIR 滤波器进行实际信号处理(语音信号滤波)
📂 实验数据文件:
  • phdist.mat - 包含三组滤波器系数 (a1,b1,a2,b2,a3,b3) 和加噪语音 (xnoise)
  • orig.mat - 包含原始语音信号 (x) 和采样率 (Fs=8000Hz)

理论理论基础

1. FIR滤波器基本原理

FIR滤波器的差分方程为:

$$y[n] = \sum_{k=0}^{M} b_k \cdot x[n-k] = b_0 x[n] + b_1 x[n-1] + \cdots + b_M x[n-M]$$

其中 $M$ 是滤波器阶数,$N = M+1$ 是滤波器长度(系数个数)。

2. 线性相位条件

线性相位FIR滤波器的相位响应为 $\phi(\omega) = -\tau \omega$,其中 $\tau = M/2$ 是群延迟(常数)。实现线性相位需要脉冲响应满足对称性:

类型NM对称性$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. 窗函数法设计步骤

  1. 确定理想滤波器的频率响应 $H_d(e^{j\omega})$
  2. 计算理想脉冲响应 $h_d[n]$(通常是无限长的非因果序列)
  3. 选择窗函数 $w[n]$ 并确定长度 $N$
  4. 计算实际脉冲响应 $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$。

  1. 使用 y = conv(h, x) 进行滤波
  2. 计算 x 和 y 的 1024 点 FFT
  3. 绘制频谱对比图,验证哪个频率成分被滤除

📊 思考题

  • $\omega_1 = \pi/3 > \omega_c = \pi/4$,位于阻带,应被滤除
  • $\omega_2 = \pi/6 < \omega_c = \pi/4$,位于通带,应保留
  • 如果要保留 $\omega_1$ 而滤除 $\omega_2$,应该设计什么类型的滤波器?

预期图像

幅度响应 (dB)

ω/π dB 0.25 0 1 0 -40 -80

滤波后频谱

ω/π |Y| ω₂=π/6 保留 ω₁=π/3 滤除 ωc

实践练习二:语音信号滤波综合实验

背景

本题旨在检验你对 FIR 滤波器设计和应用的综合理解。我们将对实际语音信号进行滤波处理,并分析滤波器的幅度和相位特性对语音质量的影响。

💡 知识提示:在语音信号处理中,相位失真往往比幅度失真更容易被人耳察觉。这就是为什么在语音处理应用中,线性相位FIR滤波器往往比非线性相位IIR滤波器更受青睐。

实验数据:给定 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 去噪,哪个滤波器效果最好?

📊 综合思考题

  1. 滤波器的幅度特性相位特性哪个对语音质量更重要?为什么?
  2. 如果两个滤波器的幅度响应完全相同,但相位响应不同,滤波后的语音会有什么差别?
  3. 为什么线性相位在语音处理中如此重要?举例说明。

实践练习三:窗函数长度对滤波器性能的影响

任务

分析窗函数长度对矩形窗频谱和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$。

  1. 绘制幅度响应对比图
  2. 测量过渡带宽度(-3dB 到 -40dB)
  3. 验证过渡带宽度比值是否接近阶数比值(4:1)
💡 理论预测:汉明窗的过渡带宽度约为 $8\pi/N$,阶数增加4倍,过渡带宽度应减小为原来的1/4。

任务三:计算复杂度分析

假设采样率 $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$,分别使用矩形窗、汉宁窗、汉明窗和布莱克曼窗。

  1. 在同一图上绘制所有滤波器的幅度响应(dB)
  2. 测量并记录各窗函数的阻带衰减
  3. 观察过渡带宽度的差异

任务二:凯泽窗的参数优化

凯泽窗通过 $\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)

设计步骤:

  1. 根据阻带衰减要求选择合适的窗函数(提示:需要 -60 dB,应选布莱克曼窗)
  2. 估算阶数:$N \approx \frac{A_s - 8}{2.285 \Delta\omega}$
  3. 设计滤波器并验证是否满足规格

预期图像

不同窗函数的幅度响应对比

ω/π dB 0 0.4 1 0 -20 -43 -58 矩形窗 (-13dB) 汉宁窗 (-32dB) 汉明窗 (-43dB) 布莱克曼 (-58dB)

📊 综合分析

  1. 在实际应用中,如何根据设计要求选择合适的窗函数?
  2. 如果要求阻带衰减至少 -60 dB,应该选择哪种窗函数?
  3. 如果计算资源有限但又需要较好的阻带衰减,应该如何权衡?
  4. 线性相位特性在什么应用场景下最重要?