• m基于FPGA和MATLAB的数字CIC滤波器设计和实现


    目录

    1.算法概述

    2.仿真效果预览

    3.MATLAB/FPGA部分代码预览

    4.完整MATLAB/FPGA程序


    1.算法概述

          CIC滤波器由一对或多对积分-梳状滤波器组成,在抽取CIC中,输入信号依次经过积分,降采样,以及与积分环节数目相同的梳状滤波器。在内插CIC中,输入信号依次经过梳状滤波器,升采样,以及与梳状数目相同的积分环节。CIC滤波器是一种基于零极点相抵消的FIR滤波器。N级CIC抽取滤波器的基本结构框图如图1所示。

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

    系统分为如下三个模块。

           

    模块一的设计:

    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//输出信号

                  );

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

    2.仿真效果预览

    QUARTUS12.1

    matlab2022a仿真

    3.MATLAB/FPGA部分代码预览

    1. .......................................
    2. b4=conv(b3,b3);
    3. a4=conv(a3,a3);
    4. b5=conv(b4,b3);
    5. a5=conv(a4,a3);
    6. b6=conv(b4,b4);
    7. a6=conv(a4,a4);
    8. b7=conv(b6,b3);
    9. a7=conv(a6,a3);
    10. figure(1);
    11. freqz(b7/D^5,a7,'whole');
    12. %CIC抽取滤波器
    13. % 抽取因子
    14. r = 2;
    15. hm = mfilt.cicdecim(r);
    16. %原始的采样率 44.1kHz.
    17. fs = 44.1e3;
    18. %10240个采样点
    19. n = 0:10239;
    20. %原始信号
    21. x = sin(2*pi*1e3/fs*n);
    22. %得到抽取后的5120个采样点
    23. y_fi = filter(hm,x);
    24. x = double(x);
    25. y = double(y_fi);
    26. y = y/max(abs(y));
    27. figure(2);
    28. stem(n(1:44)/fs,x(2:45)); hold on;
    29. stem(n(1:22)/(fs/r),y(3:24),'r','filled');
    30. xlabel('时间(sec)');ylabel('信号值');
    31. title('CIC抽取滤波器');
    32. %CIC内插滤波器
    33. %插值因子
    34. R = 2;
    35. hm = mfilt.cicinterp(R);
    36. % 原始采样频率:22.05 kHz.
    37. fs = 22.05e3;
    38. % 5120个采样点
    39. n = 0:5119;
    40. %原始信号
    41. x = sin(2*pi*1e3/fs*n);
    42. y_fi = filter(hm,x);
    43. x = double(x);
    44. y = double(y_fi);
    45. y = y/max(abs(y));
    46. figure(3);
    47. stem(n(1:22)/fs,x(1:22),'filled'); hold on;
    48. stem(n(1:44)/(fs*R),y(4:47),'r');
    49. xlabel('时间(sec)');ylabel('信号值');
    50. 01-23M
    1. module down(
    2. i_clk,//输入时钟
    3. i_rst,//输入复位信号
    4. i_M, //抽取值
    5. i_data,//输入信号
    6. o_data,//输出信号
    7. r_clk
    8. );
    9. input i_clk;//输入时钟
    10. input i_rst;//输入复位信号
    11. input [7:0] i_M; //抽取值
    12. input signed[31:0] i_data;//输入信号
    13. output signed[31:0]o_data;//输出信号
    14. output r_clk;//输出信号
    15. reg [7:0] r_cnt =8'd0;
    16. reg signed[31:0]o_data=32'd0;
    17. reg r_clk =1'b0;
    18. always @(posedge i_clk)
    19. begin
    20. if(!i_rst)//系统复位
    21. begin
    22. r_cnt<=8'd0;
    23. r_clk<=1'b0;
    24. end
    25. else begin
    26. if(r_cnt==i_M/2-1)//分频
    27. begin
    28. r_clk<=~r_clk;
    29. r_cnt<=8'd0;
    30. end
    31. else begin
    32. r_cnt<=r_cnt+1'b1;
    33. r_clk<=r_clk;
    34. end
    35. end
    36. end
    37. always @(posedge r_clk)
    38. begin
    39. if(!i_rst)//系统复位
    40. begin
    41. o_data<=32'd0;
    42. end
    43. else begin
    44. o_data<=i_data;//抽取
    45. end
    46. end
    47. endmodule

    4.完整MATLAB/FPGA程序

    matlab源码说明_我爱C编程的博客-CSDN博客

    V

  • 相关阅读:
    IT6664: 1-to-4 HDMI 2.0/MHL Dual in Active Splitter with EDID RAM
    Matlab图像特征提取的数学原理及实现
    JavaScript 67 JavaScript HTML DOM 67.13 JavaScript HTML DOM 集合
    用户的权限
    Windows编译yolov5_obb的nms_rotated模块报错解决
    以全新的视角审视重构——世界软件大师“鲍勃大叔”作序推荐
    知识增强的大语言模型
    小约翰可汗视频随记
    航空发动机小风扇
    深度干货!一篇Paper带您读懂HTAP | StoneDB学术分享会第①期
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/127936710