我們可以通過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相對於直流衰減不能超過0.5dB.
所以在變速率系統中,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('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