天天看点

基于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        

继续阅读