实验7 FIR滤波器的窗函数设计方法

实验7 FIR滤波器的窗函数设计方法

7.1 实验目的

(1)探究窗函数主瓣宽度和旁辦电平对滤波器性能的影响。

(2)观察理解Gibbs效应。

7.2 实验原理

用窗函数法设计FIR滤波器,观察不同阶数下的通带起伏和过渡带宽度的变化。

7.3 实验内容

(1)采用矩形窗函数设计带通滤波器,中心频率为 $f_0=150MHz$,通带宽度为 $B=100MHz$,上下阻带最小衰减大于20dB,上下过渡带宽小于10MHz,采样频率为 $f_s=500MHz$,要求具有线性相位特性。

①使用MATLAB内置的fir1函数设计出符合指标要求的滤波器(其中矩形窗函数使用boxcar函数),利用MATLAB内置的freqz函数画出幅频特性曲线。

②改变系统阶数N(增加和减少),画出不同N下的幅频特性曲线(此处建议对幅度谱取绝对值画图,不建议画出功率谱图),并分析讨论。要求幅度归一化,频率单位为Hz。滤波器幅度谱的频率范围为 $0~f_s$。

(2)采用三角形窗、汉宁窗、汉明窗布莱克曼窗重复上述过程。

7.4 仿真结果

7.svg

7.5 结果分析

1.核心参数计算

采样频率 $f_s$: $500 \text{ MHz}$

中心频率 $f_0$: $150 \text{ MHz}$

通带宽度 $B$: $100 \text{ MHz}$

截止频率计算:

下截止频率 $f_{c1} = f_0 - B/2 = 100 \text{ MHz}$

上截止频率 $f_{c2} = f_0 + B/2 = 200 \text{ MHz}$

归一化频率 (Nyquist 频率为 $f_s/2$):

$w_{n1} = 100 / (500/2) = 0.4$$w_{n2} = 200 / (500/2) = 0.8$

阶数 $N$: 矩形窗的过渡带宽度约为 $4\pi/N$。

要求过渡带 $< 10 \text{ MHz}$,经估算 $N$ 应在 $100$ 以上。我们选取 $N=100$ 作为基准进行观察。

2.实验分析讨论

(1) 阶数 $N$ 对特性的影响

增加 $N$:

滤波器的过渡带变得更窄(更陡峭),更接近理想的矩形选择性。但 $N$ 过大会增加计算延迟。

减小 $N$: 过渡带变宽,主瓣变宽,滤波器的选择性变差。

(2) 窗函数对特性的影响

矩形窗 (Boxcar):

过渡带最窄,但阻带衰减小(约 $21\text{dB}$),通带和阻带内的振荡(吉布斯现象)最明显。

汉宁/海明/布莱克曼窗:

随着窗函数平滑度增加,阻带衰减显著增大(性能更稳定),但代价是过渡带变宽。若要达到同样的过渡带宽度,这些窗函数需要比矩形窗更高的阶数 $N$。

(3) 线性相位特性由于使用的是 fir1 设计的对称系数 FIR 滤波器,其相位响应在通带内是严格线性的,这保证了信号在过滤后不会产生相位失真。

7.6 结论

本实验深入研究了窗函数法设计FIR滤波器的性能特点和设计权衡。实验表明:

(1)阶数与性能关系:滤波器阶数N的增加能显著改善过渡带陡峭度和选择性,但会增加计算复杂度和群延迟,需要根据实际应用要求进行合理选择。

(2)窗函数性能权衡:矩形窗具有最窄的过渡带但存在严重的Gibbs振荡现象;平滑窗函数(Hanning、Hamming、Blackman)能有效抑制阻带振荡并提高衰减性能,但代价是过渡带变宽。

(3)线性相位优势:FIR滤波器固有的线性相位特性保证了信号的相位不失真,这是相对于IIR滤波器的重要优势。

(4)设计指导原则:窗函数的选择应综合考虑过渡带宽度、阻带衰减和通带波纹等指标要求,在滤波器性能和实现复杂度之间寻求最佳平衡。

7.7 代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
% 实验参数设置
fs = 500e6;          % 采样频率 500MHz
f0 = 150e6;          % 中心频率 150MHz
B  = 100e6;          % 通带宽度 100MHz
fc = [100e6, 200e6]; % 截止频率范围
wn = fc / (fs/2);    % 归一化截止频率

% 定义不同的阶数 N
N_vals = [50, 150, 500]; 
windows = {'boxcar', 'triang', 'hamming', 'hanning', 'blackman'};
win_names = {'矩形窗', '三角形窗', '海明窗', '汉宁窗', '布莱克曼窗'};

figure('Color', 'w');

%% 任务 (1) & (2): 不同窗函数的对比 (固定 N=150)
subplot(2,1,1);
hold on;
N = 150;
for i = 1:length(windows)
    % 生成滤波器系数
    h = fir1(N, wn, feval(windows{i}, N+1));
    [H, f] = freqz(h, 1, 1024, fs);
    plot(f, abs(H), 'LineWidth', 1.5);
end
title(['不同窗函数频率特性对比 (N=', num2str(N), ')']);
xlabel('频率 (Hz)'); ylabel('归一化幅度');
legend(win_names); grid on;

%% 任务 (1)-②: 改变系统阶数 N (以矩形窗为例)
subplot(2,1,2);
hold on;
for N = N_vals
    h = fir1(N, wn, boxcar(N+1));
    [H, f] = freqz(h, 1, 1024, fs);
    plot(f, abs(H), 'LineWidth', 1.5);
end
title('矩形窗在不同阶数 N 下的对比');
xlabel('频率 (Hz)'); ylabel('归一化幅度');
legend(strcat('N = ', string(N_vals))); grid on;
使用 Hugo 构建