📄 pzdesplt.m
字号:
function pzdesplt
% PZDESPLT Support file for PZDESGUI.
% ADSP Toolbox: Version 2.0
% For use with "Analog and Digital Signal Processing", 2nd Ed.
% Published by PWS Publishing Co.
%
% Ashok Ambardar, EE Dept. MTU, Houghton, MI 49931, USA
% http://www.ee.mtu/faculty/akambard.html
% e-mail: akambard@mtu.edu
% Copyright (c) 1998
f = gcf;
ui = get(f,'userdata');
ele_mat = get(ui(1),'userdata');
time_edt = ui(37);
sig_axs = ui(20);
%sig_line = ui([21,22]);
sig_line = ui(21);
resp_axes = ui(29);
resp_line = ui(30);
imp_show = ui(43);
mag_axes = ui(27);
mag_line = ui(28);
pz_axes = ui(23);
%uc_line = ui(26);
z_line = ui(24);
p_line = ui(25);
freq_pop = ui(33);
freq_edt = ui(35);
%%%%%%%
if get(ui(5),'userdata')==1
set(f,'currentaxes',ui(20));
zoom out,zoom reset
set(f,'currentaxes',ui(23));
zoom out,zoom reset
set(f,'currentaxes',ui(27));
zoom out,zoom reset
set(f,'currentaxes',ui(29));
zoom out,zoom reset
end
%%%%%%%
ele_mat = get(ui(1),'userdata');
[r,c] = size(ele_mat);
% if no signal defined, get out.
if ~length(ele_mat),
set(sig_line,'xdata',0,'ydata',0);
set(mag_line,'xdata',0,'ydata',0);
set(resp_line,'xdata',0,'ydata',0);
set(p_line,'xdata',0,'ydata',0);
set(z_line,'xdata',0,'ydata',0);
return;
end
j = sqrt(-1);
pp=[];zz=[];
for k = 1:r,
val1 = ele_mat(k,1); %Pole or zero
val2 = ele_mat(k,2); %Multiplicity
val3 = ele_mat(k,3); %Magnitude
val4 = ele_mat(k,4); %Phase
val=val3+j*val4;
if val4~=0, %need to conjugate
val=[val;conj(val)];
end
vall=val;
for k=1:val2-1 %repeat if multiple poles/zeros
vall=[vall;val];
end
val=vall;
if val1==1
pp=[pp;val];
else
zz=[zz;val];
end
end
gain_fac=str2num(get(ui(42),'string'));
if gain_fac==0
errordlg('Gain constant must be non-zero.','Input Error');
set(ui(42),'string','1');
return
end
hn=gain_fac*real(poly(zz));
hd=real(poly(pp));
set(ui(15),'userdata',hn);
set(ui(16),'userdata',hd);
ln=length(hn);ld=length(hd);
f_axis = get(freq_pop,'value');
f_lim = eval(['[',get(freq_edt,'string'),']']);
if length(f_lim)<2
errordlg('Limits must be in the form Min,Max.','Input Error');
return
end
if f_lim(1)>=f_lim(2)
errordlg('Limits must be in the form Min,Max.','Input Error');
return
end
n_lim = eval(['[',get(time_edt,'string'),']']);
if length(n_lim)<2
errordlg('Limits must be in the form Min,Max.','Input Error');
return
end
if n_lim(1)>=n_lim(2)
errordlg('Limits must be in the form Min,Max.','Input Error');
return
end
t=linspace(n_lim(1),n_lim(2),401);
tdd=get(ui(47),'value');
lden=ld;if tdd==2,lden=ld+1;end
if ln>=lden,
set(imp_show,'vis','on');
else
set(imp_show,'vis','off');
end
if tdd==1
[h_impf,h_impn]=ilt('tf',hn,pp,1);tit='Impulse Response h(t)';
elseif tdd==2
[h_impf,h_impn]=ilt('tf',hn,[pp;0],1);tit='Step Response s(t)';
end
if ~isempty(h_impn),
h_imp=eval(h_impn);h_imp=h_imp.*(abs(h_imp)>1e-6);
else
h_imp=0*t;
end
td_resp=[tit ' = ' h_impf];
set(ui(61),'string',td_resp);
set(ui(19),'userdata',h_impf);
f=linspace(f_lim(1),f_lim(2),501);
if f_axis == 2
F=f/2/pi;f_label = 'Frequency [rad/s]';
else
F=f;f_label='Frequency [Hz]';
end
s=sqrt(-1)*2*pi*F;
H = polyval(hn,s)./polyval(hd,s);
Hm=abs(H);
%Impulse Response
hmin=min(h_imp);hmax=max(h_imp);
if hmax==hmin
hmax=hmax+0.5;hmin=hmin-0.5;
end
set(sig_axs,'xlim',[n_lim(1),n_lim(2)],'ylim',[hmin,hmax]);
set(sig_line,'xdata',t,'ydata',h_imp);
mtt=get(sig_axs,'title');
set(mtt,'string',tit);
set(sig_axs,'userdata',tit);
%Magnitude
set(mag_line,'xdata',f,'ydata',Hm);
set(ui(17),'userdata',[f(:) Hm(:)]);
Hmax=max(Hm);if ~any(abs(diff(Hm))>100*eps),Hmax=1.2*Hmax;end
set(mag_axes,'xlim',[min(f) max(f)],'ylim',[0,Hmax]);
mtt=get(mag_axes,'xlabel');
set(mtt,'string',f_label);
%Phase
Pd=unwrap(angle(H));
Pd=Pd*180/pi; Pd=Pd.*(abs(Pd)>1e-6);
set(resp_line,'xdata',f,'ydata',Pd);
set(ui(18),'userdata',Pd(:));
Pmax=max(Pd);Pmin=min(Pd);
if Pmax>Pmin
set(resp_axes,'xlim',[min(f),max(f)],'ylim',[Pmin,Pmax]);
else
set(resp_axes,'xlim',[min(f),max(f)],'ylim',[Pmin-5,Pmax+5]);
end
ptt=get(resp_axes,'xlabel');
set(ptt,'string',f_label);
rmin=min([real(pp);real(zz);-1]);rmax=max([real(pp);real(zz);1]);
imin=min([imag(pp);imag(zz);-1]);imax=max([imag(pp);imag(zz);1]);
set(pz_axes,'xlim',1.2*[rmin, rmax],'ylim',1.2*[imin, imax]);
set(p_line,'xdata',real(pp),'ydata',imag(pp));
set(z_line,'xdata',real(zz),'ydata',imag(zz));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -