moerjielovecookie

Sawen_Blog

一个普通工科牲的博客网站
x
github
follow
email

多速率信号处理-CIC滤波器

1 基本原理#

级联积分梳状滤波器(Cascade Intergrator Comb)是多速率信号处理中一种十分高效的数字滤波器。CIC 滤波器具有低通滤波器的特性,同时具有以下优势:

  • 滤波器系数全为 1,设计时不需要存储滤波器系数,节省存储单元,同时使得滤波时只需要加法器和累加器,不需要乘法器
  • 结构规则,可灵活设置插值因子而不影响整体结构

1.1 积分器#

积分器结构为

2024after4202409052106726.png

时域上可表示为

y1(n)=x(n)+y1(n1)y_1(n)=x(n)+y_1(n-1)

频域上可表示为

H1(ejw)=11ejwH_1(\mathrm{e}^{\mathrm{j}w})=\frac{1}{1-\mathrm{e}^{-\mathrm{j}w}}

可得积分器的幅度谱为

H1(ejw)=11ejw=1ejw/2(ejw/2ejw/2)=12sin(w2)\left|H_1(\mathrm{e}^{jw})\right|=\left|\frac{1}{1-\mathrm{e}^{-jw}}\right|=\left|\frac{1}{\mathrm{e}^{-jw/2}(\mathrm{e}^{jw/2}-\mathrm{e}^{-jw/2})}\right|=\left|\frac{1}{2\sin\left(\frac{w}{2}\right)}\right|

从公式可以得出积分器只有极点 $(\omega = 2k \pi,k 为整数)$ 而无零点,且对直流信号具有无限大的增益。

1725542139077.png

1.2 梳状滤波器#

时域上可表示为

yC(n)=x(n)x(nRM)y_C(n)=x(n)-x(n-RM)

其中

  • R 是插值因子或抽取因子
  • M 是微分时延

频域上可表示为

HC(z)=1zRMH_\mathrm{C}(z)=1-z^{-RM}

幅度谱为

HC(ejw)=1ejRMw=ejRMw/2(ejRMw/2ejRMw/2)=2sin(RM2w)\left|H_{\mathrm{C}}(\mathrm{e}^{\mathrm{j}w})\right|=\left|1-\mathrm{e}^{-\mathrm{j}RMw}\right|=\left|\mathrm{e}^{-\mathrm{j}RMw/2}(\mathrm{e}^{\mathrm{j}RMw/2}-\mathrm{e}^{-\mathrm{j}RMw/2})\right|=2\left|\sin\left(\frac{RM}{2}w\right)\right|

1725542829180.png

可知梳状滤波器只有零点,没有极点

若 R=8、M=1,则结构为

1725542752856.png

由此可知单级 CIC 滤波器的幅度谱为

HCIC(ejw)=H1(ejw)HC(ejw)=sin(RM2w)sin(w2)\left|H_{\mathrm{CIC}}(\mathrm{e}^{\mathrm{j}w})\right|=\left|H_{1}(\mathrm{e}^{\mathrm{j}w})\right|\cdot\left|H_{\mathrm{C}}(\mathrm{e}^{\mathrm{j}w})\right|=\left|\frac{\sin\left(\frac{RM}{2}w\right)}{\sin\left(\frac{w}{2}\right)}\right|

当 $\mathrm {RM\omega}/2=\mathrm {k}:\pi $ 时,即 $w=\frac {2k\pi}{RM}\quad (k=\pm1,\pm2,\cdots,\pm (RM-1))$ 时可以确定零点

当 $\omega /2 =k\pi,即 \omega = 2k\pi$ 时,可得此时的幅频响应为

HCIC(ejω)ω=2kπ=RM\left|H_{\mathrm{CIC}}(\mathrm{e}^{\mathrm{j}\omega})\right|_{\omega=2k\pi}=RM

从而实现了零极点相消

单级 CIC 滤波器在 $\omega =0 时 \left| H_{CIC}(e^{j\omega}) \right|=RM$,所以主瓣区间为 $\begin {bmatrix} 0,\frac {2\pi}{RM}\end {bmatrix}$,其余都为旁瓣,第一旁瓣电平为

A1=HCIC(ejw)w=3πRM=sin(RM2×3πRM)sin(12×3πRM)=1sin(3π2RM)A_1=\left|H_{\mathrm{CIC}}(\mathrm{e}^{\mathrm{j}w})\right|_{w=\frac{3\pi}{RM}}=\left|\frac{\sin\left(\frac{RM}{2}\times\frac{3\pi}{RM}\right)}{\sin\left(\frac{1}{2}\times\frac{3\pi}{RM}\right)}\right|=\left|\frac{1}{\sin\left(\frac{3\pi}{2RM}\right)}\right|

因此旁瓣抑制为

A=RMsin(3π2RM)A=\left|RM\sin\left(\frac{3\pi}{2RM}\right)\right|

当 $\mathrm {R}\rightarrow\infty $ 时,旁瓣抑制为

A=20lg(limRA)=20lg(3π2)=13.46dBA=20lg(\lim_{R\to\infty}A)=20lg(\frac{3\pi}{2})=13.46dB

单级 CIC 滤波器的阻带衰减为

α=20lgb\alpha =-20lgb

带内容差(通带波纹)为

δ=20lgbπsin(bπ)\delta = 20lg\left|\frac{b\pi}{\sin(b\pi)}\right|

其中 b 为带宽比例因子

b=Bfs/(RM)b=\frac{B}{f_s/(RM)}

单级 CIC 滤波器的旁瓣电平较高,可通过多级 CIC 级联改善。

H(ejw)=sin(RM2w)sin(w2)N\left|H(\mathrm{e}^{\mathrm{j}w})\right|=\left|\frac{\sin\left(\frac{RM}{2}w\right)}{\sin\left(\frac{w}{2}\right)}\right|^N

1725886131150.png

对于 N 级 CIC 级联滤波器,旁瓣抑制、阻带衰减、带内容差可表示为

{AN=13.46NdBαN=20NlgbδN=20Nlgbπsin(bπ)\begin{cases}A_\mathrm{N}=13.46N\:\mathrm{dB}\\\alpha_\mathrm{N}=-20N\lg b\\\delta_\mathrm{N}=20N\lg\left|\frac{b\pi}{\sin(b\pi)}\right|\end{cases}

增大 CIC 滤波器阶数的话,可以增加旁瓣抑制和阻带衰减,但是会导致带内容差变大。因此考虑到通带性能,通常选择 $N\leq5$。在 N 不变的情况下,带宽比例因子 b 越小,CIC 滤波器的通带和阻带特性也越好,因此 CIC 一般位于插值系统的最后一级(输入速率最高)

2 位增长问题#

由多级滤波器的幅频响应可知,当 $\omega \rightarrow 0$ 时

limw0H(ejw)=limw0RM2cos(RMw/2)12cos(w/2)N=(RM)N\lim\limits_{w\to0}\Bigl|H(\mathrm{e}^{\mathrm{j}w})\Bigr|=\lim\limits_{w\to0}\Biggl|\frac{\frac{RM}{2}\cdot\cos(RMw/2)}{\frac{1}{2}\cdot\cos(w/2)}\Biggr|^N=(RM)^N

由此可知多级 CIC 滤波器可以引起的幅度增益的最大值为

Gmax=(RM)NG_{max}=(RM)^N

假设输入的数据 $x (n)$ 为有符号数,位宽为 $B_{in}$,取值范围为 $[-2^{B_{in}-1},2^{B_{in}-1}-1]$,则输出 $y (n)$ 的最大值为

ymax=2Bm1(RM)Ny_{max}=-2^{B_{\mathrm{m}}-1}\cdot\left(RM\right)^N

因此输出的最大位宽为

Bout=ceil[log2ymax]+1=Nceil[log2(RM)]+BinB_{\mathrm{out}}=\text{ceil}[\log_2|y_{\mathrm{max}}|]+1=N\cdot\text{ceil}[\log_2(RM)]+B_{\mathrm{in}}

在 FPGA 设计时,要合理地设置输出信号的位宽,防止数据的溢出,为了节省资源,也可以在每一级适当的进行截位

3 Matlab 设计 CIC 补偿滤波器#

由于 CIC 滤波器通带内不平坦,因此需要在前级加入 CIC 补偿滤波器。Matlab 中的对应函数为 **fdesign.ciccomp,** 语法如下

d = fdesign.ciccomp
d = fdesign.ciccomp(d,nsections,rcic)
d = fdesign.ciccomp(...,spec)
h = fdesign.ciccomp(...,spec,specvalue1,specvalue2,...)

其中梳状滤波器的延时长度为 d,滤波器阶数为 nsections,CIC 速率转化因子为 rcic。

3.1 example#

h = fdesign.ciccomp;
set(h,NumberOfSections=5,DifferentialDelay=1);
cicComp = design(h,'equiripple',SystemObject=true);
filterAnalyzer(cicComp)
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。