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: