📄 lpsigplt.m
字号:
function lpsigplt
%LPSIGPLT Plot control for LPSIGGUI.
% 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');
hn_edt = ui(3);
clear_btn = ui(9);
sig_axs = ui(7);
sig_line = ui([8,12]);
resp_axes = ui(10);
resp_line = ui(11);
mag_axes = ui(26);
mag_line = ui(27);
pz_axes = ui(23);
uc_line = ui(25);
pz_line = ui(24);
freq_pop = ui(14);
freq_edt = ui(16);
axs_han=get(ui(1),'userdata');
%%%%%%%%%
if get(ui(15),'userdata')==1
set(f,'currentaxes',ui(7));
zoom out,zoom reset
set(f,'currentaxes',ui(10));
zoom out,zoom reset
set(f,'currentaxes',ui(23));
zoom out,zoom reset
set(f,'currentaxes',ui(26));
zoom out,zoom reset
end
%%%%%%%%
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
% Verify Transfer Function
hn_st = get(hn_edt,'string');
if isempty(hn_st)
errordlg('Nothing entered.','Input Error');
return
end
problem=0;if hn_st(1)=='W',
hn_st(1)=[];evalin('base',[hn_st ';'],'problem=1;')
if problem==0, hn=evalin('base',hn_st);
if isstr(hn), hn=eval(['[',hn,']'],'[]');end
else
errordlg('MATLAB Syntax error.','Input Error');
return
end
else
hn = eval(['[',hn_st,']'],'[]');
end
if isempty(hn)
errordlg('MATLAB Syntax error.','Input Error');
return
end
if ~any(hn)
errordlg('Not all entries can be zero.','Input Error');
return
end
while hn(1)==0,hn(1)=[];end
while hn(length(hn))==0,hn(length(hn))=[];end
set(ui(17),'userdata',hn);
hn=hn(:);hf=flipud(hn);
if ~any(abs(hf-hn)>10*eps), sy='e'; % Even Symmetry
elseif ~any(abs(hf+hn)>10*eps), sy='o'; % Odd Symmetry
else
errordlg('Sequence is not linear phase','Input Error');
return
end
n=length(hn);M=0.5*(n-1);L=fix(0.5*n-1);H=0;
if rem(n,2)==1, %odd length
if sy=='e', ty=1;sig_tit='TYPE 1 ';H=hn(M+1);else, ty=3;sig_tit='TYPE 3 ';end
else
if sy=='e', ty=2;sig_tit='TYPE 2 ';else, ty=4;sig_tit='TYPE 4 ';end
end
sig_tit=[sig_tit,' Linear Phase Signal'];
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
P=-2*pi*M*F;
if ty<3
for k=0:L,H=H+2*hn(k+1)*cos(2*(M-k)*pi*F);end
else
for k=0:L,H=H+2*hn(k+1)*sin(2*(M-k)*pi*F);end
P=P+0.5*pi*sign(F);
end
hmin=min(hn);hmax=max(hn);
if hmin>0,hmin=0;end
if hmax<0,hmax=0;end
set(sig_axs,'xlim',[0,n-1],'ylim',[hmin,hmax]);
dtstem(sig_line,0:n-1,hn);
s_title = get(sig_axs,'title');
set(s_title,'string',sig_tit);
Hmax=max(H);Hmin=min(H);
if Hmin>0,Hmin=0;end
if Hmax<0,Hmax=0;end
if ~any([Hmax,Hmin]),
Hmax=1;Hmin=-1;
end
set(mag_axes,'xlim',[min(f),max(f)],'ylim',[Hmin,Hmax]);
set(mag_line,'xdata',f,'ydata',H);
set(ui(19),'userdata',[f(:) H(:)]);
mtt=get(mag_axes,'xlabel');
set(mtt,'string',f_label);
Pd=P*180/pi;Pd=Pd.*(abs(Pd)>1e-6);
set(resp_line,'xdata',f,'ydata',Pd);
set(ui(20),'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);
zz=roots(hn);
i=find(max(abs(zz))>1e4);zz(i)=[];
set(ui(18),'userdata',zz);
rmin=min([real(zz);-1]);rmax=max([real(zz);1]);
imin=min([imag(zz);-1]);imax=max([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(pz_axes,'xlim',[rmin, rmax],'ylim',[imin, imax]);
set(pz_line,'xdata',real(zz),'ydata',imag(zz));
fr=0:1/360:1;
phi=fr*2*pi;
cir=exp(sqrt(-1)*phi);
set(uc_line,'xdata',real(cir),'ydata',imag(cir))
set(ui(30:36),'vis','off');
[z,m]=msort(zz);
i=find(m>1);
if ~isempty(i)
li=length(i);l=min(5,li);
set(ui(30:31),'vis','on');
for j=1:l
p=i(j);rt=z(p);mult=int2str(m(p));
rrt=num2str(real(rt),3);if eval(rrt)==0,rrt=[];end
irt=num2str(abs(imag(rt)),3);
if eval(irt)==0,irt=[];else,irt=['+j' irt];end
str=[rrt irt];if isempty(str),str='0';end
if ~isempty(irt),str=[str ' & Conj'];end
set(ui(31+j),'vis','on','string',[mult ' @ ' str]);
end
if li>5
k=li-4;
set(ui(36),'vis','on','string',[int2str(k) ' more multiple zeros']);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -