級聯積分梳狀(CIC)濾波器是一種被廣泛應用于軟體無線電中,可以實作抽取或者插值的高效濾波器。它主要用于降低或提高采樣率。CIC濾波器的主要特點是,僅利用加法器、減法器和寄存器,占用資源少,實作簡單且速度高。
CIC濾波器是資料通信的常用子產品,一般應用于數字下變頻(DDC)和數字上變頻(DUC)系統中,随着資料傳輸率的不斷增加,級聯梳狀濾波器(CIC)的應用變得非常重要,CIC濾波器僅利用加法器、減法器和寄存器的特點,是以非常适用工作在高采樣率下。數字下變頻(DDC)中,CIC濾波器起着重要的作用,它主要用對于采樣速率的抽取,同時具有低通濾波器的特性。
濾波器的Z變換為:
積分器I:
圖1 積分器的結構圖
疏狀濾波器C:
D是延時因子,是濾波器的一個重要參數,可以用來控制濾波器的頻率響應,決定零點的位置。D可以是任意正整數,但是D越大,會導緻帶内主瓣的衰減過大,是以通常取1或2。
單級CIC濾波器的的結構圖
N級内插濾波器
N級抽取濾波器
衰減:濾波器為單級時,第一旁瓣與主瓣的比值:
為四級濾波器時,第一旁瓣與主瓣的比值:
中間變量的位擴充:
進而在輸入信号位數為Bin的情況下,濾波輸出的最大可能位數為:
R為抽取或插值因子,N濾波器級數。
2.matalab分析CIC插值濾波器頻譜
打開matlab,選擇左下角的“start”,“toolboxes”—“filterDesign”—“fdatool”
打開fadtool界面:
設計(25/24)MHz采樣率、24倍插值、4級CIC濾波器的頻譜圖,如下:
由上圖可以見,主瓣大概40KHz,通帶隻有30KHz。
2、用matlab程式sin_1MHz_gen.m生成正弦波波形表,改變變量f0=1.5e6可以生成不同頻率的波形。把第一個周期的波形資料存入signal_1m.dat檔案中,存入的資料個數為Fs/Fo的最小正整數之比的分子,比如Fs=25MHz,Fo=0.3MHz,Fs/Fo=250/3(Fs=25/24MHz),則存入檔案signal_1m.dat的波形資料個數為開頭的250個資料。相應的signal_gen0.v中的語句if(i0<50)相應的改為if(i0<250)。仿真時signal_1m.dat放在仿真目錄下
3、用sin_1MHz_gen.m産生1MHz正弦波信号,并把資料hex_sin_data的前25個資料存入signal_1m.dat檔案,相應的signal_gen0.v中的語句if(i0<50)相應的改為if(i0<25)。
仿真的波形如下圖:
由圖可見資料速率變高了,變為了25MHz,同時對信号也起了衰減作用
4、用sin_1MHz_gen.m産生0.1MHz正弦波信号(f0=0.1e6),Fs/Fo=125/12,把資料hex_sin_data的前125個資料存入signal_1m.dat檔案,相應的signal_gen0.v中的語句if(i0<25)相應的改為if(i0<125)。
仿真的波形如下圖:
CIC對信号旗衰減左右。
5、用sin_1MHz_gen.m産生1MHz正弦波信号(f0=0.01e6),Fs/Fo=625/6,把資料hex_sin_data的前625個資料存入signal_1m.dat檔案,相應的signal_gen0.v中的語句if(i0<50)相應的改為if(i0<625)。
仿真的波形如下圖:
由此可見CIC濾波器對帶内的信号也是具有小的衰減
由此可見CIC适合作為窄帶低通濾波器。部分代碼如下:
//==========================================================================
`timescale 1ns/1ps
module cic_dec_arithmetic
(
//sys_signal
input i_fpga_clk ,//25MHz
input i_rst_n ,
//input
input [7:0] i_cic_data , //輸入的資料
output [7:0] o_cic_data
);
//=============================== main=============================
//==================================================================
//1. 積分器例化
//==================================================================
//--CIC0
wire [26:0] integral_data ;//位擴充,防止累加溢出,8+4*log2(24)=27
multilevel_integrator u0_multilevel_integrator
(
//sys_signal
.i_fpga_clk (i_fpga_clk ),//25MHz
.i_rst_n (i_rst_n ),
//input
.i_integral_data (i_cic_data ),
//output
.o_integral_data (integral_data )
);
//==================================================================
//2. 24倍抽取,當然抽取率也可以取1
//==================================================================
wire [26:0] dec24_data ;
wire dec24_fp ;
cic_dec24 u0_cic_dec24
(
//sys_signal
.i_fpga_clk ( i_fpga_clk ),//25Mhz
.i_rst_n (i_rst_n ),
//input
.i_data ( integral_data),
.o_data ( dec24_data ),
.o_fp ( dec24_fp )
);
//==================================================================
//3. 派生濾波器
//==================================================================
multilevel_der_filter u0_multilevel_der_filter
(
//sys_signal
.i_fpga_clk ( i_fpga_clk ),//25MHz
.i_rst_n (i_rst_n ),
//input
.i_data