cic滤波器是无线通信中的常用模块,一般用于数字下变频(ddc)和数字上变频(duc)系统。随着现代无线通信中数据速率的增加,它的应用变得尤为重要。cic滤波器的结构简单,没有乘法器,只有加法器、积分器和寄存器,适合于工作在高采样率条件下,而且cic滤波器是一种基于零点相消的fir滤波器,已经被证明是在高速抽取或插值系统中非常有效的单元。 我们首先产生一个采样率fs=0.78125mhz,频率fout=0.078125mhz的样本信号,对其进行16倍插值。这就涉及到直接频率合成器dds的知识:
上图的ram部分存放通过matlab生成一个周期完整正弦波的离散点。fc采样时钟:本模块用一个50mhz的采样时钟,即每隔20ns,从ram中读出一个采样值。这里记住还有一种通过使能信号去读取ram的值,这个时候的fc一定不能用时钟信号50m去算,而应该以使能信号频率去计算,下面会详细体现。
相位累加器:顾名思义,在这里完成相位累加的功能,相位累加器的溢出频率就是dds输出的信号频率,位宽为n。
频率控制字m: 决定输出频率,相当于相位累加器地址addr步进值。
目标频率:fout=fs*m/2^n,对于这个公式我们可以这么理解,一秒内相位累加器的累加值为fs*m,而寄存器最大值为2^(n-1),溢出次数为fs*m/2^n,因为寄存器中的值从0增加到2^(n-1),刚好输出一个周期的正弦波信号。所以,寄存器溢出的次数就是输出正弦波的周期数。
接下来我们来实现它,首先用matlab产生一个完整周期的正弦波样本,将其存入rom。具体实现方法参见这篇文章:如何用matlab产生fpga设计中所需的coe xtmif文件
clc;clear all;n=2^8;s_p=0:255;%正弦波一个周期的采样点数 rom深度256,位宽8sin_data=sin(2*pi*s_p/n);fix_p_sin_data=fix(sin_data*127);for i=1:nif fix_p_sin_data(i)<0 fix_p_sin_data(i)=n+fix_p_sin_data(i);%有符号数--得+else fix_p_sin_data(i)=fix_p_sin_data(i);endendfid = fopen('sin.coe','w');% 打开一个.coe文件% 存放在rom中的.coe文件第一行必须是这个字符串,10表示10进制,可以改成其他进制fprintf(fid,'memory_initialization_radix = 10;');% 存放在rom中的.coe文件第二行必须是这个字符串fprintf(fid,'memory_initialization_vector = ');% 把前255个数据写入.coe文件中,并用逗号隔开,为了方便知道数据的个数,每行只写一个数据fprintf(fid,'%d,',fix_p_sin_data(1:end-1));% 把最后一个数据写入.coe文件中,并用分号结尾fprintf(fid,'%d;',fix_p_sin_data(end)); fclose(fid); % 关闭文件指针
在vivado中调用rom ip核,存放一个周期正弦波的信息:
这一步加载我们用matlab生成的coe文件,如果加载的coe文件错误,箭头指的地方会报红。创建完rom后例化仿真:
module dds( input wire clk, input wire rst_n, output wire [7:0] o_wave);reg [7:0] addr;always @(posedge clk)beginif(!rst_n) addr <= 8'd0;else addr <= addr + 1'b1;endsp_ram_256x8 sp_ram_256x8 ( .clka(clk), // input wire clka .addra(addr ), // input wire [7 : 0] addra .douta(o_wave) // output wire [7 : 0] douta);
仿真图如下:
接下来我们首先产生一个采样率fs=0.78125mhz,频率fout=0.078125mhz的样本信号:
module gen_sin( input wire sclk, input wire rst_n, output wire [7:0] data_o, output reg data_v);parameter div_num=6'd63;//50m/64=0.78125m采样率//fc = 0.078125mhz信号频率//fs = 0.78125mhz采样频率parameter frq_w_1m=32'd429496730;//2^32*(0.078125)/0.78125//fc=m*fs/2^32 reg [31:0] phase_sum_1m;wire [7:0] addr_1m;wire [7:0] o_wave_1m;reg [5:0] div_cnt;reg s_flag;//分频产生0.78125m采样率always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0) div_cnt <= 'd0;else if(div_cnt == div_num) div_cnt <= 'd0; else div_cnt <= div_cnt + 1'b1;//梳状滤波器驱动脉冲 always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0) s_flag <= 1'b0;else if(div_cnt == 6'd0) s_flag <= 1'b1;else s_flag <= 1'b0;always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) data_v <= 1'b0; else data_v <= 1'b1;assign data_o = o_wave_1m;//0.78125////相位累加器always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0) phase_sum_1m<='d0;else if(s_flag == 1'b1) phase_sum_1m <= phase_sum_1m + frq_w_1m ;//相位assign addr_1m=phase_sum_1m[31:24];sp_ram_256x8 sp_ram_256x8 ( .clka(sclk), // input wire clka .addra(addr_1m), // input wire [7 : 0] addra .douta(o_wave_1m) // output wire [7 : 0] douta);endmodule 数字信号的频谱是周期性的,且周期等于数据的采样频率。整数倍零值内插当然不能简单地等同于提高了数据采样频率,在插值过程中,频谱会以采样频率进行压缩,可能会引起频谱混叠,通过内插、低通滤波处理后,即可得到正确的经高速采样后的数字信号。如下图所示:
所以多速率信号处理过程的关键是设计满足要求的抗混叠滤波器。即抽取或内插处理后,在有用信号频段内不产生频谱混叠。同时要求滤波器占用硬件资源少且运算速度快,一般只要有效增加滤波器的阶数,可以设计出满足指标要求的各种抗混叠滤波器。cic(积分梳状)滤波器及半带滤波器因为具有运算速度快、占用资源少等特点,在多速率信号处理中得到了广泛的应用。其冲激响应为:
它的抽头系数只有1或者0。 直接用matlab仿真观察,分析一下 cic 滤波器的频谱特性,可得到其幅频特性。
根据上述公式在matlab中编写如下代码观察滤波器抑制情况:
clc;clear all;r=16;m=1;n=3;n=0500-1;w=pi*n/(length(n));num=sin(r*m*w/2);den=sin(w/2);h=(num./den).^n;abs_h=abs(h);mag=20*log10(abs_h/max(abs_h));plot(w/pi,mag);grid on;axis([0,1,-200,0]);
由上图可知,对带外信号有很好的抑制效果。
在进行verilog实现时,首先要把具体电路结构映射出来,cic滤波器具体实现框图如下,系数为1:
按照上述框图进行编码,对上述生成的样本信号(采样率fs=0.78125mhz,频率fout=0.078125mhz的样本信号)进行16倍插值滤波处理(fs采样率提高,信号频率fout不变),涉及代码均参考v3学社尤老师,读者可访问文后提供的网址学习参考:
module cic_interpolate( input wire sclk,//50m input wire rst_n, input wire [7:0] data_in, input wire data_v, output wire [19:0] data_out);parameter w=20;parameter div_num=6'd63;//50m/64=0.78125mparameter div_num_i=3'd3;//bin + n*log2(r)=8+3*4=20;reg [w-1:0] comb1;reg [w-1:0] comb2;reg [w-1:0] comb3;reg [w-1:0] integ1;reg [w-1:0] integ2;reg [w-1:0] integ3;wire [w-1:0] comb1_w;wire [w-1:0] comb2_w;wire [w-1:0] comb3_w;wire [w-1:0] integ1_w;wire [w-1:0] integ2_w;wire [w-1:0] integ3_w;reg [5:0] div_cnt;reg s_flag;reg s_flag_i;//此计数器用于控制分频,为梳状滤波器和积分滤波器提供驱动脉冲always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0) div_cnt <= 'd0;else if(div_cnt == div_num) div_cnt <= 'd0; else div_cnt <= div_cnt + 1'b1;//梳状滤波器驱动脉冲 always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0) s_flag <= 1'b0;else if(div_cnt == 6'd0) s_flag <= 1'b1;else s_flag <= 1'b0;//积分滤波器驱动脉冲always @(posedge sclk or negedge rst_n) if(rst_n == 1'b0) s_flag_i <= 1'b0; else if(div_cnt[1:0] == 2'd0) s_flag_i <= 1'b1; else s_flag_i <= 1'b0;//梳状滤波器的寄存器always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0) comb1<='d0;else if(data_v == 1'b1 && s_flag == 1'b1) comb1<= {{12{data_in[7]}},data_in};else if(data_v == 1'b0) comb1<='d0;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0) comb2<='d0;else if(data_v == 1'b1 && s_flag == 1'b1) comb2<= comb1_w;else if(data_v == 1'b0) comb2<='d0;always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0) comb3<='d0;else if(data_v == 1'b1 && s_flag == 1'b1) comb3<= comb2_w;else if(data_v == 1'b0) comb3<='d0;//寄存器间的组合逻辑assign comb1_w= {{12{data_in[7]}},data_in}-comb1;assign comb2_w= comb1_w-comb2;assign comb3_w= comb2_w-comb3;//积分滤波器间的组合逻辑assign integ1_w=comb3_w + integ1;assign integ2_w=integ1_w + integ2;assign integ3_w=integ2_w + integ3;//插值后的结果输出assign data_out = integ3_w;//积分滤波器的寄存器always @(posedge sclk or negedge rst_n)if(rst_n == 1'b0) begin integ1<='d0; integ2<='d0; integ3<='d0; endelse if(data_v == 1'b1 && s_flag_i == 1'b1)begin integ1<=integ1_w; integ2<=integ2_w; integ3<=integ3_w; endendmodule
对上述模块进行仿真:红框为插值前,绿框为插值后效果,直观的看到输出信号更加平滑细腻:
达芬奇开拓手术机器人市场,并且几乎垄断
自动驾驶汽车凭啥成为杀手应用?有数据平台在背后撑腰
一加手机5详细配置曝光,残暴无人性,搭载骁龙835,全玻璃机身!
QORVO推出MMIC功率放大器突破功率屏障
采用MAXQ2000实现与MAX1169的高速I²
CIC插值滤波器与直接频率合成器DDS的FPGA实现
数字功放与模拟功放的分析
单片机软件定时器的实现方法
2018年最具潜力的20大新材料
小鹏汽车实现100个城市充电服务:终身免费
振动传感器BM1构成的振动检测电路
Microsoft Windows Embedded CE
对CCD外观检查机的视觉检测系统的简单介绍
快速自动测氢仪,煤炭自动测氢仪厂家, 实验室测氢仪,中创仪器
CMOS振荡器设计
乾照光电收购博蓝特,距离LED产业链一体化又进一步
单相电表和三相电表有什么区别
三星电子打造开放式的智能IoT系统,助力IoT产业的整体发展
LGD正考虑将E5产线生产用于iPhone的OLED面板
天际汽车旗下增程式A+级SUV天际ME5介绍