学习笔记,共同进步。
适用场景
在某些情况下使用matlab作图时,我们希望多次改变某个或者某些参数并观察其对整体图形的影响,这时候循环就是一个不错的选择,避免了整体代码的冗杂。
特别的,当作图前我们所写的代码比较复杂其我们所要改变的参数不能有效利用syms
函数去表达时,循环作图就显得尤为迫切。
clc
clear
% 滤波器指标
wp=0.2*pi;
ws=0.3*pi;
ap=1;
ar=15;
T=0.1;% T=0.1 0.2 0.3 0.35 采样时间
[N,wc]=buttord(wp,ws,ap,ar,"s");
[Z,P,K]=buttap(N);
z=Z*wc;p=P*wc;k=K*wc^N;
B=k*real(poly(z));
A=real(poly(p));
w=0:pi/200:2*pi;% 设定频率
[b,a]=impinvar(B,A,1/T);% 计算系统函数系数
Ha=freqs(B,A,w/T);% 模拟响应
H=freqz(b,a,w/T);% 数字响应
plot(w/pi,abs(H),w/pi,abs(Ha))
title('采样频率T=0.1')
xlabel('频率f/\it{Hz}')
ylabel('幅值')
上图代码中,我们用脉冲响应不变法设计巴特沃斯滤波器。同时,我们希望控制T以实现不同采样频率对滤波器频率响应的影响,且要求在一张图上画出滤波器的模拟响应和数字响应。
因此,我们自然想到运用一个循环把四个T值时的图全画出来。
困难
- 由于
impinvar
函数的输入参数要求,我们没办法用syms
将T先定义为变量最后再进行赋值。 - 对每个图作不同的线型标注
解决
clc
clear
% 滤波器指标
wp=0.2*pi;
ws=0.3*pi;
ap=1;
ar=15;
t=[0.1 0.2 0.3 0.35];% t储存采样时间
[N,wc]=buttord(wp,ws,ap,ar,"s");
[Z,P,K]=buttap(N);
z=Z*wc;p=P*wc;k=K*wc^N;
B=k*real(poly(z));
A=real(poly(p));
w=0:pi/200:2*pi;% 设定频率范围
cel={'--','+-','*-','o'};% 线型和标注符号
for i=1:4 % 循环以满足不同采样时间的对比
T=t(i); % 采样时间T=0.1 0.2 0.3 0.35
[b,a]=impinvar(B,A,1/T);% 计算系统函数系数
Ha=freqs(B,A,w/T);% 模拟响应
H=freqz(b,a,w/T);% 数字响应
subplot(2,2,i)
cell_line=cel(i);
char_line=char(cell_line);
plot(w/pi,abs(H),w/pi,abs(Ha),char_line)
title(['采样频率T=',num2str(t(i))])
xlabel('频率f/\it{Hz}')
ylabel('幅值')
end
说明
-
用 t 储存 T 的不同取值;cel 是元胞数组,储存线型标志
-
cell_line=cel(i); char_line=char(cell_line);
保证线型标志类型为 char -
title(['采样频率T=',num2str(t(i))])
随循环改变图的标题