FIR滤波器设计

滤波器原理:滤波器就是对特定的频率或者特定频率以外的频率进行消除的电路,被广泛用于通信系统和信号处理系统中。从功能角度,数字滤波器对输入离散信号的数字代码进行运算处理,以达到滤除频带外信号的目的。

有限冲激响应(FIR)滤波器就是一种常用的数字滤波器,采用对已输入样值的加权和来形成它的输出。其系统函数为:

其中表示延时一个时钟周期,表示延时两个周期。

对于输入序列X[n]的FIR滤波器可用下图所示结构示意图来表示,其中X[n]是输入数据流。各级的输入连接和输出连接称为抽头,系数被称为抽头系数。一个M阶的FIR滤波器将会有M+1个抽头。通过移位寄存器用每个时钟边沿n(时见下标)处的数据流采样值乘以抽头系数,并将它们加起来形成输出。

其verilog HDL设计代码为:

//FIR滤波器设计的verilog HDL程序  module FIR(Data_out, Data_in, clock, reset);  output[9:0] Data_out;  input[3:0] Data_in;  input clock, reset;  wire[9:0] Data_out;  wire[3:0] samples_0,samples_1,samples_2,samples_3,  samples_4,samples_5,samples_6,samples_7,samples_8;  //例化模块  shift_register U1(.Data_in(Data_in), .clock(clock), .reset(reset),  .samples_0(samples_0),.samples_1(samples_1),  .samples_2(samples_2),.samples_3(samples_3),  .samples_4(samples_4),.samples_5(samples_5),  .samples_6(samples_6),.samples_7(samples_7),  .samples_8(samples_8));  caculator U2(.samples_0(samples_0),.samples_1(samples_1),  .samples_2(samples_2),.samples_3(samples_3),  .samples_4(samples_4),.samples_5(samples_5),  .samples_6(samples_6),.samples_7(samples_7),  .samples_8(samples_8), .Data_out(Data_out));  endmodule  //移位寄存器模块  //移位寄存器用于存储输入的数据流,本例中主要负责存储8个4位宽输入数据信号,作为Caculator模块的输入。  module shift_register(Data_in, clock, reset, samples_0, samples_1, samples_2, samples_3,  samples_4, samples_5, samples_6, samples_7, samples_8);  input[3:0] Data_in;  input clock, reset;  output[3:0] samples_0, samples_1, samples_2, samples_3,  samples_4, samples_5, samples_6, samples_7, samples_8;  reg[3:0] samples_0, samples_1, samples_2, samples_3,  samples_4, samples_5, samples_6, samples_7, samples_8;  always@(posedge clock or posedge reset)  begin  if(reset)  begin  samples_0 <= 4'b0;  samples_1 <= 4'b0;  samples_2 <= 4'b0;  samples_3 <= 4'b0;  samples_4 <= 4'b0;  samples_5 <= 4'b0;  samples_6 <= 4'b0;  samples_7 <= 4'b0;  samples_8 <= 4'b0;  end  else  begin  samples_0 <= Data_in;  samples_1 <= samples_0;  samples_2 <= samples_1;  samples_3 <= samples_2;  samples_4 <= samples_3;  samples_5 <= samples_4;  samples_6 <= samples_5;  samples_7 <= samples_6;  samples_8 <= samples_7;  end  end  endmodule  //计算模块  //Caculator模块用于进行8输入信号与抽头系数的乘法和累加,并产生滤波之后输出信号Data_out。应该指出  //的是,FIR滤波器系数具有对称性,在本例中b0 = b8, b1 = b7, b2 = b6, b3 = b5,因此,可以通过先  //将输入信号相加再与抽头系数相乘的方式,减少乘法器电路的数量和芯片面积  module caculator(samples_0, samples_1, samples_2, samples_3,samples_4,  samples_5, samples_6, samples_7, samples_8, Data_out);  input[3:0] samples_0, samples_1, samples_2, samples_3,  samples_4, samples_5, samples_6, samples_7, samples_8;  output[9:0] Data_out;  wire[9:0] Data_out;  wire[3:0] out_tmp_1, out_tmp_2, out_tmp_3, out_tmp_4;  wire[7:0] out1, out2, out3, out4, out5;  parameter b0 = 4'b0010;  parameter b1 = 4'b0011;  parameter b2 = 4'b0110;  parameter b3 = 4'b1010;  parameter b4 = 4'b1100;  wallace U1(.x(b0), .y(out_tmp_1), .out(out1));  mul_addtree U2(.mul_a(b1), .mul_b(out_tmp_2), .mul_out(out2));  mul_addtree U3(.mul_a(b2), .mul_b(out_tmp_3), .mul_out(out3));  mul_addtree U4(.mul_a(b3), .mul_b(out_tmp_4), .mul_out(out4));  mul_addtree U5(.mul_a(b4), .mul_b(samples_4), .mul_out(out5));  assign out_tmp_1 = samples_0 + samples_8;  assign out_tmp_2 = samples_1 + samples_7;  assign out_tmp_3 = samples_2 + samples_6;  assign out_tmp_4 = samples_3 + samples_5;  assign Data_out = out1 + out2 +out3 +out4 +out5;  endmodule  module mul_addtree(mul_a, mul_b, mul_out);  input[3:0] mul_a, mul_b;  output[7:0] mul_out;  wire[7:0] mul_out;  wire[7:0] stored0, stored1, stored2, stored3;  wire[7:0] add01, add23;  assign stored3 = mul_b[3]?{1'b0, mul_a, 3'b0}:8'b0;  assign stored2 = mul_b[2]?{2'b0, mul_a, 2'b0}:8'b0;  assign stored1 = mul_b[1]?{3'b0, mul_a, 1'b0}:8'b0;  assign stored0 = mul_b[0]?{4'b0, mul_a}:8'b0;  assign add01 = stored1 + stored0;  assign add23 = stored3 + stored2;  assign mul_out = add01 +add23;  endmodule  module wallace(x,y,out);  parameter size = 4; //定义参数,乘法器的位数  input [size - 1 : 0] x,y; //输入y是乘数,x是被乘数  output [2*size - 1 : 0] out;  wire [size*size - 1 : 0] a; //a为部分积  wire [1 : 0] b0, b1; //第一级的输出,包含进位  wire [1 : 0] c0, c1, c2, c3; //第二级的输出,包含进位  wire [5 : 0] add_a, add_b; //第三极的输入  wire [6 : 0] add_out; //第三极的输出  wire [2*size - 1 : 0] out; //乘法器的输出(组合逻辑)  assign a = {x[3],x[2],x[3],x[1],x[2],x[3],x[0],x[1],  x[2],x[3],x[0],x[1],x[2],x[0],x[1],x[0]}  &{y[3],y[3],y[2],y[3],y[2],y[1],y[3],y[2]  ,y[1],y[0],y[2],y[1],y[0],y[1],y[0],y[0]}; //部分积  hadd U1(.x(a[8]), .y(a[9]), .out(b0));  //2输入半加器(第一级)  hadd U2(.x(a[11]), .y(a[12]), .out(b1));//第一级  hadd U3(.x(a[4]), .y(a[5]), .out(c0)); //第二级  fadd U4(.x(a[6]), .y(a[7]), .z(b0[0]), .out(c1)); //3输入全加器(第二级)  fadd U5(.x(b1[0]), .y(a[10]), .z(b0[1]), .out(c2));  fadd U6(.x(a[13]), .y(a[14]), .z(b1[1]), .out(c3));  assign add_a = {c3[1],c2[1],c1[1],c0[1],c0[0],a[2]}; //加法器(第三极)  assign add_b = {a[15],c3[0],c2[0],c1[0],a[3],a[1]};  assign add_out = add_a + add_b;  assign out = {add_out,a[0]};  endmodule  //全加器模块  module fadd(x, y, z, out);  input x, y, z;  output [1 : 0] out;  assign out = x + y + z;   endmodule  //半加器模块  module hadd(x, y, out);  input x, y;  output [1 : 0] out;  assign out = x + y;  endmodule  

测试代码为:

 //测试文件  `timescale 1ns/1ns;  module FIR_tb;  reg clock, reset;  reg[3:0] Data_in;  wire[9:0] Data_out;  FIR U1(.Data_out(Data_out), .Data_in(Data_in), .clock(clock), .reset(reset));  initial  begin  Data_in = 0;  clock = 0;  reset = 1;  #10 reset =0;  end  always  begin  #5 clock <= ~clock;  #5 Data_in <= Data_in + 1;  end  endmodule  

在Modelsim中仿真所得波形如下:

放大截图为:

下面进行MATLAB生成滤波器的实验:

MATLAB生成30阶低通1MHz海明窗函数设计步骤:

(1)在MATLAB命令窗口中输入“fdatool”出现如下对话框:

(2)设定为低通滤波器。

(3)选择FIR滤波器的设计类型为窗函数。

设置FIR滤波器为30阶滤波器,选择窗函数的类型为海明窗函数,海明窗函数可以得到旁瓣更小的效果,能量更加集中在主瓣中,主瓣的能量约占99.963%,第一旁瓣的峰值比主瓣小40dB,但主瓣宽度与海明窗相同。它定义为:

(4)输入抽样频率和截止频率,分别是16MHz和1MHz。

(5)点击Design Filter 得到结果,如下图:

(6)量化输入输出,点击工作栏左边的量化选项,即“set quantization parameters”选项,选择定点,设置输入字长为8,其他选择默认,如下图示:

设置完成后,点击Targets中Generate HDL,选择生成Verilog 代码,设置路径,MATLAB即可生成设计好的滤波器Verilog HDL 代码以及测试文件,仿真结果如下图:

如上图所示,当输入为线性,或者输入频率较低时,输出幅度不会被抑制,当输入频率较高,输出幅度会受到大幅度抑制,而当输入为白噪声或者混频信号时,滤波器会过滤掉高频信号。

FIR滤波器设计(包括Verilog HDL设计以及MATLAB设计)相关推荐

  1. (100)Verilog HDL:UART波特率设计

    (100)Verilog HDL:UART波特率设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:UART波特率设计 5)结语 1.2 FPG ...

  2. (99)Verilog HDL:呼吸灯设计

    (99)Verilog HDL:呼吸灯设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:呼吸灯设计 5)结语 1.2 FPGA简介 FPGA( ...

  3. (98)Verilog HDL:流水灯设计

    (98)Verilog HDL:流水灯设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:流水灯设计 5)结语 1.2 FPGA简介 FPGA( ...

  4. (97)Verilog HDL:秒灯设计

    (97)Verilog HDL:秒灯设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:秒灯设计 5)结语 1.2 FPGA简介 FPGA(Fi ...

  5. (87)Verilog HDL:七分频设计

    (87)Verilog HDL:七分频设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:七分频设计 5)结语 1.2 FPGA简介 FPGA( ...

  6. (86)Verilog HDL:三分频设计

    (86)Verilog HDL:三分频设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:三分频设计 5)结语 1.2 FPGA简介 FPGA( ...

  7. (55)Verilog HDL双沿采样设计

    (55)Verilog HDL双沿采样设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL双沿采样设计 5)结语 1.2 FPGA简介 FPGA( ...

  8. (42)Verilog HDL 打两拍设计

    (42)Verilog HDL 打两拍设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL 打两拍设计 5)结语 1.2 FPGA简介 FPGA( ...

  9. matlab 模拟滤波器设计与实现,转一个讲matlab设计模拟滤波器的文章2(转)

    图5-9 椭圆模拟原型滤波器平方幅频图 程序运行结果见图5-9.可见阶数为4的椭圆滤波器的过渡带已相当窄(陡),但这种特性的获得是以牺牲通带和阻带的单调平滑特性为代价的.可以看到滤波器的阶数越高平方幅 ...

最新文章

  1. Android ShareSDK桥接技术
  2. python输入函数格式_python如何提取.c文件中的指定函数的输入参数
  3. VTK:IO之FindAllArrayNames
  4. 关于MySQL使用Float存储时的精度问题
  5. LeetCode 505. 迷宫 II(BFS / Dijkstra 最短路径)
  6. python模块分类_Python-模块分类及导入
  7. bzoj2101【Usaco2010 Dec】Treasure Chest 藏宝箱
  8. Redis五大基本数据类型及其相关命令及常用用途
  9. 从博客复制程序到VS里面出现span style=font-size:24px;strong
  10. Android:解决Failed to load D:\Android-Studio\sdk\build-tools\xx.xx.xx\lib\dx.jar
  11. 如何在Ubuntu 13.04, 13.10上安装Sublime Text 3
  12. 离职10天,面了4家公司,我的感受...
  13. 数据同步工具--Canal
  14. 浅析API网关——Ocelot[网关]+Consul[服务发现负载均衡]+Polly[服务熔断]+Ids4[服务认证]
  15. 竞品分析 | 百词斩竞品分析报告
  16. android 通话录音
  17. guzzle php,windows系统下安装使用guzzle
  18. (经验贴)如何在Word里实现手写签名
  19. 12星座经典情爱语录
  20. 微信小程序实现下拉刷新功能

热门文章

  1. jndi weblogic mysql_Tomcat配置JNDI数据源连接池
  2. 帧率配置_《骑马与砍杀2》配置探究:CPU显卡怎么搭配达到理想画质和帧数?...
  3. java十进制小数转化为二进制小数代码 乘二取整法_(四)改掉这些坏习惯,还怕写不出健壮的代码?...
  4. 一个简单的Apriltag,数字,动物水果分类器
  5. 近朱者赤,近墨者还是赤
  6. 2021年春季学期-信号与系统-第十三次作业参考答案-第十小题
  7. 两轴机械臂+机械爪整体控制板设计与机械爪控制调试
  8. 使用PYTHON操作Excel的工具
  9. MathType的公式Latex到Katex转换程序
  10. unitoy机器人怎么联网_机器人操作说明