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

📄 freqplt.m

📁 trabajos en matlab para verificar son muy buenos
💻 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 + -