基于窗函数法的N=8线性相位FIR滤波器设计与对比分析
项目简介
本项目是一个基于MATLAB的数字信号处理仿真项目,旨在通过编程实现线性相位有限长单位冲激响应(FIR)滤波器的设计。项目专注于采用
窗函数法,设计一个滤波器长度固定为 $N=8$ 的低通滤波器。
通过代码实现,项目深入探讨了理想滤波器单位冲激响应的推导、五种不同窗函数(矩形窗、汉宁窗、海明窗、布莱克曼窗、凯泽窗)的生成,以及它们对最终滤波器频率响应特性的具体影响。项目不仅计算了滤波器的时域系数,还通过手动实现的DTFT算法分析了其幅频和相频特性。
功能特性
- 理想滤波器生成:根据截止频率 $omega_c = 0.5pi$ 计算理想低通滤波器的无限长脉冲响应 $h_d(n)$,并处理了对称中心点的数值计算。
- 多种窗函数实现:手动实现了五种经典窗函数的数学公式:
* 矩形窗 (Rectangular/Boxcar)
* 汉宁窗 (Hanning)
* 海明窗 (Hamming)
* 布莱克曼窗 (Blackman)
* 凯泽窗 (Kaiser, $beta=8.5$)
- 自定义贝塞尔函数:针对凯泽窗的计算,代码内部实现了一个第一类0阶修正贝塞尔函数近似算法,不依赖MATLAB工具箱中的特定高级函数。
- 频域特性分析:通过离散时间傅里叶变换(DTFT)的定义公式,计算了1000个频点下的复频率响应。
- 可视化分析:生成四个独立的图形窗口,分别展示窗函数时域波形、滤波器系数分布、对数幅度响应(dB)和解包裹后的线性相位响应。
- 系数输出:在控制台打印生成的五种滤波器的精确时域系数 $h(n)$。
系统要求
- 运行环境:MATLAB R2016a 或更高版本(代码使用基础数学函数,兼容性较好)。
- 工具箱:本项目主要依赖MATLAB核心功能(Base MATLAB),不强制要求Signal Processing Toolbox,因为关键函数(如窗函数生成、DTFT计算、贝塞尔函数)均已在代码中手动实现。
使用方法
- 确保MATLAB环境已准备就绪。
- 将包含代码的脚本文件(通常命名为
main.m)放置在工作目录中。 - 在MATLAB命令窗口输入
main 并回车,或直接在编辑器中运行该脚本。 - 程序执行后将自动弹出4个分析图表,并在命令行窗口输出系数表格。
代码实现逻辑与算法细节
1. 参数初始化与理想响应计算
程序首先定义了滤波器阶数 $N=8$,由此确定了群延时(对称中心)$alpha = (N-1)/2 = 3.5$。理想截止频率设定为 $0.5pi$。
代码通过循环计算理想低通滤波器的单位冲激响应 $h_d(n)$:
- 使用公式 $h_d(n) = frac{sin(omega_c(n-alpha))}{pi(n-alpha)}$。
- 虽然 $N=8$ 时 $n$ 取整数不会等于 $alpha=3.5$,代码仍包含了一个条件判断,用于处理 $n=alpha$ 时的洛必达极限情况(即值为 $omega_c/pi$),保证了代码的鲁棒性。
2. 窗函数序列生成
代码构建了一个 $5 times N$ 的矩阵来存储五种窗函数:
- 矩形窗:直接赋值全1序列。
- 汉宁窗、海明窗、布莱克曼窗:严格按照其定义的余弦组合公式计算,基于索引 $n=0$ 到 $N-1$。
- 凯泽窗 (Kaiser):
* 设定形状参数 $beta = 8.5$。
* 未调用MATLAB内置的
kaiser 或
besseli 函数。
*
核心算法:实现了一个名为
my_besseli0 的辅助函数,利用级数展开法(取前25项累加)近似计算第一类0阶修正贝塞尔函数 $I_0(x)$。
* 利用该辅助函数计算 $w(n) = frac{I_0(beta sqrt{1 - [(n-alpha)/alpha]^2})}{I_0(beta)}$。
3. FIR滤波器系数计算
利用时域窗口法原理,通过点乘操作计算实际单位冲激响应:
$h(n) = h_d(n) cdot w(n)$
结果存储在
h_coeffs 矩阵中,每一行对应一种窗函数设计的滤波器系数。
4. 频率响应计算 (DTFT)
代码没有使用
freqz 函数,而是基于DTFT定义实现了双重循环:
- 外层循环遍历5种滤波器。
- 内层循环遍历频率 $omega$ 从 0 到 $pi$ 的1000个采样点。
- 计算公式:$H(e^{jomega}) = sum_{n=0}^{N-1} h(n) e^{-jomega n}$。
- 幅度响应:计算 $|H(e^{jomega})|$ 并转换为分贝刻度 $20log_{10}(cdot)$,引入
eps 防止对数奇异。 - 相位响应:计算复数的相位角,并使用
unwrap 函数处理相位卷绕,以便直观展示FIR滤波器的严格线性相位特性(即相位随频率线性变化)。
5. 结果可视化
代码通过四个图形窗口展示分析结果:
- 图1 - 窗函数时域波形:对比五种窗函数的形状,直观展示旁瓣抑制能力的来源(如Blackman窗的主瓣较宽但边缘衰减明显)。
- 图2 - 滤波器系数 h(n):展示加窗后的 $h(n)$ 与理想 $h_d(n)$ 的对比,体现窗函数对尾部系数的截断和平滑作用。
- 图3 - 幅度响应 (dB):频谱分析的核心。展示了不同窗函数在主瓣宽度(过渡带)和旁瓣衰减(阻带性能)之间的权衡。
* 凯泽窗 ($beta=8.5$) 展现出极强的旁瓣抑制能力。
* 矩形窗过渡带最窄,但旁瓣最高。
- 图4 - 相位响应:显示解包裹后的相位曲线,验证了线性相位特性(斜率为 $-alpha = -3.5$)。
辅助函数说明
my_besseli0(x)
- 功能:计算第一类0阶修正贝塞尔函数 $I_0(x)$。
- 实现:使用泰勒级数展开近似。
- 精度:循环迭代25次,满足对于Kaiser窗计算的精度需求。
- 目的:使得主程序独立于MATLAB的高级信号处理工具箱,增加代码的可移植性和教学意义。