04 IIR滤波器

01实战原理

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

系统传递函数为:

 系统的差分方程可写为:

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

 直接I型

 直接II型

 级联型

 并联型

02matlab实现

利用matlab产生1khz和3khz的混频信号,并设计通带截止频率为1khz,经过iir滤波器后输出1khz波形。

clear all
close all
clc

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

t =0:2*pi/FS:2*pi*N/FS;%时间序列

%波形产生
sin_osc =sin(t*fc+pi);
sin_e =sin(t*fe);
sin_add = sin_osc+sin_e;

%IIR 滤波器系数(低通滤波器)
[b a] = butter(3,fc/(FS/2),'low');
%[b a] = butter(4,fc/(FS/2),'low');
%[b a] = cheby2(7,60,fc/(FS/2));
c = [b,a];
b_16=round(c/max(abs(c))*(2^(Q-1)-1));
%滤波器系数量化
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));

display(Qb1);
display(Qa1);

%滤波(混频后)
y = filter(Qb1,Qa1,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));

f_e =fft(sin_e,N);
f_e=20*log(abs(f_e))/log(10);        %换算成dBW单位
f_e=f_e(1:length(ft));

f_add =fft(sin_add,N);
f_add=20*log(abs(f_add))/log(10);        %换算成dBW单位
f_add=f_add(1:length(ft));

y_f =fft(y,N);
y_f=20*log(abs(y_f))/log(10);        %换算成dBW单位
y_f=y_f(1:length(ft));

delta=[1 zeros(1,N-1)]; %生成长度为L的单位抽样序列
Fb=filter(b,a,delta); %filter函数获取单位抽样响应

[h,f]=freqz(b,a,N,FS);       %freqz函数求频率响应
mag=20*log(abs(h))/log(10);  %幅度转换成dB单位  

%绘图
%时域波形图
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);

 

 

matlab时域波形

 

 

matlab频域波形

 

 IIR幅频响应分析

03fpga实现

设计就要达到把1khz+3khz混合的信号过滤掉3khz,然后剩下1khz并显示出来。

04fpga仿真

仿真的时候需要提前准备好这几个.dat格式的数据文件,但是不知道怎么生成的。。

这次点击tb_fir添加波形:

 

 为了看到光滑的波形,这里设置为2的28次方-1:

 

 

原文地址:https://www.cnblogs.com/FPGAer/p/14270163.html