级联积分梳状(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