0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA的IIR数字滤波器设计

FPGA之家 来源: FPGA开源工作室 2023-09-07 09:51 次阅读

IIR(Infinite Impulse Response)无线脉冲响应滤波器

系统传递函数为:

3cd08684-4d0f-11ee-a25d-92fbcf53809c.png

系统的差分方程可写为:

3ce7a346-4d0f-11ee-a25d-92fbcf53809c.png

IIR优缺点:
1)在相同的幅频条件下,滤波器阶数比FIR滤波器低。
2)IIR滤波器占用的硬件资源比较少(相比FIR滤波器)。
3)不具备严格的线性相位特性。

1 IIR数字滤波器的基本结构及类型

3cf4afaa-4d0f-11ee-a25d-92fbcf53809c.png

图1 直接I型

3d069896-4d0f-11ee-a25d-92fbcf53809c.png

图2 直接II型

3d279e9c-4d0f-11ee-a25d-92fbcf53809c.png

图3 级联型

3d344886-4d0f-11ee-a25d-92fbcf53809c.png

图4 并联型

2 设计目标

采用matlab buffer函数设计一个IIR滤波器低通滤波器,通带截止频率为1khz,输入信号为1khz+3khz sin波形,经过IIR滤波器后输出为1KHZ sin波,其他不做要求。(本文只对IIR设计思想进行验证不做性能要求)。

3 matlab的设计验证

Matlab源码:

%参数定义

FS =44100; %Sample rate Frequncy
fc = 1000; %1khz
fe = 3000; %外部输入信号  3khz
N = 1024;
Q =16;

%波形产生

sin_osc =sin(t*fc);
sin_e =sin(t*fe);
sin_add = sin_osc+sin_e;

%IIR 滤波器系数(低通滤波器)

[b a] = butter(3,fc/(FS/2),'low');
 
%滤波(混频后)
y = filter(b,a,sin_add);
 
f_osc =fft(sin_osc,N);
f_osc=20*log(abs(f_osc))/log(10);        %换算成dBW单位
ft=[0:(FS/N):FS/2];              %转换横坐标以Hz为单位
f_osc=f_osc(1:length(ft));

%滤波器系数量化

Mab =max(max(abs(a),abs(b)));
%16bit 量化
Qb = round((b/Mab)*(2^(Q-1)-1));
Qa = round((a/Mab)*(2^(Q-1)-1));
%%%%
Qm =floor(log2(Mab/a(1)));
if Qm

%绘图
%时域波形图

figure(1),
hold on
subplot(221),plot(t(1:128),sin_osc(1:128),'-');
legend('sin 1khz');title('sin 1khz');
subplot(222),plot(t(1:128),sin_e(1:128),'-');
legend('sin 3khz');title('sin 3khz');
subplot(223),plot(t(1:128),sin_add(1:128),'-');
legend('sin 1khz add 3khz');title('sin 1khz add 3khz');
subplot(224),plot(t(1:128),y(1:128),'-');
legend('LPF 结果');title('LPF 结果');
grid;
hold off

%频域波形

figure(2),
hold on
subplot(221);plot(ft,f_osc);
xlabel('频率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8);
title('信号频谱图 2KHZ','fontsize',8);legend('sinosc');
subplot(222);plot(ft,f_e);
xlabel('频率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8);
title('信号频谱图3KHZ','fontsize',8);legend('sine');
subplot(223);plot(ft,f_add);
xlabel('频率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8);
title('信号频谱图2KHZ 和 3KHZ','fontsize',8);legend('sin add');
subplot(224);plot(ft,y_f);
xlabel('频率(Hz)','fontsize',8); ylabel('功率(dBW)','fontsize',8);
title('信号频谱图滤波后','fontsize',8);legend('LPF结果');
hold off

%幅频响应

figure(3);
subplot(211);stem(Fb);
title('Fb单位抽样响应','fontsize',8);
subplot(212);plot(f,mag);
xlabel('频率(Hz)','fontsize',8);
ylabel('幅度(dB)','fontsize',8);
title('freqz()幅频响应','fontsize',8);

3d4ef2d0-4d0f-11ee-a25d-92fbcf53809c.jpg

图5 matlab时域波形

如图5所示,(5,1)波形加(5,2)波形得到(5,3)波形,经过IIR滤波器后得到(5,4)时域波形。

3d81f5e0-4d0f-11ee-a25d-92fbcf53809c.jpg

图6 matlab频域分析

如图6所示,(6,3)与(6,4)相比3khz大概被削弱25DB左右。

3da0e02c-4d0f-11ee-a25d-92fbcf53809c.jpg
图7 IIR幅频响应分析

如图7所示,通过幅频响应(7,2)可知3khz所在位置大概被削弱25DB。

4 FPGA设计验证

FPGA IIR.v设计源码:

`timescale 1ps/1ps
module iir(
       input               mclk,//45.1584MHZ
   input               reset_n,
   input  signed[31:0] pcm_in,
   output signed[31:0] pcm_out
   );
   
localparam LAST_CYCLE = 1023;
reg [9:0] i;

wire signed [15:0] b1,b2,b3,b4;
wire signed [15:0] a2,a3,a4;

wire signed [31:0] xn;
reg signed [31:0] xn1,xn2,xn3;
reg signed [31:0] yn,yn1,yn2,yn3;
reg signed [47:0] r_x1;
reg signed [47:0] r_x2;
reg signed [47:0] r_y;
reg signed [47:0] r_s;
reg signed [47:0] r_s1;

//coffe b
assign b1 = 3;
assign b2 = 8;
assign b3 = 8;
assign b4 = 3;

//coffe a
assign a2 = -22243;
assign a3 = 20231;
assign a4 = -6159;

assign xn = pcm_in;
assign pcm_out = yn;


always @(posedge mclk or negedge reset_n) begin
  if(reset_n == 1'b0) begin
    i <= 0;
xn1 <= 0;
xn2 <= 0;
xn3 <= 0;

yn <=  0;
yn1 <= 0;
yn2 <= 0;
yn3 <= 0;

r_x1 <= 0;
r_x2 <= 0;
r_y  <= 0;
r_s  <= 0;
r_s1 <= 0;
  end
  else begin
    i<= i+1;
  if(i==1) begin
  r_x1 <= b1*(xn + xn3);
  r_x2 <= b2*(xn1 + xn2);//Zero(n)
  r_y  <= a2*yn1+a3*yn2+a4*yn3;//Pole(n)
  $display("r_x1 = %d,r_x2 = %d,r_y = %d",r_x1,r_x2,r_y);
end
if(i==2) begin
   r_s <= r_x1 +r_x2 - r_y;//8192y(n) = Zero(n)-Pole(n)
   $display("%d",r_s);
end
if(i==3) r_s1 <= (r_s>>13);
if(i==4) yn <= r_s1[31:0];
if(i==5) begin //pipeline
  xn1 <= xn;
  xn2 <= xn1;
  xn3 <= xn2;
  
  yn1 <= yn;
  yn2 <= yn1;
  yn3 <= yn2;
end
  end
end

Endmodule

实验结果:
Modelsim

3dac0358-4d0f-11ee-a25d-92fbcf53809c.jpg

图8 modelsim 时域波形

由图8可知,pcm_out1(1khz + 3khz)经过IIR滤波器后滤除了3khz,设计成功。
Matlab结果分析:
3de160d4-4d0f-11ee-a25d-92fbcf53809c.jpg

图9 FPGA输入波形matlab时域分析

3e0768c4-4d0f-11ee-a25d-92fbcf53809c.jpg

图10 FPGA结果数据分析

由图10的频域分析结果可知3khz大概被削弱25db左右,设计成功。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1625

    文章

    21648

    浏览量

    601473
  • matlab
    +关注

    关注

    182

    文章

    2960

    浏览量

    230084
  • 滤波器
    +关注

    关注

    160

    文章

    7716

    浏览量

    177560
  • 数字滤波器
    +关注

    关注

    4

    文章

    268

    浏览量

    46974
  • IIR
    IIR
    +关注

    关注

    1

    文章

    61

    浏览量

    22818

原文标题:基于FPGA IIR数字滤波器的设计

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于FPGA和MATLAB实现IIR数字滤波器的设计和仿真验证分析

    IIR数字滤波器在很多领域中都有着广阔的应用。与FIR数字滤波器相比,IIR数字滤波器可以用较低的阶数获得较高的选择性,而且所用存储单元少,
    发表于 07-23 17:05 2631次阅读
    基于<b class='flag-5'>FPGA</b>和MATLAB实现<b class='flag-5'>IIR</b><b class='flag-5'>数字滤波器</b>的设计和仿真验证分析

    IIR数字滤波器的Matlab和FPGA实现

    本帖最后由 eehome 于 2013-1-5 10:01 编辑 IIR数字滤波器的Matlab和FPGA实现
    发表于 08-20 22:16

    基于FPGAIIR数字滤波器的设计和实现方法介绍

    1.引言数字滤波器在通信、自动控制、雷达、军事、航空航天、医疗、家用电器等众多领域得到了广泛的应用。其中IIR数字滤波器和FIR数字滤波器是目前人们使用较多的两种。
    发表于 07-08 07:18

    基于FPGAIIR数字滤波器的快捷设计

    详细讨论了IIR数字滤波器从MATLAB设计到FPGA实现的整个过程,提出了用递推算法解决实现过程中一些关键问题的方法,并在modelsim上进行了仿真袁最终在以Xilinx公司的FPGA
    发表于 03-07 10:09 7次下载

    IIR数字滤波器的设计

    实验 IIR数字滤波器的设计 一、实验目的 1.掌握双线性变换法及脉冲相应不变法设计IIR数字滤波器的具体设计方法及其原理,熟悉用双线性变换法及脉冲响应不变法设计
    发表于 05-10 09:46 134次下载

    IIR数字滤波器设计-在FPGA上实现任意阶IIR数字滤波器

    IIR数字滤波器设计-在FPGA上实现任意阶IIR数字滤波器 摘 要:本文介绍了一种采用级联结构在FP
    发表于 01-16 09:45 2484次阅读
    <b class='flag-5'>IIR</b><b class='flag-5'>数字滤波器</b>设计-在<b class='flag-5'>FPGA</b>上实现任意阶<b class='flag-5'>IIR</b><b class='flag-5'>数字滤波器</b>

    FPGA设计的四阶IIR数字滤波器

    FPGA设计的四阶IIR数字滤波器 常用的数字滤波器有FIR数字滤波器IIR
    发表于 01-16 18:15 1336次阅读
    用<b class='flag-5'>FPGA</b>设计的四阶<b class='flag-5'>IIR</b><b class='flag-5'>数字滤波器</b>

    IIR数字滤波器设计

    介绍IIR数字滤波器设计的相关知识 有兴趣的下来看看
    发表于 12-25 10:39 11次下载

    基于LabVIEW平台的IIR数字滤波器设计

    基于LabVIEW平台的IIR数字滤波器设计
    发表于 01-20 16:27 43次下载

    IIR数字滤波器FPGA实现

    本文档内容介绍了基于IIR数字滤波器FPGA实现,供参考
    发表于 03-02 13:45 36次下载

    基于级联结构和VHDL语言的IIR数字滤波器FPGA上实现设计

    IIR数字滤波器在很多领域中有着广阔的应用。与FIR数字滤波器相比,它可以用较低的阶数获得高选择性,所用存储单元少,经济而效率高,在相同门级规模和相同时钟速度下可以提供更好的带外衰减特性。下面介绍一种在
    发表于 03-04 10:32 2029次阅读
    基于级联结构和VHDL语言的<b class='flag-5'>IIR</b><b class='flag-5'>数字滤波器</b>在<b class='flag-5'>FPGA</b>上实现设计

    如何使用FPGA实现IIR数字滤波器的设计

    数字滤波器在通信、自动控制、雷达、军事、航空航天、医疗、家用电器等众多领域得到了广泛的应用。其中IIR数字滤波器和FIR数字滤波器是目前人们使用较多的两种。
    发表于 08-06 18:50 3次下载
    如何使用<b class='flag-5'>FPGA</b>实现<b class='flag-5'>IIR</b><b class='flag-5'>数字滤波器</b>的设计

    IIR数字滤波器FPGA实现

    一、关于IIR数字滤波器 当然关于IIR滤波器的知识,想必大家在教材上都已经很熟了,这里我就简单说一下自己的理解好了。 正如前面说的,IIR
    的头像 发表于 04-04 12:21 1.2w次阅读
    <b class='flag-5'>IIR</b><b class='flag-5'>数字滤波器</b>的<b class='flag-5'>FPGA</b>实现

    FIR数字滤波器设计

    数字滤波器的输入输出均为数字信号,信号通过数字滤波器后,可以改变频率成分的相对比例或滤除某些频率成分。数字滤波器可以分为IIR
    的头像 发表于 04-05 09:47 5543次阅读

    IIR数字滤波器时域滤波效果

    电子发烧友网站提供《IIR数字滤波器时域滤波效果.pdf》资料免费下载
    发表于 11-18 09:58 1次下载
    <b class='flag-5'>IIR</b><b class='flag-5'>数字滤波器</b>时域<b class='flag-5'>滤波</b>效果