FPGA实现CIC滤波器

这篇具有很好参考价值的文章主要介绍了FPGA实现CIC滤波器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FPGA实现CIC滤波器

上一节MATLAB CIC滤波器_小小低头哥的博客-CSDN博客介绍了如何使用MATLAB仿真不同要求的CIC滤波器,并对结果进行了分析。这次使用FPGA分别实现单级、多级CIC滤波器。

  单级CIC滤波器的实现非常简单。根据
y ( n ) = ∑ k = 0 M − 1 x ( n − k ) = x ( n ) − x ( n − M ) + ∑ k = 0 M − 1 x ( n − 1 − k ) = [ x ( n ) − x ( n − M ) ] + y ( n − 1 ) (1) y(n)=\sum_{k=0}^{M-1}x(n-k)=x(n)-x(n-M)+\sum_{k=0}^{M-1}x(n-1-k)=[x(n)-x(n-M)]+y(n-1)\tag{1} y(n)=k=0M1x(nk)=x(n)x(nM)+k=0M1x(n1k)=[x(n)x(nM)]+y(n1)(1)
可实现此单级滤波器。由于滤波器系数为0或者1,因此再滤波器结构中只需要加、减法及寄存器即可,从而可以使滤波器工作在极高的系统频率中。

1 单级CIC滤波器的FPGA设计

  采用FPGA设计抽取倍数为5的抽取系统,采用5阶CIC滤波器作为抗混叠滤波器,并对抽取系统进行仿真测试。仿真频谱为1KHZ的正弦波信号,抽样频率为200KHZ,采用位数为10比特数据作为测试激励源,用MATLAB分析结果。

MATLAB信号产生函数和Modelsim仿真函数在前几节中给出了,此处直接给出FPGA代码

module SigCIC(
    input   rst,    //复位信号
    input   clk,    //FPGA系统时钟,频率为200KHZ
    input   signed[9:0] din,    //输入数据频率为200KHZ
    
    output  reg r_flag, //输出数据有效指示信号
    output  reg signed[12:0] dout   //滤波后的输出数据,5倍抽取后,频率为40KHZ
);
reg [2:0]count; //计数器
reg [3:0] i;
//x(n)-x(n-M)(M=5)分别对应din-din_reg[0]-din_reg[4]
reg  signed[ 9:0] din_reg[4:0]; //寄存器
reg  signed[12:0] dout_CIC;  //CIC滤波器的每个输入数据对应的输出数据
//CIC滤波器过程
always @(posedge clk or posedge rst)
    if(rst) begin
        for(i=0;i<5;i=i+1) begin
            din_reg[i] <= 10'd0;   //初始化寄存器
        end
        dout_CIC <= 13'd0;  //初始化输出
    end
    else begin
        for(i=0;i<4;i=i+1) begin
            din_reg[i+1] <= din_reg[i];  //将数据后移
        end        
        din_reg[0] <= din;
        dout_CIC <= dout_CIC + din - din_reg[4];//y(n) = y(n-1) + x(n)-x(n-M);
    end
//抽取过程
always @(posedge clk or posedge rst)
    if(rst) begin
        count <= 3'd0;
        dout <= 13'd0;
    end
    else if(count==3'd4) begin //每隔5次抽取一次 
       count <= 3'd0;
       dout <= dout_CIC;
       r_flag <= 1'd1;
    end
    else begin
       count <= count + 1'd1;
       r_flag <= 1'd0;
    end
 endmodule

1.1 结果展示及分析

cic滤波器,数字滤波器的MATLAB与FPGA实现,fpga开发,matlab

Modelsim中的波形不够直观,接下来展示MATLAB中的展示的图形

cic滤波器,数字滤波器的MATLAB与FPGA实现,fpga开发,matlab

cic滤波器,数字滤波器的MATLAB与FPGA实现,fpga开发,matlab

cic滤波器,数字滤波器的MATLAB与FPGA实现,fpga开发,matlab

由图不难发现仿真滤波后的信号频率为1KHZ,信号波形没有变化,但滤波后的数据速率降低为原来的1/5,仿真结果与期望结果一致。

2.多级CIC滤波器的FPGA实现

2.1 Noble恒等式

  对于多级系统,包括线性系统、内插滤波器和抽取滤波器,可以在处理信号的流程中重新排列这3个部分的处理顺序,以便系统能够以更简便的方式实现。这就是所谓的Noble恒等式。

  具体到多速率信号处理系统,如果线性系统F(zM)后面紧跟着M倍抽取滤波器,则式
F ( Z M ) ( ↓ M ) = ( ↓ M ) F ( Z ) (2) F(Z^M)(↓M)=(↓M)F(Z) \tag{2} F(ZM)(M)=(M)F(Z)(2)
  这表明调换线性系统的抽取系统的处理顺序,及首先进行抽取,然后进行线性滤波,这样就可以将线性滤波器的长度降低到1/M,即滤波器的抽头数为原来的1/M。如果在线性系统F(ZL)前有L倍内插滤波器,则有式(3)成立。
( ↑ L ) F ( Z L ) = F ( Z ) ( ↑ L ) (3) (↑L)F(Z^L)=F(Z)(↑L)\tag{3} (L)F(ZL)=F(Z)(L)(3)
也就是说,在内插时将线性系统放置在内插滤波器之前,就可以得到阶数降低为1/L的滤波器。

2.2 Hogenauer滤波器

  根据CIC滤波器的原理,CIC滤波器可分为无反馈结构的FIR滤波器结构及有反馈结构的IIR滤波器。如果要用Noble恒等式原理改变多级CIC滤波器的结构,则需要采用有反馈结构的IIR滤波器。N级CIC滤波器的系统函数可表示为:

H ( z ) = ( 1 − z − M 1 − z − 1 ) N (4) H(z)=(\frac{1-z^{-M}}{1-z^{-1}})^N\tag{4} H(z)=(1z11zM)N(4)
根据式(4)可直接画出多级CIC滤波器的结构(以3级抽取滤波器为例),如图5(a)所示。根据易位定理,可以将图5(a)中的结构进行重新排列,得到图5(b)所示的结构。再根据Noble恒等式,改变抽取滤波器的位置,即可得到占用资源最少的多级CIC滤波器,如图5(c)所示,这种结构的滤波器被称为Hogenauer滤波器。按照同样的处理方法,可以得到多级Hogenauer滤波器内插滤波器,如图5(d)所示。

cic滤波器,数字滤波器的MATLAB与FPGA实现,fpga开发,matlab

图5 不同结构的多级CIC滤波器

2.3多级CIC滤波器的FPGA设计

  在FPGA上设计抽取倍数为5的抽取系统,采用5阶3级CIC滤波器作为抗混叠滤波器,并对抽取系统进行仿真测试,系统输入数据的位数为10比特,系统时钟与数据的频率相同。

  仍然先用MATLAB产生200KHZ抽样的测试信号,给FPGA仿真使用。MATLAB以及FPGA仿真文件前面章节给出过,这里仍然只给出FPGA代码及仿真结果。

//顶层模块
module MultCIC(
    input   rst,
    input   clk,
    input   [ 9:0] Xin,
    
    output  [16:0] Yout,//滤波后的数据
    output  rdy
);

wire r_flag;
wire signed[16:0] Intout;
wire signed[16:0] dout;
//实例化积分器模块
Integrated u_Integrated(
    .rst(rst),
    .clk(clk),
    .Xin(Xin),
    .Intout(Intout)
);
//实例化抽取模块
Decimata u_Decimata(

    .rst   (rst),
    .clk   (clk),
    .lin   (Intout),   //输入数据频率
    .dout  (dout),  //滤波后数据
    .r_flag(r_flag)         //数据有效指示信号
);
//实例化梳状模块
Comb u_Comb(
    .rst    (rst),       //复位信号
    .clk    (clk),    
    .r_flag (r_flag),       //输入数据准备好信号
    .Xin    (dout),      //输入数据
    .Yout   (Yout)       //滤波后输出数据
);

assign rdy = r_flag;

endmodule
//积分模块
module Integrated(
    input   clk,
    input   rst,
    
    input   signed[ 9:0] Xin,    //数据输入频率位2KHZ
    output  signed[16:0] Intout  //滤波后的输出数据 
);

wire signed[36:0] D1,D2,D3;  //分别对应三个累加器的输出y1(n),y2(n),y3(n)
reg  signed[36:0] d1,d2,d3;  //寄存器 存储内容分别为三个累加器输出的延迟y1(n-1),y2(n-1),y3(n-1)

always @(posedge clk or posedge rst)
    if(rst) begin   //初始化
        d1 <= 37'd0;
        d2 <= 37'd0;
        d3 <= 37'd0;
    end
    else begin
        d1 <= D1;
        d2 <= D2;
        d3 <= D3;
    end

assign D1 = (rst?37'd0:{{27{Xin[9]}},Xin} + d1);
assign D2 = (rst?37'd0:D1 + d2);
assign D3 = (rst?37'd0:D2 + d3);

assign Intout = D3[16:0];

endmodule
//抽取模块
module Decimata(

    input   rst,
    input   clk,
    input   signed[16:0] lin,   //输入数据频率
    
    output  reg signed[16:0] dout,  //滤波后数据
    output  reg r_flag          //数据有效指示信号
);

reg [2:0] count;    //计数器
always @(posedge clk or posedge rst)
    if(rst) begin
        count <= 3'd0;
        r_flag <= 1'd0;
        dout <= 17'd0;
    end
    else if(count == 3'd4) begin
        count <= 3'd0;
        r_flag <= 1'd1;
        dout <= lin;
    end
    else begin
        count <= count + 1'd1;
        r_flag <= 1'd0;
        dout <= dout;
    end
    
endmodule
//梳状模块
module Comb(
    input   rst     ,       //复位信号
    input   clk     ,    
    input   r_flag  ,       //输入数据准备好信号
    input   signed[16:0] Xin,//输入数据
    
    output  signed[16:0] Yout//滤波后输出数据
);

wire signed[16:0] C1,C2;    //每个累加器的输出
reg  signed[16:0] c1,c2,c3,c4; //输入数据以及每个累计器输入的延迟

always @(posedge clk or posedge rst)
    if(rst) begin
        c1 <= 17'd0;
        c2 <= 17'd0;
        c3 <= 17'd0;
        c4 <= 17'd0;
    end
    else if(r_flag) begin
        c1 <= Xin;
        c2 <= c1 ; 
        c3 <= C1 ;
        c4 <= C2 ; 
    end
    else begin
        c1 <= c1 ;
        c2 <= c2 ; 
        c3 <= c3 ; 
    end
    
assign C1 = (rst?17'd0:(c1-c2));
assign C2 = (rst?17'd0:(C1-c3)); 
assign Yout = (rst?17'd0:(C2-c4)); 

endmodule   

2.4 仿真结果及分析

cic滤波器,数字滤波器的MATLAB与FPGA实现,fpga开发,matlab

上图为Modelsim仿真结果,可以初步判断输出信号还不错。不过Modelsim观察不明白,用MATLAB读取此数据再观察

cic滤波器,数字滤波器的MATLAB与FPGA实现,fpga开发,matlab

由上图不难发现,仿真前的1KHZ及30KHZ正弦波合成信号,经抽取滤波后,形成了的单一的1KHZ正弦波,切滤波后的数据速率降低为原来的1/5,仿真结果与期望结果相同。

其实还有关于如何确定FPGA中中间级输出变量的字长问题,不过我目前没搞懂,就暂且不提了。文章来源地址https://www.toymoban.com/news/detail-758487.html

到了这里,关于FPGA实现CIC滤波器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字信号处理-10-并行FIR滤波器MATLAB与FPGA实现

    本文介绍了设计滤波器的FPGA实现步骤,并结合杜勇老师的书籍中的并行FIR滤波器部分进行一步步实现硬件设计,对书中的架构做了复现以及解读,并进行了仿真验证。 FIR滤波器的结构形式时,介绍了直接型、级联型、频率取样型和快速卷积型4种。在FPGA实现时,最常用的是最

    2023年04月09日
    浏览(49)
  • FIR内插滤波器的FPGA实现(一)-matlab实现

    FIR内插滤波器是一种基本的插值方法,主要有两个步骤: 1)在输入的每一个初始采样中间插入L个零点; 2)插零后的数据经过低通滤波器。 运行结果如图(时域、频域): 我们的目标是把采样频率提升五十倍。 得到的频域图: 可以看出内插零点在频域会实现频谱扩展,因此

    2024年02月03日
    浏览(57)
  • FPGA 的数字信号处理:Verilog 实现简单的 FIR 滤波器

    该项目介绍了如何使用 Verilog 实现具有预生成系数的简单 FIR 滤波器。 不起眼的 FIR 滤波器是 FPGA 数字信号处理中最基本的模块之一,因此了解如何将具有给定抽头数及其相应系数值的基本模块组合在一起非常重要。因此,在这个关于 FPGA 上 DSP 基础实用入门的教程中,将从一

    2024年02月09日
    浏览(50)
  • 数字信号处理翻转课堂笔记17——窗函数法设计FIR滤波器及matlab实现

    对应教材:《数字信号处理(第五版)》西安电子科技大学出版社,丁玉美、高西全著 (1)窗函数法设计FIR线性相位滤波器的原理; (2)加窗效应:加窗对滤波器特性的影响(难点); (3)典型窗函数及其主要特性和参数(重点); (4)窗函数法设计FIR滤波器的步骤(

    2024年01月16日
    浏览(53)
  • 基于FPGA的FIR低通滤波器实现(附工程源码),matlab+vivado19.2+simulation

    本文为FPGA实现FIR滤波器仿真过程,附源代码。 提示:以下是本篇文章正文内容,下面案例可供参考 打开MATLAB在命令行窗口输入: fadtool 回车后在滤波器设计界面设置滤波器参数如下 之后点击如图标志,设置定点,在菜单栏\\\"目标(R)\\\"出选择生成对应滤波器系数.COE文件 mat

    2024年02月11日
    浏览(48)
  • MATLAB——IIR数字滤波器的设计

    1.基础知识 1.1、数字滤波器设计的基本步骤 我们知道模拟滤波器的设计是数字滤波器的设计的基础。在学习数字信号处理的过程中,IIR数字滤波器的设计的步骤是 (1)确定采样间隔Ts或者采样频率fs。 (2)根据模拟频率和数字频率之间的关系,将所给出的数字滤波器的指标

    2023年04月23日
    浏览(33)
  • 信号处理之FIR数字滤波器(Matlab仿真)

            数字滤波器的作用是滤除不感兴趣的信号,留下想要的信号。数字滤波器可分为无限脉冲响应(IIR)数字滤波器、有限脉冲响应(FIR)数字滤波器两种,两者各有优缺点,其中FIR数字滤波器因其具有良好的线性相位特性受到广泛应用,线性相位是指信号中各频率成分的相对

    2024年02月03日
    浏览(52)
  • 数字图像处理之matlab实验(三):空间滤波器

    空间滤波,就是在原图像上,用一个固定尺寸的模板去做卷积运算,得到的新图像就是滤波结果。滤波,就是过滤某种信号的意思。过滤哪种信号取决于模板设计,如果是锐化模板,处理后就保留高频信号,如果是平滑模板,处理后就保留低频信号。 (1)模板运算 图像处理

    2024年04月28日
    浏览(51)
  • 基于FPGA的FIR数字滤波器设计(quartus和vivado程序都有)。

    基于FPGA的FIR数字滤波器设计(quartus和vivado程序都有)。 附: 1.配套quartus从MATLAB系数生成直到仿真成功说明文档。 2.配套仿真出波形(图1)的视频。      

    2024年02月10日
    浏览(49)
  • 基于FPGA的FIR滤波器的实现(5)— 并行结构FIR滤波器的FPGA代码实现

    并行结构,并行实现滤波器的累加运算,即并行将具有对称系数的输入数据进行相加,而后采用多个乘法器并行实现系数与数据的乘法运算,最后将所有乘积结果相加输出。这种结构具有最高的运行速度,因不需要累加运算,因此系数时钟频率可以与数据输出时钟频率保持一

    2024年02月03日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包