⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pzdesplt.m

📁 ADSP TOOLBOX: Version 2.0 and gui m-files
💻 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 + -