天天看點

基于MATLAB FDATOOL的CIC濾波器設計

級聯積分梳狀(CIC)濾波器是一種被廣泛應用于軟體無線電中,可以實作抽取或者插值的高效濾波器。它主要用于降低或提高采樣率。CIC濾波器的主要特點是,僅利用加法器、減法器和寄存器,占用資源少,實作簡單且速度高。

CIC濾波器是資料通信的常用子產品,一般應用于數字下變頻(DDC)和數字上變頻(DUC)系統中,随着資料傳輸率的不斷增加,級聯梳狀濾波器(CIC)的應用變得非常重要,CIC濾波器僅利用加法器、減法器和寄存器的特點,是以非常适用工作在高采樣率下。數字下變頻(DDC)中,CIC濾波器起着重要的作用,它主要用對于采樣速率的抽取,同時具有低通濾波器的特性。

濾波器的Z變換為:

基于MATLAB FDATOOL的CIC濾波器設計

積分器I:

基于MATLAB FDATOOL的CIC濾波器設計
基于MATLAB FDATOOL的CIC濾波器設計

圖1 積分器的結構圖

疏狀濾波器C:

基于MATLAB FDATOOL的CIC濾波器設計
基于MATLAB FDATOOL的CIC濾波器設計

D是延時因子,是濾波器的一個重要參數,可以用來控制濾波器的頻率響應,決定零點的位置。D可以是任意正整數,但是D越大,會導緻帶内主瓣的衰減過大,是以通常取1或2。

基于MATLAB FDATOOL的CIC濾波器設計

單級CIC濾波器的的結構圖

基于MATLAB FDATOOL的CIC濾波器設計

N級内插濾波器

基于MATLAB FDATOOL的CIC濾波器設計

N級抽取濾波器

衰減:濾波器為單級時,第一旁瓣與主瓣的比值:

基于MATLAB FDATOOL的CIC濾波器設計

為四級濾波器時,第一旁瓣與主瓣的比值:

基于MATLAB FDATOOL的CIC濾波器設計

中間變量的位擴充:

進而在輸入信号位數為Bin的情況下,濾波輸出的最大可能位數為:

基于MATLAB FDATOOL的CIC濾波器設計

R為抽取或插值因子,N濾波器級數。

2.matalab分析CIC插值濾波器頻譜

打開matlab,選擇左下角的“start”,“toolboxes”—“filterDesign”—“fdatool”

打開fadtool界面:

基于MATLAB FDATOOL的CIC濾波器設計

設計(25/24)MHz采樣率、24倍插值、4級CIC濾波器的頻譜圖,如下:

基于MATLAB FDATOOL的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)。

仿真的波形如下圖:

基于MATLAB FDATOOL的CIC濾波器設計

由圖可見資料速率變高了,變為了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)。

仿真的波形如下圖:

基于MATLAB FDATOOL的CIC濾波器設計

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)。

仿真的波形如下圖:

基于MATLAB FDATOOL的CIC濾波器設計

由此可見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        

繼續閱讀