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

📄 bodeplt.m

📁 ADSP TOOLBOX: Version 2.0 and gui m-files
💻 M
字号:
function bodeplt
% BODEPLT Plot control for BODEGUI.


% 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');
num_edt = ui(3);
den_edt = ui(8);
clear_btn = ui(9);
%show_pop = ui(6);
mag_axs = ui(10);
line1 = ui(11);
line2 = ui(12);
ph_axs = ui(20);
line3 = ui(21);
line4 = ui(22);

%%%%%%%%
if get(ui(15),'userdata')==1
set(f,'currentaxes',ui(10));
zoom out,zoom reset
set(f,'currentaxes',ui(20));
zoom out,zoom reset
end
%%%%%%%%

freq_pop = ui(14);
f_axis = get(freq_pop,'value');

% Verify Transfer Function 
hn_st = get(num_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, n=evalin('base',hn_st);
if isstr(n), n=eval(['[',n,']'],'[]');end
else
   errordlg('MATLAB Syntax error.','Input Error');
   return
end
else
n = eval(['[',hn_st,']'],'[]');
end
if isempty(n)
   errordlg('MATLAB Syntax error.','Input Error');
   return
end


hd_st = get(den_edt,'string');
if isempty(hd_st)
   errordlg('Nothing entered.','Input Error');
   return
end
problem=0;if hd_st(1)=='W',
hd_st(1)=[];evalin('base',[hd_st ';'],'problem=1;')
if problem==0, d=evalin('base',hd_st);
if isstr(d), d=eval(['[',d,']'],'[]');end
else
   errordlg('MATLAB Syntax error.','Input Error');
   return
end
else
d = eval(['[',hd_st,']'],'[]');
end
if isempty(d)
   errordlg('MATLAB Syntax error.','Input Error');
   return
end


if ~any(n) | ~any(d)  % String of zeros
   errordlg('Num and Den must have nonzero elements.','Input Error');
   return;
end

while n(1) == 0,n(1) = [];end
while d(1) == 0,d(1) = [];end

n=n/d(1);d=d/d(1);
rn=flipud(cplxpair(roots(n)));rd=flipud(cplxpair(roots(d)));
sn=1;sd=1;
s=1;if n(1)<0,s=-1;n=-n;end
zn=0;zd=0;i=find(rn==0);j=find(rd==0);if ~isempty(i);zn=length(i);rn(i)=[];end
if ~isempty(j);zd=length(j);rd(j)=[];end,t=real([rn;rd]);

if any(t>0),
errordlg('TF has some roots in Right-Half Plane.','Input Error');
return;
end

add=zn-zd;xn=abs(rn);xd=abs(rd);ln=length(xn);ld=length(xd);
f=[xn;xd];i=find(f==0);if ~isempty(i);f(i)=[];end,l=length(f);
if l==0,w1=-1;w2=1;f=[];else
f=log10(f);f=sort([f;f+1;f-1;]);lf=3*l;w1=floor(f(1))-1;w2=ceil(f(lf))+1;
if w2<=f(l),w2=w2+1;end,if f(1)<=w1,w1=w1-1;end,end
f=[w1;f;w2];nn=length(f);m=zeros(nn,1);p=m;

%Asymptotic magnitude and phase
for i=1:ln,f0=log10(xn(i));
m=m+(f-f0).*(f>=f0);p1=(f-f0+1).*(f>=f0-1 & f<=f0+1)+2*(f>f0+1);p=p+p1;
if imag(xn(i))~=0,i=i+1;m=m+(f-f0).*(f>=f0);p=p+p1;end,end
for j=1:ld,f0=log10(xd(j));
m=m-(f-f0).*(f>=f0);p1=(f-f0+1).*(f>=f0-1 & f<=f0+1)+2*(f>f0+1);p=p-p1;
if imag(xd(j))~=0,j=j+1;m=m-(f-f0).*(f>=f0);p=p-p1;end,end
p=45*p;m=m+add*f;p=p+90*rem(add+2*(s==-1),4);
while p(1)<=-180;p=p+360;end,while p(1)>180;p=p-360;end %MAKE MAT COMP

if n(ln+1)>0;m=m+log10(abs(n(ln+1)));end %dc gain
if d(ld+1)>0;m=m-log10(abs(d(ld+1)));end,m=20*m;

%Plots
f1=logspace(f(1),f(nn),2);
w=logspace(f(1),f(nn),200);
ss=sqrt(-1)*w;
h=polyval(n*s,ss)./polyval(d,ss);
mag=20*log10(abs(h));
ph=180*unwrap(angle(h))/pi;
ht=[w(:) mag(:) ph(:)];ha=[(10).^(f(:)) m(:) p(:)];

wa=(10).^f;
x_label = 'Frequency (log scale)  [rad/s]';
if f_axis == 2  % Hertz
w=w/(2*pi);
wa = wa/(2*pi);
x_label = 'Frequency (log scale)  [Hz]';
end

mn=min(m)-5;mm=max(m)+5;hm=5*ceil(max(mag)/5);hn=5*floor(min(mag)/5);
mmax=max(mm,hm);mmin=min(mn,hn);m1=[mmin mmin];m2=[mmax mmax];

mag_label = get(mag_axs,'xlabel');
set(mag_axs,'xlim',[min(wa) max(wa)],'ylim',[mmin mmax]);
set(line1,'xdata',w,'ydata',mag);
set(line2,'xdata',wa,'ydata',m);
set(mag_label,'string',x_label);

mn=min(p)-10;mm=max(p)+10;pm=5*ceil(max(ph)/5);pn=5*floor(min(ph)/5);
mmax=max(mm,pm);mmin=min(mn,pn);m1=[mmin mmin];m2=[mmax mmax];

ph_label = get(ph_axs,'xlabel');
set(ph_axs,'xlim',[min(wa) max(wa)],'ylim',[mmin mmax]);
set(line3,'xdata',w,'ydata',ph);
set(line4,'xdata',wa,'ydata',p);
set(ph_label,'string',x_label);

%SAVE info
set(ui(1),'userdata',ht);set(ui(2),'userdata',ha);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -