CIC滤波器
CIC滤波器是级联积分梳状(Cascaded Integrator-Comb)滤波器的缩写,具有滤波器系数都是1,不需要乘法和线性相位的优点,因此在多速率系统中比较常用,研究生时研究PDM接口的MEMS麦克风时,将PDM信号转换为PCM时使用过,又翻出来做个总结。
滑动平均滤波器
CIC滤波器是受到滑动平均启发来的,定义D点的移动平均为:
y ( n ) = 1 D [ x ( n ) + x ( n − 1 ) + . . . + x ( n − D + 1 ) ] y(n)=\frac{1}{D}[x(n) + x(n-1) + ... + x(n-D+1)] y(n)=D1[x(n)+x(n−1)+...+x(n−D+1)]
写成递归形式为:
y
(
n
)
=
1
D
[
x
(
n
)
−
x
(
n
−
D
)
]
+
y
(
n
−
1
)
y(n)=\frac{1}{D}[x(n) - x(n-D)] + y(n-1)
y(n)=D1[x(n)−x(n−D)]+y(n−1)
一阶CIC滤波器
忽略掉常数
1
/
D
1/D
1/D,就可以得到一阶CIC滤波器的时域表达式,
y
(
n
)
=
x
(
n
)
−
x
(
n
−
D
)
+
y
(
n
−
1
)
y(n)= x(n) - x(n-D) + y(n-1)
y(n)=x(n)−x(n−D)+y(n−1)
CIC滤波器通常用在多速率转换中,为了实现采样率的转变,一般联合抽取和插值操作使用,令
D
=
R
∗
M
D=R*M
D=R∗M,Z变换后得到传输函数为,
H
c
i
c
(
z
)
=
Y
(
z
)
X
(
z
)
=
1
1
−
z
−
1
(
1
−
z
−
R
M
)
H_{cic}(z)=\frac{Y(z)}{X(z)}=\frac{1}{1-z^{-1}}({1-z^{-RM}})
Hcic(z)=X(z)Y(z)=1−z−11(1−z−RM)
其中
R
R
R是采样率转换因子,
M
M
M是差分延时,上式中右半部分是梳状滤波器的表达式,左半部分是积分器的表达式。令
z
=
e
j
2
π
f
z=e^{j2\pi f}
z=ej2πf,化简后得频率表达式,
H
c
i
c
(
e
j
2
π
f
)
=
1
−
e
−
j
w
R
M
1
−
e
−
j
w
=
e
−
j
w
R
M
/
2
(
e
j
w
R
M
/
2
−
e
−
j
w
R
M
/
2
)
e
−
j
w
/
2
(
e
j
w
/
2
−
e
−
j
w
/
2
)
=
e
−
j
R
M
π
f
(
e
j
R
M
π
f
−
e
−
j
R
M
π
f
)
e
−
j
π
f
(
e
j
π
f
−
e
−
j
π
f
)
=
e
−
j
(
R
M
−
1
)
π
f
s
i
n
(
R
M
π
f
)
s
i
n
(
π
f
)
\begin{aligned} H_{cic}(e{j2\pi f)}& =\frac{{1-e^{-jwRM}}}{1-e^{-jw}} \\ &= \frac{e^{-jwRM/2}(e^{jwRM/2} - e^{-jwRM/2})}{e^{-jw/2}(e^{jw/2}-e^{-jw/2})} \\ &= \frac{e^{-jRM\pi f}(e^{jRM \pi f} - e^{-jRM\pi f})}{e^{-j\pi f}(e^{j\pi f}-e^{-j\pi f})} \\ &= e^{-j(RM-1)\pi f} \frac{sin(RM\pi f)}{sin(\pi f)} \end{aligned}
Hcic(ej2πf)=1−e−jw1−e−jwRM=e−jw/2(ejw/2−e−jw/2)e−jwRM/2(ejwRM/2−e−jwRM/2)=e−jπf(ejπf−e−jπf)e−jRMπf(ejRMπf−e−jRMπf)=e−j(RM−1)πfsin(πf)sin(RMπf)
1阶CIC滤波器提供的衰减有限,为了达到更高的衰减效果,一般将多阶级联使用。
多阶级联CIC滤波器
N阶CIC滤波器的表达式为:
H
=
H
c
i
c
N
=
(
1
−
z
−
R
M
1
−
z
−
1
)
N
=
e
−
j
N
(
R
M
−
1
)
π
f
(
s
i
n
(
R
M
π
f
)
s
i
n
(
π
f
)
)
N
H={H_{cic}}^{N}={(\frac{{1-z^{-RM}}}{1-z^{-1}})}^N=e^{-jN(RM-1)\pi f} (\frac{sin(RM\pi f)}{sin(\pi f)})^{N}
H=HcicN=(1−z−11−z−RM)N=e−jN(RM−1)πf(sin(πf)sin(RMπf))N
CIC补偿滤波器
CIC滤波器的优点明显,但也有其缺点,级联后的通带比较窄,为了克服这个缺点,一般有两种解决方法,以降采样为例,
1)使用cic进行初步降低,后续在使用半带滤波器或fir滤波器进行级联使用。
2)利用补偿滤波器对通带内进行补偿,补偿滤波器的设计方法就是设计一个在通带内频率响应为CIC滤波器频率响应倒数的滤波器,将两个滤波器级联后,可以实现通带内频率响应平稳。
PDM转PCM
仿真生成PDM数据
matlab 代码如下:
%% 1.generate pdm signal from data oversample
len = length(data_oversample);
th = 0;
for i = 1:len
if(data_oversample(i)> th)
data_pdm(i) = 1;
else
data_pdm(i) = -1;
end
th = data_pdm(i) - data_oversample(i) + th;
end
CIC 抽取
intOut = zeros(N,1);
delay_intOut = zeros(N,1);
yn = [];
yn_tmp = [];
for i = 1:length(data_pdm)
tmp = data_pdm(i);
for j = 1:N %%integrate
intOut(j) = intOut(j) + tmp;
tmp = intOut(j);
end
if mod(i,R) == 1 %%decimator
tmp = intOut(N);
yn_tmp = [yn_tmp tmp];
for j = 1:N %%comb
combOut = tmp - delay_intOut(j,1);
delay_intOut(j,1) = tmp;
tmp = combOut ;
end
yn = [yn combOut];
end
end
data_cic = yn(:)/(R^N);
设计补偿滤波器
利用matlab fir2 函数设计频率响应为 cic 滤波器导数,也可以使用之前介绍的cvx方法计算指定响应的滤波器。
%% desigen filter
Fo = Fc/Fs;
p = 2e3;
s = 0.25/p;
fp = [0:s:Fo];
fs = (Fo+s):s:0.5;
f = [fp fs]*2;
Mp = ones(1,length(fp));
Mp(2:end) = abs(R*sin(pi*fp(2:end)/R)./sin(pi*M*fp(2:end))).^N;
Mf = [Mp zeros(1,length(fs))];
f(end) = 1;
h = fir2(L,f,Mf); %% Filter length L+1
效果
参考
[1]Hogenauer, E. An economical class of digital filters for decimation and interpolation[J]. IEEE Trans.acoust.speech Signal Process, 1981, 29(2):155-162.