FIR滤波器定义
FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,一个
M
M
M阶FIR滤波器的定义如下:
y
(
n
)
=
∑
k
=
0
M
−
1
h
(
k
)
x
(
n
−
k
)
y(n)=\sum_{k=0}^{M-1}h(k)x(n-k)
y(n)=k=0∑M−1h(k)x(n−k)
其系统函数为:
H
(
w
)
=
∑
k
=
0
M
−
1
h
k
e
−
j
w
H(w)=\sum_{k=0}^{M-1}h_ke^{-jw}
H(w)=k=0∑M−1hke−jw
FIR滤波器的特点:
1)只存在零点,不存在极点,系统比较稳定。
2)有限长的序列容易设计为对称结构(偶对称和奇对称),对称结构的滤波器具有线性相位的特点。
3)与IIR滤波器相比,滤波器阶数比较高。
窗函数设计FIR滤波器
窗函数法
从理想滤波器的频域响应出发,利用逆傅里叶变换求出理想滤波器的时域响应,由于理想滤波器是非因果的,所以理想滤波器时域响应是无限长的,无法实现的,窗函数方法就是用有限长的窗函数对理想滤波器时域响应进行截取。
理想低通滤波器响应
理想低通滤波器的频域响应为,
H
(
w
)
=
{
1
,
∣
w
∣
<
w
c
0
,
o
t
h
e
r
w
i
s
e
H(w) =\begin{cases} & 1 , |w| < w_c\\ & 0, otherwise \end{cases}
H(w)={1,∣w∣<wc0,otherwise
其中 w c w_c wc为低通滤波器截止频率,进行傅里叶逆变换,
h ( n ) = 1 2 π ∫ − w c w c e j w n d w = 1 2 j n π e j w n ∣ − w c w c = 1 n π s i n ( w c n ) = w c π s i n c ( w c n π ) \begin{aligned}h(n) &= \frac{1}{2\pi}\int_{-w_c}^{w_c}e^{jwn}dw \\ &= \frac{1}{2jn\pi}{e^{jwn}} |_{-w_c}^{w_c} \\ &= \frac{1}{n\pi}sin(w_cn)\\ &= \frac{w_c}{\pi}sinc(\frac{w_cn}{\pi})\end{aligned} h(n)=2π1∫−wcwcejwndw=2jnπ1ejwn∣−wcwc=nπ1sin(wcn)=πwcsinc(πwcn)
其中, n ∈ ( − ∞ , ∞ ) n \in(-\infty,\infty) n∈(−∞,∞), s i n c ( x ) = s i n ( π x ) π x sinc(x)=\frac{sin(\pi x)}{\pi x} sinc(x)=πxsin(πx)。
窗函数截取
利用窗函数
w
(
n
)
w(n)
w(n)对理想低通滤波器时域响应进行截取,只取其中的主要部分。最简单的窗函数就是矩形窗,选取的区间保持原样,其余区间丢掉,但矩形窗的旁瓣比较高。不适合利用。
除了矩形窗,常见的窗函数有hanning、hamming、Blcakman等窗函数。
1)hanning窗:
w
(
n
)
=
0.5
+
0.5
c
o
s
(
2
π
n
/
M
)
,
0
≤
n
≤
M
−
1
w(n)=0.5+0.5cos(2\pi n/M), 0 \leq n \leq M-1
w(n)=0.5+0.5cos(2πn/M),0≤n≤M−1
2)hamming窗:
w
(
n
)
=
0.54
+
0.46
c
o
s
(
2
π
n
/
M
)
,
0
≤
n
≤
M
−
1
w(n) = 0.54 + 0.46cos(2\pi n/M), 0 \leq n \leq M-1
w(n)=0.54+0.46cos(2πn/M),0≤n≤M−1
3)blackman窗:
$w(n) = 0.42 - 0.5cos(2\pi n/M) + 0.08cos(4\pi n/M) ,\ 0 \leq n \leq M-1 $
下图例举了常用窗函数的特点。
频率采样法
首先给出期望的频率响应 H d ( w ) H_d(w) Hd(w),再利用fir滤波器的系统函数 H ( w ) H(w) H(w)去逼近期望的频率响应,利用优化的方法求解fir滤波器的系数,存在多种不同的优化准则,这里使用的优化其实和波束优化是一样的,感兴趣的可以看我之前写的波束优化相关的程序。
FIR滤波器系统函数为:
H
(
w
)
=
∑
k
=
0
M
−
1
h
k
e
−
j
w
=
∑
k
=
0
M
−
1
h
k
c
o
s
(
k
w
)
+
j
∑
k
=
0
M
−
1
h
k
s
i
n
(
k
w
)
\begin{aligned}H(w)&=\sum_{k=0}^{M-1}h_ke^{-jw} \\ &=\sum_{k=0}^{M-1}h_kcos(kw) + j\sum_{k=0}^{M-1}h_ksin(kw)\end{aligned}
H(w)=k=0∑M−1hke−jw=k=0∑M−1hkcos(kw)+jk=0∑M−1hksin(kw)
可以看出系统函数是周期共轭对称函数,所以优化时只需要设计优化
0
≤
w
≤
π
0\leq w \leq \pi
0≤w≤π区间就可以了。
最大最小准则
最大最小准则是指通带内与期望响应的纹波的最大值
δ
1
\delta_1
δ1最小化,同时限制频率响应小于
δ
2
\delta_2
δ2
频率区间
[
0
,
π
]
[0,\pi]
[0,π]频率采样为
N
N
N个点,
N
N
N要远大于滤波器长度
M
M
M。根据通带截止频率和阻带开始频率对频率区间进行划分为通带区间
[
0
,
w
p
]
[0,w_p]
[0,wp]和阻带区间
[
w
s
,
π
]
[w_s,\pi]
[ws,π]。
m
i
n
i
m
i
z
e
(
δ
1
)
minimize(\delta_1)
minimize(δ1)
subject to:
m
a
x
(
a
b
s
(
H
(
w
k
)
−
H
d
(
w
k
)
)
)
,
0
≤
w
k
≤
w
p
a
b
s
(
H
(
w
k
)
≤
δ
2
,
0
≤
w
k
≤
w
p
max(abs(H(w_k)-H_d(w_k))),0 \leq w_k \leq w_p \\abs(H(w_k) \leq \delta_2,0 \leq w_k \leq w_p
max(abs(H(wk)−Hd(wk))),0≤wk≤wpabs(H(wk)≤δ2,0≤wk≤wp
更多的准则可以参考波束优化的书籍《传感器阵列波束优化设计与应用》,原理都是一致的。
程序仿真
窗函数设计法
%% window function approximation
fc = 1/2; %% w_c/pi
n = floor(6.2/(0.15 * fc));
n = floor(n/2) * 2 + 1; % set window len to old
w = hamming(n);
idx = 0:(n - 1);
idx = idx - (n - 1)/2 ;
idx = idx(:);
h = fc * sinc(fc * idx).* w;
figure
freqz(h)
频率采样法
fc = 1/2; %% w_c/pi
n = floor(6.2/(0.15 * fc));
N = floor(n/2) * 2 + 1; % set window len to old
n = (N - 1)/2;
w = linspace(0,pi,360);
A = [ones(360,1) 2*cos(kron(w',[1:n]))];
w_pass_end = 0.5 * pi;
w_stop_start = 0.7 * pi;
pass_dB = 0;
stop_dB = -30;
idx = find((w >=0) & (w<= w_pass_end));
A_pass = A(idx,:)
H_pass = 10^(stop_dB/20) * ones(length(idx),1);
idx = find((w >=w_stop_start) & (w<= pi));
A_stop = A(idx,:)
H_stop = 10^(stop_dB/20) * ones(length(idx),1);
cvx_begin
variable d
variable h(n+1,1);
minimize (d)
subject to
max(abs(A_pass*h - H_pass)) <=d
abs(A_stop*h) <= H_stop;
cvx_end
h = [flipud(h(2:end));h];
figure
freqz(h)
代码链接
github仓库
参考
https://ccrma.stanford.edu/~jos/sasp/FIR_Digital_Filter_Design.html
https://blog.csdn.net/suijue9389/article/details/87900091
鄢社锋, 马远良. 传感器阵列波束优化设计及应用[M]. Ke xue chu ban she, 2009.