- Richard G.Lyons, "Understanding Digital Singal Processing, 2nd Edition", Section 10.5.1
- Hogenauer, 1981, "An Economical Class of Digital Filters for Decimation and Interpolation"

标准的移动平均滤波器(a),是将最近D个数据求和(D=OSR)后平均
y(n)=D1[x(n)+x(n−1)+x(n−2)+⋯+x(n−D+1)]
Z域表达式为
Y(z)=D1[X(z)z0+X(z)z−1+X(z)z−2+⋯+X(z)z−D+1]
得到传递函数为
Ha(z)=X(z)Y(z)=D1(1+z−1+z−2+⋯+z−D+1)
等价且效率更高的传递函数,是把输出考虑进来,如图(b)所示,y(n)等于y(n−1)再加上一个数,这个数等于
y(n)−y(n−1)=D1[x(n)−x(n−D)]
求解这个离散时域表达式的Z变换,得到
Y(z)−Y(z)z−1=D1[X(z)−X(z)z−D]
得到传递函数为
Hb(z)=D11−z−11−z−D
从数学上看,其实Hb(z)就是Ha等比数列求和公式的化简,得到递推求和滤波器(b)
,首项是1,公比是z,项数是D
等比数列求和=1−公比首项×(1−公比项数)
如果不考虑增益1/D,结构(b)可以简化为结构(c),从硬件实现上看,结构(c)只需要完成两次加法,值需要存储x(n), x(n−D), y(n−1), y(n−1) 这个4个数据。
同时注意到,他们的延迟长度略有不同,结构(a)的延迟单元为D−1,结构(b)和(c)的延迟单元为D。
这样得到了一阶CIC的标准形式
Hcic=1−z−11−z−D
先是comb(1−z−D),然后是integrator(1−z−1)。举一个时域分析的例子,D=5的例子:
- comb只在0和D处有值,其余都是零;
- integrator的递推表达式,y(n)=y(n−1)+x(n)冲击响应,冲击输入为[1,0,0...],那么integrator那么输出就是[0+1,1+0,1+0,...]=[1,1,1...]
- 两者卷积,结果如下,根据这个时域冲击函数,发现和直接求和的滤波器一样,还是$$y(n)=x(n)+x(n-1)+x(n-2)+x(n-3)+x(n-4)$$

将z=ejωTs=ej2πf/fs代入传递函数,简化分析,假设Ts=1,分子分母提取公因式,得到
H(ω)=1−ejω1−ejωD=e−jω/2(ejω/2−e−jω/2)e−jωD/2(ejωD/2−e−jωD/2)
利用欧拉公式sin(α)=ejα−e−jα,上式可以化简为
H(ω)=e−jω/2sin(ω/2)e−jωD/2sin(ωD/2)=ejω(D−1)/2sin(ω/2)sin(Dω/2)
将ω=2πf代入,同时并求幅值,同时有limx→0sinx=x,得到
∣H(f)∣=DDπfsin(Dπf)
当Dπf/fs=nπ时,∣H(f)∣=0,这样就得到Notch Frequency
fnotch=Dnfs,n≥1
单边带热噪声功率谱密度为Sn,ssb,单位V2/Hz的高斯白信号,经过抽取率D的CIC滤波后的功率为
∫Sn,dsb∣H∣2=∫−fs/2fs/22Sn,ssb∣∣∣∣∣1−ej2πf/fs1−eDj2πf/fs∣∣∣∣∣2=D2⋅Sn,ssb⋅D0.5fs
所以,对于单边带噪声,功率谱密度为Sn,ssb的信号,单位是V/sqrt(Hz),经过SINC1之后的功率为如下,得到NBW=0.5*fs/D,
对于白噪声(比如热噪声),经过SINC-N滤波器后,剩余的噪声可以拖过NBW非常容易地计算出来,比如热噪声的功率谱密度(PSD,Power Spectra Density)是Sn,ssb=1V2/Hz,注意这是单边带的PSD,也就是我们Cadence Spectre RF仿真得到的结果,经过一个SINC1抽取滤波后,剩余的噪声功率就等于Sn,ssb⋅0.5⋅fs/OSR=Sn,ssb⋅0.5⋅ODR,这里ODR为Output Data Rate,也就是fs/OSR。
Type |
SINC1 |
SINC2 |
SINC3 |
SINC4 |
SINC5 |
Gain |
OSR1 |
OSR2 |
OSR3 |
OSR4 |
OSR5 |
Vn,sinc2 |
\dfrac{0.5\times f_s}{OSR}\times S_ |
\dfrac{0.333\times f_s}{OSR}\times S_ |
\dfrac{0.275\times f_s}{OSR}\times S_ |
\dfrac{0.240\times f_s}{OSR}\times S_ |
\dfrac{0.215\times f_s}{OSR}\times S_ |
Vn,sinc2 |
OSR1.0×Vn,rms2 |
OSR0.667×Vn,rms2 |
OSR0.55×Vn,rms2 |
OSR0.48×Vn,rms2 |
OSR0.43×Vn,rms2 |
注意Mathematic里是积分,使用的的数值积分NIntegrate
,如果用Integrate
,由于MMA的BUG,需要首先用ComplexExpand
展开后再积分
calculus and analysis - Implementation of SINC filter using Integrate results in incorrect output - Mathematica Stack Exchange
ClearAll["Global`*"]
osr = 128;
fs = 1;
z = E^(I*2*\[Pi]*f/fs);
h = (1 - z^-osr)/(1 - z^-1)/osr;
NIntegrate[1/2*(Abs[h^1])^2, {f, -fs/2, fs/2}]/(fs/osr) // N
NIntegrate[1/2*(Abs[h^2])^2, {f, -fs/2, fs/2}]/(fs/osr) // N
NIntegrate[1/2*(Abs[h^3])^2, {f, -fs/2, fs/2}]/(fs/osr) // N
NIntegrate[1/2*(Abs[h^4])^2, {f, -fs/2, fs/2}]/(fs/osr) // N
NIntegrate[1/2*(Abs[h^5])^2, {f, -fs/2, fs/2}]/(fs/osr) // N
从这个图中,非常容易地观察到,Notch Frequency发生在fs/OSR处,SINC3的滤高频等能高于SINC1

ClearAll["Global`*"]
osr = 16;
fs = 256;
z[f_] := E^(I*2*\[Pi]*f/fs)
sinc1[f_] := (1 - z[f]^-osr)/(1 - z[f]^-1)/osr;
sincsPlot =
Plot[{20*Log10[Abs[sinc1[f]]], 20*Log10[Abs[sinc1[f]^3]]}, {f, 0.001,
4*fs/osr}, PlotLegends -> {SINC1, SINC3},
PlotLabel -> "dB20 of |SINC1| and |SINC3|, OSR=16, fs=256",
PlotPoints -> 8192,
GridLines -> {Range[0, 64, 8], Range[-140, 0, 10]},
Ticks -> {Range[0, 64, 8], Range[-140, 20, 20]}]