CIC滤波器实现简单,资源消耗少(只需要加法器),成为变采样率系统中比较常用的滤波器,但也需要在合适的场景中使用,不然对信号质量会造成较大影响。 我们可以通过matlab的filter designer了解CIC滤波器的各种特性。通过图1和图2找到CIC滤波器设计窗口。 从幅频曲线中容易得出CIC滤器器通带平台性差,过渡带宽,带外抑制性能起伏较大。 带外抑制性能可以通过增加CIC级数(Number Of Sections)来提升,但这会对通带平坦性带来负面影响,具体设计CIC时需要折中该参数。 通常在C语言实现CIC时,可以将该参数设计为偶数,这样会使拖尾是一个整数,方便去掉数据首尾的无效值。更进一步,设计为2,4,8时,归一化可以直接通过移位实现。 当我们使用CIC时,需要保证 有用信号的fmax应足够小于fs/2/Mcic ,其中Mcic为内插倍数。这样才能保证在有效带宽内足够的平坦度,一般fmax相对于直流衰减不能超过. 所以在变速率系统中,CIC一般作为最后数字滤波器的前端(靠近模拟域),如上采样系统中信号先经过限带成型滤波器(低通FIR),HB滤器组,最后经过CIC到DAC速率。 下图为8倍上采样的图示。 需要注意的是为了保证CIC前后信号时域采样点平均功率的一致性,在第一级CIC滤波器中没有做归一化,这部分增益正好可以补偿上采样插0带来采样点功率的损失。后续每一级都要做归一化,防止溢出。 clear;clc;close all; %% load data symbols from RRC out,make sure fmax << fs/2/Mcic load('') % 8x oversampling signal symbPower = funCountPower(zeroDataFilterOut); % Power before filter %% CIC filter for interpolate 8 times Mcic = 8; coefCic = ones(Mcic,1); N = 4; % number of CIC section modDataZero8x = upsample(zeroDataFilterOut,Mcic); txPower = funCountPower(modDataZero8x); % Power after zero insertion %% filter dataFilterTemp = conv(modDataZero8x,coefCic); % First CIC section for i = 1:N-1 dataFilterTemp = conv(dataFilterTemp,coefCic)/Mcic; end tailLen = N*(Mcic-1)/2; dataOut = dataFilterTemp(tailLen+1:end-tailLen); outPower = funCountPower(dataOut); % Power after filter