✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
相对于硬件方式,采用软件方式可以通过对滤器参数的改变来调整滤波器的性能以达到实现滤波目标.以窗函数法为实例,采用MATLAB程序法介绍了FIR滤波器的设计理念,提出了一款低通滤波器的模型和仿真过程,并对带通,高通,带阻滤波器的设计进行了讨论.实践证明,此种滤波器的设计方法可以很好地实现各种FIR滤波器的设计,能在要求相位线性信道的现代电子系统设计中得到广泛应用,具有一定的工程实践价值.
⛄ 部分代码
clc;
clear all;
close all;
imtool close all;
tic
%*********************************************************%
%****************** FIR 直接型****************************%
%*********************************************************%
%% FIR 滤波器
b = [1, 1.5, 5, 2]; % 系统传递函数的分子系数
a = 1; % 系统传递函数的分母系数,IIR的分母变为1就是FIR
figure(1);set(gcf,'color','w','position',[150,50,512,700]);
%% 单位冲激响应h(n)
N = 30;
delta = impseq(0, 0, N);
h = filter(b, a, delta);
subplot(311); stem(h); title('直接型FIR单位冲激响应h(n)');
%% 单位阶跃响应
X = [ones(1,5), zeros(1, N-5)];
y = filter(b, a, X);
subplot(312); stem(y); title('直接型FIR单位阶跃响应y(n)');
%% 频率响应
b_iir=[1,-3,11,27,18];
a_iir=[16,12,2,-4,-1];
[sos,g]=tf2sos(b_iir,a_iir);
w=linspace(-2*pi,2*pi,500);
N = size(sos);
w=linspace(-2*pi,2*pi,500);
H0=ones(1,length(w));
for k=1:N
b1=sos(k,1:3);
a1=sos(k,4:6);
H1=freqz(b1,a1,w);
H0=H0.*H1;
end
H0=g*H0;
H0=20*log10(abs(H0));
[sos,g]=tf2sos(b,a);
for k=1:N
b1=sos(k,1:3);
a1=sos(k,4:6);
H1=freqz(b1,a1,w);
H0=H0.*H1;
end
H0=g*H0;
H0=20*log10(abs(H0));
H_dir_norm = H0;
subplot(3,1,3),plot(w/pi,H0,'b-','LineWidth',2);hold on
axis tight
title('直接型FIR频率响应');
axis([0,1,-50,40]);
xlabel('单位:pi');
ylabel('单位:dB');
toc
%*********************************************************%
%*********************************************************%
%% 量化系数
bit_num=4;
m = max(max(abs(a),abs(b)));
Qm = floor(log2(m/a(1)));
if Qm < log2(m/a(1))
Qm = Qm + 1;
end
Qm = 2^Qm;
bd = round(b/Qm*(2^(bit_num-1)-1));
ad = 1;
b_iir=[1,-3,11,27,18];
a_iir=[16,12,2,-4,-1];
[sos,g]=tf2sos(b_iir,a_iir);
w=linspace(-2*pi,2*pi,500);
N = size(sos);
w=linspace(-2*pi,2*pi,500);
H0=ones(1,length(w));
for k=1:N
b1=sos(k,1:3);
a1=sos(k,4:6);
H1=freqz(b1,a1,w);
H0=H0.*H1;
end
H0=g*H0;
H0=20*log10(abs(H0));
[sos,g]=tf2sos(bd,ad);
for k=1:N
b1=sos(k,1:3);
a1=sos(k,4:6);
H1=freqz(b1,a1,w);
H0=H0.*H1;
end
H_dir_quatify=g*H0;
H_dir_quatify=20*log10(abs(H_dir_quatify));
subplot(3,1,3),plot(w/pi,H_dir_quatify,'k--','LineWidth',2);hold on
legend('量化前','4bit量化','location','southeast');
⛄ 运行结果
[1] 冯冠超. FIR数字滤波器设计及MATLAB实现[J]. 信息系统工程, 2010(6):1.
[2] 张驰, 郭黎利. 基于Matlab的FIR滤波器设计及FPGA实现[J]. 应用科技, 2006, 33(6):4.
[3] 李洋洋, 江亮亮. 基于MATLAB的FIR数字滤波器的设计与实现[J]. 黑龙江科技信息, 2008(27):2.
[4] 李茂清王洁陈强柯淋. 基于MATLAB程序的FIR滤波器设计实现[J]. 电力学报, 2008, 023(002):87-90.
⛄ 参考文献
⛳️ 完整代码
❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料