?? freqplt.m
字號:
function freqplt
%FREQPLT: Plotting control for FREQGUI
% 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(5);
range_edt = ui(9);
omega_pop = ui(10);
log_pop = ui(11);
wrap_chk = ui(12);
db_chk = ui(13);
mag_axs = ui(19);
lin1 = ui(20);
ph_axs = ui(29);
lin2 = ui(30);
%%%%%%%%
if get(ui(15),'userdata')==1
set(f,'currentaxes',ui(19));
zoom out,zoom reset
set(f,'currentaxes',ui(29));
zoom out,zoom reset
end
%%%%%%%%%
range = eval(['[',get(range_edt,'string'),']']);
if diff(range) < 0,
errordlg('Plot range must be of the form min, max.','Input Error');
return;
end
if length(range) <= 1,
errordlg('Plot range must be of the form min, max.','Input Error');
return;
end
log_lin = get(log_pop,'value');
if log_lin == 2
if range(1)<=0
errordlg('Log scale requires positive frequencies.','Input Error');
return;
end
end
% 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
set(ui(21),'userdata',n);
set(ui(22),'userdata',d);
if log_lin == 2
f_range = logspace(log10(range(1)),log10(range(2)),401);
else
f_range = linspace(range(1),range(2),401);
end
f_omega = get(omega_pop,'value');
if f_omega == 1,
w_range = f_range * 2*pi;
else
w_range = f_range;
end
s_w=sqrt(-1)*w_range;
H=polyval(n,s_w)./polyval(d,s_w);
M = abs(H);
P = angle(H);
if log_lin == 1
set([mag_axs,ph_axs],'xscale','linear');
if f_omega == 1
x_label ='Frequency [Hz]';
else
x_label ='Frequency [rad/s]';
end
else
set([mag_axs,ph_axs],'xscale','log');
if f_omega == 1
x_label ='Frequency (log scale) [Hz]';
else
x_label ='Frequency (log scale) [rad/s]';
end
end
set(get(mag_axs,'xlabel'),'string',x_label);
set(get(ph_axs,'xlabel'),'string',x_label);
set([mag_axs,ph_axs],'xlim',[min(f_range),max(f_range)]);
db_val = get(db_chk,'value');
if db_val, %dB mag
i=find(M==0);
M(i)=[];
M = 20*log10(M);
f_range(i)=[];
P(i)=[];
Mmin=max([max(M)-80,min(M)]);
if Mmin == max(M);
Mmin = max(M)-20;
end
set(lin1,'xdata',f_range,'ydata',M);
set(ui(23),'userdata',[f_range(:) M(:)]);
set(mag_axs,'ylim',[Mmin,max(M)]);
set(get(mag_axs,'title'),'string','Magnitude Response (dB)');
else
set(lin1,'xdata',f_range,'ydata',M);
set(ui(23),'userdata',[f_range(:) M(:)]);
set(mag_axs,'ylim',[0,max(M)]);
set(get(mag_axs,'title'),'string','Magnitude Response (Linear)');
end
wrap_val = get(wrap_chk,'value');
if wrap_val,
P = unwrap(P);
p_string = 'Unwrapped Phase (Degrees)';
else
p_string = 'Phase (Degrees)';
end
%phase %
Pd = P*180/pi;Pd=Pd.*(abs(Pd)>1e-6);
Pmin = min(Pd);Pmax = max(Pd);
if Pmin == Pmax,
Pmin = Pmax - 20;
end
set(lin2,'xdata',f_range,'ydata',Pd);
set(ph_axs,'ylim',[Pmin,Pmax]);
set(get(ph_axs,'title'),'string',p_string);
set(ui(24),'userdata',Pd);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -