【CIC滤波器】基于MATLAB/FPGA的数字CIC滤波器的设计

FPGA代码:

module down(
           i_clk,//输入时钟
           i_rst,//输入复位信号
           i_M,  //抽取值
           i_data,//输入信号
           o_data,//输出信号
           r_clk
           );
           
input              i_clk;//输入时钟
input              i_rst;//输入复位信号
input       [7:0]  i_M;  //抽取值          
input signed[31:0] i_data;//输入信号
output signed[31:0]o_data;//输出信号
output             r_clk;//输出信号
reg       [7:0] r_cnt =8'd0;
reg signed[31:0]o_data=32'd0;
reg             r_clk =1'b0;

always @(posedge i_clk)
begin
     if(!i_rst)//系统复位
     begin
     r_cnt<=8'd0;
     r_clk<=1'b0;
     end
else begin
          if(r_cnt==i_M/2-1)//分频
          begin
          r_clk<=~r_clk;
          r_cnt<=8'd0;
          end
     else begin
          r_cnt<=r_cnt+1'b1;
          r_clk<=r_clk; 
          end 
     end
end 

always @(posedge r_clk)
begin
     if(!i_rst)//系统复位
     begin
     o_data<=32'd0;
     end
else begin
     o_data<=i_data;//抽取
     end
end 


endmodule           

MATLAB代码:

clc;
clear;
close all;

%CIC又称为梳状滤波器,所以这里首先给出其梳状波形。。。。
%积分滤波器的响应
b1=1;
a1=[1 -1];
D=9;
b2=[1 zeros(1,D-1) -1];
a2=1;
b3=b2;
a3=a1;
b4=conv(b3,b3);
a4=conv(a3,a3);
b5=conv(b4,b3);
a5=conv(a4,a3);
b6=conv(b4,b4);
a6=conv(a4,a4);
b7=conv(b6,b3);
a7=conv(a6,a3);
figure(1);
freqz(b7/D^5,a7,'whole');



%CIC抽取滤波器
% 抽取因子
r = 2;                 
hm = mfilt.cicdecim(r);  
%原始的采样率 44.1kHz.
fs = 44.1e3; 
%10240个采样点
n = 0:10239;           
%原始信号
x  = sin(2*pi*1e3/fs*n);  
%得到抽取后的5120个采样点
y_fi = filter(hm,x);        
x = double(x);
y = double(y_fi);
y = y/max(abs(y));
figure(2);
stem(n(1:44)/fs,x(2:45)); hold on;  
stem(n(1:22)/(fs/r),y(3:24),'r','filled'); 
xlabel('时间(sec)');ylabel('信号值');
title('CIC抽取滤波器');


%CIC内插滤波器
%插值因子
R = 2;                    
hm = mfilt.cicinterp(R);
% 原始采样频率:22.05 kHz.
fs = 22.05e3;           
% 5120个采样点
n = 0:5119;              
%原始信号
x = sin(2*pi*1e3/fs*n);    
y_fi = filter(hm,x);  
x = double(x);
y = double(y_fi);
y = y/max(abs(y));
figure(3);
stem(n(1:22)/fs,x(1:22),'filled'); hold on;
stem(n(1:44)/(fs*R),y(4:47),'r');  
xlabel('时间(sec)');ylabel('信号值');
title('CIC内插滤波器');

仿真与说明

1.1 MATLAB设计说明

这个CIC滤波器的频率特性,如果上图,上图和梳子比较相似。所以称为梳状滤波器。

    这个是CIC抽取滤波器,如图可以看到,每2个点抽取一个点,达到抽取效果。

    这个是CIC内插滤波器,如图可以看到,每2个点插入一个点,达到抽取效果。

1.2 FPGA设计说明

    一般在实际应用中,我们多半设计抽取滤波器用的更多,一般抽取滤波器如下所示:

在这里,我们将其中一些参数具体化,设计一个具体参数的CIC滤波器。

我们将这个系统模块话,然后在实际应用的时候,我们只要改变其中的参数就可以了。

系统分为如下三个模块。

       

模块一的设计:

delay_one(

                i_clk,//输入时钟

                i_rst,//输入复位信号

                i_data,//输入信号

                o_data//输出信号

                );

模块二的设计:

down(

           i_clk,//输入时钟

           i_rst,//输入复位信号

           i_M,  //抽取值

           i_data,//输入信号

           o_data//输出信号

           );

模块三的设计:

delay_M(

              i_clk,//输入时钟

              i_rst,//输入复位信号

              i_data,//输入信号

              o_data//输出信号

              );

那么其在顶层,我们只要调用这些模块就行了。

其中CIC积分器输出结果如下所示:

系统滤波输出结果如下所示:

可以看到,滤波后的效果。

当改变CIC级数的时候,就能得到不同效果的CIC滤波器

      检验CIC滤波器最快的方法就是输入一个阶跃信号,这里我们输入的阶跃信号是00FFFFFF,最终通过CIC滤波器的效果如dataout,通过查看相关文献资料,阶跃信号信号通过CIC滤波器后的效果为:

     

  

其效果和我们FPGA设计得到的效果基本相同。

 以上是输入随机信号后滤波效果,显然,其波形特性得到了改善。

A01-23

  • 3
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CIC滤波器是一种数字滤波器,常用于FPGA实现。根据引用[1]中提到的《数字信号处理的FPGA实现(第三版)》一书中的Verilog代码,可以在FPGA上实现3级CIC滤波器。该实现采用了Hogenauer的"剪除"理论。具体的代码和剪除理论的程序可以在该书的第241页找到。 CIC滤波器通常用作窄带低通滤波器,要求有用信号的频带相对于数据速率足够小,以满足通带容限的要求。如果频带较宽,CIC滤波器通常只能用在前端,后面需要使用性能较好的滤波器。在要求较高的场合,通常会将CIC滤波器、半带滤波器和其他类型的FIR滤波器级联起来使用,以获得更好的滤波效果。这一点可以从引用[2]中得出的结论中总结出来。 在Hogenauer抽取滤波器的梳状部分时,延迟长度(差分延迟)为N=D/R,其中D是延迟值,典型值为1或2,R是抽取因子。这是因为按R抽取后N个样值的延迟等于按R抽取前的D个样值的延迟。为了补偿CIC滤波器在通带上的不平坦性,通常需要在多级CIC抽取后添加一个FIR滤波器(补偿器)。这一点可以从引用[3]中得出的信息中注意到。 至于使用MATLABFPGA实现CIC滤波器的具体方法,需要根据具体的需求和平台来确定。一般来说,可以使用MATLAB进行CIC滤波器设计和验证,然后将设计好的滤波器转换为FPGA可实现的代码。具体的实现方法可以参考相关的FPGA开发工具和文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值