基于MATLAB FDATOOL的CIC滤波器设计

级联积分梳状(CIC)滤波器是一种被广泛应用于软件无线电中,可以实现抽取或者插值的高效滤波器。它主要用于降低或提高采样率。CIC滤波器的主要特点是,仅利用加法器、减法器和寄存器,占用资源少,实现简单且速度高。

CIC滤波器是数据通信的常用模块,一般应用于数字下变频(DDC)和数字上变频(DUC)系统中,随着数据传输率的不断增加,级联梳状滤波器(CIC)的应用变得非常重要,CIC滤波器仅利用加法器、减法器和寄存器的特点,所以非常适用工作在高采样率下。数字下变频(DDC)中,CIC滤波器起着重要的作用,它主要用对于采样速率的抽取,同时具有低通滤波器的特性。

滤波器的Z变换为:

 


积分器I




 


1 积分器的结构图

疏状滤波器C:

 


 

D是延时因子,是滤波器的一个重要参数,可以用来控制滤波器的频率响应,决定零点的位置。D可以是任意正整数,但是D越大,会导致带内主瓣的衰减过大,所以通常取12



单级CIC滤波器的的结构图



 

N级内插滤波器



N级抽取滤波器

 

衰减:滤波器为单级时,第一旁瓣与主瓣的比值:

 



为四级滤波器时,第一旁瓣与主瓣的比值:

 


 

中间变量的位扩展:

从而在输入信号位数为Bin的情况下,滤波输出的最大可能位数为:

 


R为抽取或插值因子,N滤波器级数。


2.matalab分析CIC插值滤波器频谱

打开matlab,选择左下角的“start”,“toolboxes”—“filterDesign”—“fdatool

打开fadtool界面:

 

设计(25/24)MHz采样率、24倍插值、4CIC滤波器的频谱图,如下:

 


由上图可以见,主瓣大概40KHz,通带只有30KHz

 

2、用matlab程序sin_1MHz_gen.m生成正弦波波形表,改变变量f0=1.5e6可以生成不同频率的波形。把第一个周期的波形数据存入signal_1m.dat文件中,存入的数据个数为Fs/Fo的最小正整数之比的分子,比如Fs=25MHzFo=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.1e6Fs/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.01e6Fs/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        

猜你喜欢

转载自blog.csdn.net/wordwarwordwar/article/details/80473471