📄 dfftplt.m
字号:
function dfftplt(mode)
% DFFTPLT Support file for DFFTGUI
% 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
if nargin==0,mode=0;end
f = gcf;
ui = get(f,'userdata');
sample_edt = ui(24);
duration_txt = ui(30);
len_edt = ui(27);
axis_edt = ui(32);
range_edt = ui(52);
window_popup = ui(34);
beta_uis = ui(62:63);
ripple_uis = ui(64:65);
harris_uis = ui(66:67);
ct_lines = ui(36:39);
ct_axes = ui(35);
fft_axes = ui(40);
fft_line = ui(41:42);
fft_alias_axes = ui(43);
fft_alias_line = ui(44:45);
mag_lin = ui(50);
%%%%%%%%
if get(ui(58),'userdata')==1
set(f,'currentaxes',ui(35));
zoom out,zoom reset
set(f,'currentaxes',ui(40));
zoom out,zoom reset
set(f,'currentaxes',ui(43));
zoom out,zoom reset
end
%%%%%%%%%
ele_mat = get(ui(1),'userdata');
[r,c] = size(ele_mat);
i = sqrt(-1);
% if no signal, get out.
if ~length(ele_mat),
dtstem(fft_line,0,0);
dtstem(fft_alias_line,0,0);
dtstem(ct_lines(2:3),0,0);
set(ct_lines(1),'xdata',0,'ydata',0);
set(ct_lines(4),'xdata',0,'ydata',0);
return;
end
axis_val = get(axis_edt,'value');
sample_freq = str2num(get(sample_edt,'string'));
len_val = eval(['[',get(len_edt,'string'),']']);
len=len_val(1);
if length(len_val)==2
zplen=len_val(2);
else
zplen=len;
end
duration = len/sample_freq;
set(duration_txt,'string',num2str(duration,5));
[new_y,t_vec,alias_y,n_vec,new_sig] = dfftgen;
len_disp = length(n_vec);
if len_disp > 20
len_disp = 20;
end
disp_max = len_disp/sample_freq;
set(ct_lines(1),'xdata',t_vec,'ydata',new_y);
dtstem(ct_lines(2:3),n_vec,alias_y,1);
set(ct_lines(4),'xdata',t_vec,'ydata',new_sig);
set(ct_axes,'xlim',[0, disp_max]);
set(ui(54),'userdata',[new_y(:) new_sig(:) t_vec(:)]);
set(ui(55),'userdata',[alias_y(:) n_vec(:)]);
range = eval(['[',get(range_edt,'string'),']']);
beta = str2num(get(beta_uis(2),'string'));
ripple = str2num(get(ripple_uis(2),'string'));
harris = str2num(get(harris_uis(2),'string'));
window_type = get(window_popup,'value');
% compute N+1 point window and delete last sample
window_type=window_type-1;
wind_y = alias_y;
if any(window_type == [(1:3)]),
win = winwind(window_type,len+1);
elseif window_type == 4,
win = winwind(window_type,len+1,beta);
elseif window_type == 5, % Cheby
if rem(len,1)
errordlg('Chebyshev Window requires Even Length.','Input Error');
return
end
win = winwind(window_type,len+1,ripple);
elseif window_type == 6,
win = winwind(window_type,len+1,harris);
end
if window_type>0
wind = win(1:len);
wind_y = wind.*alias_y;
end
% analog freq axis
if axis_val == 1
freq_axis = (0:zplen-1);max_xaxis=zplen-1;
fft_tit = 'FFT Index [k]';
elseif axis_val==2
freq_axis = (0:zplen-1)/zplen;max_xaxis=(zplen-1)/zplen;
fft_tit = 'Digital Frequency [F]';
elseif axis_val == 3
freq_axis = (0:zplen-1)*sample_freq/zplen;
max_xaxis=(zplen-1)*sample_freq/zplen;
fft_tit = 'Analog Frequency [Hz]';
end
fft_y = abs(fft(alias_y,zplen));
fft_y=fft_y.*(abs(fft_y)>1e-6);
fft_wind_y = abs(fft(wind_y,zplen));
fft_wind_y=fft_wind_y.*(abs(fft_wind_y)>1e-6);
%dB only if length > 128
if get(mag_lin,'value')==2,
if zplen < 128,
errordlg('Need zeropadded length >= 128 for dB plot.','Input Error');
set(mag_lin,'value',1);
return;
end
if ~any(fft_y),
errordlg('Cannot plot in dB. All FFT values are zero!.','Input Error');
set(mag_lin,'value',1);
return;
end
i=find(fft_y==0);
fft_y(i)=100*eps*ones(size(i));
i=find(fft_wind_y==0);
fft_wind_y(i)=100*eps*ones(size(i));
fft_y=20*log10(fft_y); fft_y=fft_y-max(fft_y);
fft_wind_y=20*log10(fft_wind_y); fft_wind_y=fft_wind_y-max(fft_wind_y);
end
dtstem(fft_line,freq_axis,fft_y);
dtstem(fft_alias_line,freq_axis,fft_wind_y);
fft_ind=0:zplen-1;
set(ui(56),'userdata',[fft_y(:) fft_wind_y(:) freq_axis(:)]);
set(fft_axes,'xlim',[0,max_xaxis]);set(fft_alias_axes,'xlim',[0,max_xaxis]);
set(get(fft_axes,'xlabel'),'string',fft_tit);
set(get(fft_alias_axes,'xlabel'),'string',fft_tit);
if get(mag_lin,'value')==1,
max_fft=max(fft_y);max_fftw=max(fft_wind_y);
set(fft_axes,'ylim',[0,max_fft+(max_fft==0)]);
set(fft_alias_axes,'ylim',[0,max_fftw+(max_fftw==0)]);
else
set(fft_axes,'ylim',[max(fft_y)-80,0]);
set(fft_alias_axes,'ylim',[max(fft_wind_y)-80,0]);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -