文章目录
CIC滤波器及半带滤波器因为具有运算速度快,占用资源少的特点,在多速率信号处理中得到广泛的应用。
1. CIC滤波器的原理
1.1 单级CIC滤波器
CIC滤波器的冲激响应为
h
(
n
)
=
{
1
,
0
⩽
n
⩽
M
−
1
0
,
其
他
h(n)=\left\{\begin{matrix} 1,& 0\leqslant n\leqslant M-1\\ 0, & 其他 \end{matrix}\right.
h(n)={1,0,0⩽n⩽M−1其他
式中,M为滤波器的长度。从滤波器的冲激响应容易看出,CIC滤波器其实是一种具有线性相位特征的FIR滤波器,其系统函数为
H
(
z
)
=
∑
n
=
0
M
−
1
z
−
n
H(z)=\sum_{n=0}^{M-1}z^{-n}
H(z)=n=0∑M−1z−n
将上式的分子分母同时乘以因子
(
1
−
z
−
1
)
(1-z^{-1})
(1−z−1),可得
H
(
z
)
=
(
1
−
z
−
1
)
∑
n
=
0
M
−
1
z
−
n
/
(
1
−
z
−
1
)
=
(
1
−
z
−
M
)
/
(
1
−
z
−
1
)
H(z)=(1-z^{-1})\sum_{n=0}^{M-1}z^{-n}/(1-z^{-1})=(1-z^{-M})/(1-z^{-1})
H(z)=(1−z−1)n=0∑M−1z−n/(1−z−1)=(1−z−M)/(1−z−1)
对第一个式子进行傅里叶变换,可得其幅频特性为
∣
H
(
e
j
ω
)
∣
=
∣
s
i
n
(
ω
M
/
2
)
s
i
n
(
ω
/
2
)
∣
\left | H(e^{j\omega }) \right |=\left | \frac{sin(\omega M/2)}{sin(\omega /2)} \right |
∣∣H(ejω)∣∣=∣∣∣∣sin(ω/2)sin(ωM/2)∣∣∣∣
用MATLAB仿真的方法来查看不同长度滤波器的频谱特性
图中,横坐标为归一化频率,数值1相当于数据速率的一半。从图中可以看出,CIC滤波器的频谱特性像一把梳子,这也是CIC被称为梳状滤波器的原因。当滤波器的长度M远大于1时,第一旁瓣电平相对于主瓣电平的差值几乎是固定的13.46dB。显然,这样的小的阻带衰减远不能够满足较高的滤波器要求。解决这一问题的方法是对滤波器进行级联,每增加一级滤波器,则旁瓣电平衰减增加13,46dB。比如,采用5级CIC滤波器级联,则旁瓣电平衰减变为67.3dB。
1.2 多级CIC滤波器
下图为5级CIC滤波器级联的频谱图,显然,旁瓣电平衰减达到67.3dB。但是,多级CIC的主瓣电平下降也比单级快得多。也就是说,在相同的通带频段内,滤波器的通带衰减也明显增加,多级滤波器的通带范围要低于单级滤波器。
2. CIC滤波器的应用条件
抗混叠滤波器最重要的指标有通带容限
δ
p
\delta _{p}
δp通带衰减
a
p
a_{p}
ap、阻带容限
δ
s
\delta _{s}
δs或阻带衰减
a
s
a_{s}
as、通带截止频率
f
p
f_{p}
fp及阻带截止频率
f
s
f_{s}
fs。其中
a
p
=
20
l
g
(
1
+
δ
p
1
−
δ
p
)
,
a
s
=
20
l
g
δ
s
a_{p}=20lg\left ( \frac{1+\delta _{p}}{1-\delta _{p}} \right ),a_{s}=20lg\delta _{s}
ap=20lg(1−δp1+δp),as=20lgδs
CIC滤波器的频谱形状是相似的,在给定过渡带的情况下,通带容限与阻带容限的取值只与滤波器的阶数(长度)及级数有关。对于单级滤波器,器对应关系为
δ
p
⩾
1
6
(
π
f
p
f
s
M
)
2
\delta _{p}\geqslant \frac{1}{6}\left ( \pi \frac{f_{p}}{f_{s}}M \right )^{2}
δp⩾61(πfsfpM)2
δ
s
⩾
f
s
M
/
F
0
\delta _{s}\geqslant f_{s}M/F_{0}
δs⩾fsM/F0
对于多级滤波器来说,各级滤波器的误差容限与系统总误差容限的关系为:
δ
p
=
δ
p
1
+
δ
p
2
+
⋯
+
δ
p
n
\delta _{p}=\delta _{p1}+\delta _{p2}+\cdots +\delta _{pn}
δp=δp1+δp2+⋯+δpn
δ
s
=
δ
s
1
δ
s
2
⋯
δ
s
n
\delta _{s}=\delta _{s1}\delta _{s2}\cdots \delta _{sn}
δs=δs1δs2⋯δsn
从上几式可以看出,多级CIC滤波器与单级相比,通带容限增加(通带衰减增加)的同时,阻带铜线减小(阻带衰减增加)。
要同时满足通带及阻带误差容限的CIC滤波器非常困难,除非滤波器的误差容限较大,或者通带归一化频率很小。而通带归一化频率较小,即意味着信号的采样率相对于有用信号的频带较高的情况。也就是说,CIC滤波器通常适用于多速率信号处理中的前端抗混叠抽取滤波器,或后端抗混叠内插滤波器。
3. 多级CIC滤波器的FPGA实现
3.1 Hogenauer滤波器
N级CIC滤波器的系统函数可表示为:
H
(
z
)
=
(
1
−
z
−
M
1
−
z
−
1
)
−
N
H(z)=\left ( \frac{1-z^{-M}}{1-z^{-1}} \right )^{-N}
H(z)=(1−z−11−z−M)−N
根据Noble恒等式,可以得到多级CIC抽取/内插滤波器,如下图所示
3.2 计算字长
从上图©可以看出,CIC组成结构的前级为级联的积分器,根据数字滤波器理论,极点不再单位圆内(极点的绝对值小于1)的滤波器是不稳定的,因此积分器的输出数据范围是需要首先考虑的问题。虽然单从积分器的系统函数来看,是不稳定的,但从整个CIC滤波器的结构来看,因为存在零/极点互相抵消的情况,CIC本身是一个FIR滤波器。因此,整个CIC滤波器一定是一个因果稳定系统,当输入数据有界时,输出数据一定是有界的。
估算运算过程字长的公式如下
W
1
=
W
i
n
+
N
l
o
g
2
(
M
D
)
W_{1}=W_{in}+Nlog_{2}(MD)
W1=Win+Nlog2(MD)
式中,
W
1
W_{1}
W1为CIC滤波器的中间字长,
W
i
n
W_{in}
Win为输入数据位宽,N为CIC滤波器的阶数,M为系统抽取因子,D为滤波器的级数。
3.3 FPGA源码
module MultCIC (
rst,clk,Xin,
Yout,rdy);
input rst; //复位信号,高电平有效
input clk; //FPGA系统时钟,频率为2kHz
input [9:0] Xin; //数据输入频率为2kHZ
output [16:0] Yout; //滤波后的输出数据
output rdy; //数据有效指示信号
wire ND;
wire signed [36:0] Intout;
wire signed [36:0] dout;
//wire signed [36:0] yt;
//实例化积分器模块
Integrated U1 (
.rst (rst),
.clk (clk),
.Xin (Xin),
.Intout (Intout));
//实例化抽取模块
Decimate U2 (
.rst (rst),
.clk (clk),
.Iin (Intout),
.dout (dout),
.rdy (ND));
//实例化梳状模块
Comb U3 (
.rst (rst),
.clk (clk),
.ND (ND),
.Xin (dout),
.Yout (Yout));
assign rdy = ND;
//assign Yout = yt[16:0];
endmodule
module Integrated (
rst,clk,Xin,
Intout);
input rst; //复位信号,高电平有效
input clk; //FPGA系统时钟,频率为2kHz
input signed [9:0] Xin; //数据输入频率为2kHZ
output signed [36:0] Intout; //滤波后的输出数据
//根据图6-16(c)所示的结构,每级积分器只需要一个寄存器及一级加法运算
wire signed [36:0] I1,I2,I3;
reg signed [36:0] d1,d2,d3;
//第1级积分器
always @(posedge clk or posedge rst)
if (rst)
d1 <= 37'd0;
else
d1 <= I1;
assign I1 = (rst ? 37'd0 : (d1+{{27{Xin[9]}},Xin}));
//第2级积分器
always @(posedge clk or posedge rst)
if (rst)
d2 <= 37'd0;
else
d2 <= I2;
assign I2 = (rst ? 37'd0 : (I1+d2));
//第3级积分器
always @(posedge clk or posedge rst)
if (rst)
d3 <= 37'd0;
else
d3 <= I3;
assign I3 = (rst ? 37'd0 : (I2+d3));
assign Intout = I3;
endmodule
module Decimate (
rst,clk,Iin,
dout,rdy);
input rst; //复位信号,高电平有效
input clk; //FPGA系统时钟,频率为2kHz
input signed[36:0] Iin; //数据输入频率为2kHZ
output signed[36:0] dout; //滤波后的输出数据
output rdy; //数据有效指示信号
reg [2:0] c;
reg signed[36:0] dout_tem;
reg rdy_tem;
always @(posedge clk or posedge rst)
if (rst)
//初始化寄存器值为0
begin
c = 3'd0;
dout_tem <= 37'd0;
rdy_tem <= 1'b0;
end
else
begin
if (c==4)
begin
rdy_tem <= 1'b1;
dout_tem <= Iin;
c = 3'd0;
end
else
begin
rdy_tem <= 1'b0;
c = c+1;
end
end
assign dout = dout_tem;
assign rdy = rdy_tem;
endmodule
module Comb (
rst,clk,ND,Xin,
Yout);
input rst; //复位信号,高电平有效
input clk; //FPGA系统时钟,频率为2kHz
input ND; //输入的数据准备好信号
input signed [36:0] Xin; //数据输入频率为2kHZ
output signed [16:0] Yout; //滤波后的输出数据
reg signed [36:0] d1,d2,d3,d4;
wire signed [36:0] C1,C2;
wire signed[36:0] Yout_tem;
always @(posedge clk or posedge rst)
if (rst)
//初始化寄存器值为0
begin
d1 <= 37'd0;
d2 <= 37'd0;
d3 <= 37'd0;
d4 <= 37'd0;
end
else
begin
if (ND)
begin
d1 <= Xin;
d2 <= d1;
d3 <= C1;
d4 <= C2;
end
end
assign C1 = (rst ? 37'd0 : (d1-d2));
assign C2 = (rst ? 37'd0 : (C1-d3));
assign Yout_tem = (rst ? 37'd0 : (C2-d4));
/*always @(posedge clk or posedge rst)
if (rst)
Yout_tem <= 37'd0;
else
Yout_tem <= C2-d4;*/
assign Yout = Yout_tem[16:0];
endmodule