窗函数法设计FIR中,如何选择窗函数和滤波器阶数N
各种窗函数的介绍,见:
数据截断、频谱泄漏与窗函数的选择_布莱克曼窗_yishuihan-Oliver的博客-CSDN博客
1、概述
在用窗函数法设计FIR滤波器时,给出了滤波器要求的具体指标,包括通带频率fp、阻带频率fs、通带波纹Rp 和阻带衰减As 等,有了这些指标后,是否什么窗函数都可以选择呢?答案是否定的。那么怎么选择窗函数呢?在本文中将说明窗函数的选择和滤波器阶数N的选择。
2、理论基础
不同窗函数的阻带最小衰减是不相同的,例如我们要求阻带衰减为 50dB,则矩形窗和汉宁窗的最小衰减分别为 21dB 和 44dB,若用这两种窗函数,无论 N 有多长,都没有办法满足阻带衰减达到 50dB。为了满足阻带衰减达到 50dB,只有选择海明窗,因为它的阻带衰减能达到 53dB 。所以窗函数的选择主要是根据滤波器指标中对阻带衰减 As 的要求。(根据阻带衰减选择窗函数)
在选择窗函数后又怎么决定滤波器的阶数 N 呢?在设定的滤波器指标中给出了通带频率fp 和阻带频率fs ,在通带频率fp 和 阻带频率fs 之间是过渡带,设△f=fs-fp,,则过渡带应与对应窗函数的“精确过渡带宽”相等。设把精确过渡带宽表示为
,则对于任意某一种窗函数就应有:
这样可得N为:
根据上表,以海明窗为例,,注意在计算中,△f是归一化的角频率。综上所述,经过渡带可求出FIR滤波器的阶数。对于带通滤波器或带阻滤波器,通带频率有fp1及fp2,阻带频率有fs1及fs2,以带通滤波器为例,分别求出
及
,从
和
之间选择小的一个作为
:
式中:min(·)表示选用最小值。
3、实例
例3-13-1、要求设计一个低通滤波器,采样频率为100Hz,通带频率fp=3Hz,阻带频率fs=5Hz;而通带波纹Rp=3dB,阻带衰减As=50dB。由于设计要求As=50dB,分析可知选择海明窗能满足要求,所以在窗函数法中用海明窗。
程序如下:
clear all; clc; close all
Fs = 100; % 采样频率
Fs2 = Fs/2; % 奈奎斯特频率
fp = 3; fs = 5; % 通带和阻带频率
Rp =3 ; As = 50; % 通带波纹和阻带衰减
wp = fp*pi/Fs2; ws = fs*pi/Fs2; % 通带和阻带归一化角频率
deltaw= ws - wp; % 过渡带宽Δω的计算
N = ceil(6.6*pi/ deltaw); % 按海明窗计算所需的滤波器阶数N(按式(3-13-1))
N = N + mod(N,2); % 保证滤波器系数长N+1为奇数
wind = (hamming(N+1))'; % 海明窗计算
Wn=(3+5)/100; % 计算截止频率
b = fir1(N,Wn,wind); % 用fir1函数设计FIR第1类滤波器
[db,mag,phs,gdy,w] = freqz_m(b,1); % 计算滤波器响应
% 作图
subplot 211; plot(w*Fs/(2*pi),db,'k','linewidth',2);
title('(a)低通滤波器的幅值响应');
grid; axis([0 20 -70 10]);
xlabel('频率/Hz'); ylabel('幅值/dB')
set(gca,'XTickMode','manual','XTick',[0,3,5,20])
set(gca,'YTickMode','manual','YTick',[-50,0])
subplot 212; stem(1:N+1,b,'k');
xlabel('频率/Hz'); ylabel('幅值/dB')
title('(b)低通滤波器的脉冲响应');
xlabel('样点'); ylabel('幅值')
axis([0 167 -0.05 0.1]);
set(gca,'XTickMode','manual','XTick',[1,84,167])
set(gcf,'color','w');
说明:
①因为选择了海明窗,按式求出滤波器阶数N:
。
②一般设计的FIR滤波器都是第1类FIR滤波器,要求脉冲序列长N是奇数。而从①
中求得的滤波器阶数N不知是偶数还是奇数。通过 保证滤波器阶数N为偶数,而脉冲响应序列长将是N+1,即为奇数,满足第1类FIR滤波器要求。滤波器阶数若为N,脉冲响应序列的长度总为N+1,在FIR滤波器中脉冲响应序列的长度与滤波器阶数总差1。
③在计算窗函数长度时用的 dw 是归一化角频率,而在 fir1函数中的 Wn 用的是归一化频率,这两者的单位是不同的,且截止频率 Wn 的计算是用 。
运行程序后得上图,从图中可看出滤波器完全满足设计的要求,在 5Hz处阻带衰减大于 50dB。