首页专栏详情
打赏
IIR数字滤波器的设计
易百纳技术社区 david 2022-02-14 09:00:16

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

IIR(Infinite Impulse Response)无线脉冲响应滤波器。
系统传递函数为:

系统的差分方程可写为:

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

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

图1 直接I型

图2 直接II型

图3 级联型

图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<log2(Mab/a(1))
Qm = Qm +1;
end
Qm = 2^Qm;
Qb1=round(b/Qm*(2^(Q-1)-1));
Qa1=round(a/Qm*(2^(Q-1)-1));

%绘图
%时域波形图

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);

图5 matlab时域波形

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

图6 matlab频域分析

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


图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波

图8 modelsim 时域波形

由图8可知,pcm_out1(1khz + 3khz)经过IIR滤波器后滤除了3khz,设计成功。
Matlab结果分析:

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

图10 FPGA结果数据分析

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

谢阅读,别走!点赞、关注、转发后再走吧


转载:全栈芯片工程师

3579
收藏
点赞
打赏
给作者打赏,鼓励他抓紧创作吧~
一个爱徒步的~IT民工
评论
0个
内容存在敏感词
点击登录
-- 积分
-- EBC
专栏
收益
评论
我要创作
打赏作者
david
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
支付宝支付
微信支付
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

审核失败

失败原因
备注
Loading...
易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区
在专栏模块发布专栏,可获得其他E友的打赏
回答悬赏问答,被题主采纳后即可获得悬赏金
在上传资料时,有价值的资料可设置为付费资源
达到一定金额,收益即可提现~
收益也可用来充值ebc,下载资料、兑换礼品更容易
活动规则
  • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
  • 2.发布的专栏与资料需要与平台的板块有相关性,禁止注水,专栏/资料任务以审核通过的篇数为准
  • 3.任务完成后,现金奖励直接打款到微信账户;EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换
  • 4.每周最后三个任务将会有以下奖品掉落:社区热卖开发板、小米音响、视频年度会员、京东卡、华为手机等等