📄 dpzplt.m
字号:
function dpzplt
% DPZPLT Support file for DPZGUI.
% 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]);
resp_axes = ui(29);
resp_line = ui(30);
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),
dtstem(sig_line,0,0);
%Magnitude
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);
val2 = ele_mat(k,2);
val3 = ele_mat(k,3);
if val1==1 % if poles on uc, move slightly inside uc
if abs(val3)==1
val3=val3*(1-10*eps);
end
end
val4 = ele_mat(k,4);
val=val3*exp(j*val4*pi/180);
valim=imag(val);if abs(valim)<=10*eps;valim=0;end
val=real(val)+j*valim;
if ~isreal(val), %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));
hn=hn.*(abs(hn)>1e-10);
hd=hd.*(abs(hd)>1e-10);
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
n=n_lim(1):n_lim(2);
tdd=get(ui(47),'value');
if tdd==1
h_impn=izt('tf',hn,pp,1);tit='Impulse Response h[n]';
elseif tdd==2
h_impn=izt('tf',[hn 0],[pp;1],1);tit='Step Response s[n]';
end
if ~isempty(h_impn)
h_imp=eval(h_impn);
h_imp=h_imp.*(abs(h_imp)>1e-6);
else
h_imp=0*n;
end
td_resp=[tit ' = ' h_impn];
set(ui(61),'string',td_resp);
set(ui(19),'userdata',h_impn);
f=linspace(f_lim(1),f_lim(2),501);
if f_axis == 2
F=f/2/pi;f_label = 'Digital Frequency [Omega]';
else
F=f;f_label='Digital Frequency [F]';
end
z_w=exp(sqrt(-1)*2*pi*F);
H = polyval(hn,z_w)./polyval(hd,z_w);
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
dtstem(sig_line,n,h_imp);
set(sig_axs,'xlim',[n_lim(1) n_lim(2)],'ylim',[hmin,hmax]);
ptt=get(sig_axs,'title');
set(ptt,'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);
%Pole-zero plot
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]);
%After evaluating rmax,imax etc
maxx=max(abs([rmax,imax,rmin,imin]));
set(pz_axes,'xlim',[-maxx, maxx],'ylim',[-maxx, maxx]);
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 + -