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
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593193
  • matlab
    +关注

    关注

    175

    文章

    2922

    浏览量

    228440
  • 滤波器
    +关注

    关注

    158

    文章

    7331

    浏览量

    174779
  • 数字滤波器
    +关注

    关注

    4

    文章

    249

    浏览量

    46747
  • IIR
    IIR
    +关注

    关注

    1

    文章

    56

    浏览量

    22749

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    如何设计数字滤波器

    在信息信号处理过程中,如对信号的过滤、检测、预测等,,都要使用到滤波器数字滤波器数字信号处理中使用最广泛的一种方法,常用的数字滤波器有无限长单位脉冲响应(
    发表于 10-11 07:45

    请问如何去设计IIR数字滤波器

    滤波器的MATLAB怎么去设计?编写VHDL语言代码有哪些注意事项?一般IIR数字滤波器该怎么去设计?以低通滤波器为例,请问如何去设计IIR
    发表于 04-14 06:22

    如何采用级联结构在FPGA上实现IIR数字滤波器

    本文介绍了一种采用级联结构在FPGA上实现IIR数字滤波器的方法。
    发表于 04-15 06:16

    基于FPGA的四阶IIR数字滤波器怎么样?

    基于FPGA的四阶IIR数字滤波器怎么样?
    发表于 04-29 06:21

    怎么实现基于Matlab的IIR数字滤波器设计?

    实现数字滤波器的方法有哪几种?IIR数字滤波器的设计具体步骤是怎样的?
    发表于 05-31 06:30

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

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

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

    数字滤波器数字系统的重要组成部分。利用文本文件实现数字滤波器存在滤波系数不易调整、开发周期长等问题。本文根据IIR 的设计原理,采用Lab
    发表于 09-09 15:57 76次下载

    用MATLAB辅助设计IIR数字滤波器

    用MATLAB辅助设计IIR数字滤波器摘 要:论述了用MATLAB求解IIR数字滤波器系数的原理和函数以及这些函数的使用方法,并给出设计实例以供参考。关键词:
    发表于 05-14 14:08 74次下载

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

    IIR数字滤波器设计-在FPGA上实现任意阶IIR数字滤波器 摘 要:本文介绍了一种采用级联结构在FP
    发表于 01-16 09:45 2312次阅读
    <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 1158次阅读
    用<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 34次下载