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