当前位置:   article > 正文

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/698664
推荐阅读
相关标签
  

闽ICP备14008679号