📄 fssynplt.m
字号:
function fssynplt
% FSSYNPLT Plot control for FSSYNGUI.
% 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
ver_str=version;
ver4=length(findstr('4.',ver_str));
f = gcf;
ui = get(f,'userdata');
sym_pop = ui(8);
show_pop = ui(31);
per_edt = ui(2);
dur_edt = ui(4);
dc_edt = ui(6);
n_edt = ui(11);
x_k = ui(17);
special = ui(42);
special_k = ui(46);
special_x = ui(48);
autoplot = ui(27);
plot_btn = ui(28);
axs = ui(37);
line1 = ui(38);
line2 = ui(39);
line3 = ui(40);
%%%%%%%%%%%
if get(ui(5),'userdata')==1
set(f,'currentaxes',ui(37));
zoom out,zoom reset
end
%%%%%%%%%%
sym_type = get(sym_pop,'value');
plt_type = get(show_pop,'value');
if isempty(get(n_edt,'string')),
errordlg('No value entered for # of harmonics.','Input Error');
return
end
if isempty(get(per_edt,'string')),
errordlg('No value entered for time period.','Input Error');
return
end
if isempty(get(dc_edt,'string')),
errordlg('No value entered for dc offset.','Input Error');
return
end
nn = get(n_edt,'string');
n = str2num(nn);
c0 = str2num(get(dc_edt,'string'));
T = str2num(get(per_edt,'string'));
dur_str=get(dur_edt,'string');
dur_str = ['[',dur_str,']'];
dur=eval(dur_str);
if length(dur) ~= 2
errordlg('Range must have 2 elements as min max.','Input Error');
return
end
if dur(1)>=dur(2)
errordlg('Range must have 2 elements as min max.','Input Error');
return
end
if T<=0
errordlg('Time period must be positive.','Input Error');
return;
end
if n ~= round(n) | n<0,
errordlg('# of harmonics must be a positive integer.','Input Error');
return;
end
sp_k=[];
spec_val = get(special,'value');
if spec_val
sp_k = get(special_k,'string');
if ~isempty(sp_k)
type_st = ['[',sp_k,']'];
ttt=0;eval([type_st,';'],'ttt=1;')
if ttt==1
errordlg('Matlab syntax error for special k values.','Input Error');
return
end
sp_k = eval(['[',sp_k,']']);
if any(sp_k>n)
errordlg(['Number of special k values cannot exceed ' nn],'Input Error');
return
end
if any(sp_k==0)
errordlg('k values cannot be zero. Use dc offset if k=0.','Input Error');
return
end
end
end
% compute coefficients
ttt=0;
k=(1:n)+eps;
j=sqrt(-1);
type_str = get(x_k,'string');
problem=0;if type_str(1)=='W',
type_str(1)=[];ty_str=type_str;evalin('base',[type_str ';'],'problem=1;')
if problem==0, type_str=evalin('base',type_str);
else
errordlg('MATLAB Syntax error.','Input Error');
return
end
if ~isstr(type_str)
errordlg([ty_str ' is not a string variable.'],'Input Error');
return
end
end
type_sav=type_str;
%if c0~=0,type_sav=['(' type_sav ').*(k~=0)+' num2str(c0) '*(k==0)'];end
set(ui(34),'userdata',type_sav);
if isempty(type_str)
xk=zeros(size(k));
else
type_str = ['[',type_str,']'];
ttt=0;eval([type_str,';'],'ttt=1;')
if ttt==1
errordlg('Matlab syntax error for X[k].','Input Error');
return
end
if sym_type ==1
k=1:n;
elseif sym_type == 2
k=1:2:n;
elseif sym_type == 3
k=2:2:n;
end
warning off
xk=eval(type_str);
if length(xk)==1 %% coefficients are constant
xk=xk*ones(size(k));
end
if length(xk) ~= length(k)
errordlg(['Length of X[k] must equal ' nn],'Input Error');
return
end
end
xk1=zeros(size(1:n));
if sym_type == 1
xk1=xk;
elseif sym_type == 2
xk1(1:2:n)=xk;
elseif sym_type == 3
xk1(2:2:n)=xk;
end
xk=xk1;
if ~isempty(sp_k)
sp_xk = get(special_x,'string');
sp_xk = ['[',sp_xk,']'];
k=sp_k;
ttt=0;eval([sp_xk,';'],'ttt=1;')
if ttt==1
errordlg('Matlab syntax error for special X[k] values.','Input Error');
return
end
sp_xk = eval(sp_xk);
if length(sp_xk) ~= length(sp_k)
errordlg('Length of special X[k] must equal length of k.','Input Error');
return
end
xk(sp_k)=sp_xk;
end
i=find(isinf(xk));
if ~isempty(i)
i=i(:).';k_s=num2str(i);
errordlg(['Divide by zero for k= [',k_s,'].'],'Input Error');
set(autoplot,'value',0);
return
end
i=find(isnan(xk));
if ~isempty(i)
i=i(:).';k_s=num2str(i);
errordlg(['Indeterminate for k= [',k_s,'].'],'Input Error');
set(autoplot,'value',0);
return
end
warning on
ck=2*abs(xk);
tk=angle(xk);
ksav=0:n;
cksav=[c0 ck];
tksav=tk*180/pi;tksav=tksav.*(abs(tksav)>1e-4);tksav=[0 tksav];
set(ui(33),'userdata',[cksav(:) tksav(:) ksav(:)]);
% Compute FS Coeffs
axs_han=get(ui(7),'userdata');
m_title = get(axs_han,'title');
m_xlabel = get(axs_han,'xlabel');
nbr = int2str(n);
dd=ceil((dur(2)-dur(1))/T);
pts=min(1000,dd*250);
tr=dur(1):1/pts:dur(2);
if plt_type == 1
yr=c0+0*tr;
lim=yr;
for k=1:n,
lim=lim+ck(k)*cos(2*k*pi*(tr/T)+tk(k));
end
lim=[min(lim) max(lim)];dlim=0.1*[lim(2)-lim(1)];
limits=[lim(1)-dlim lim(2)+dlim];
if limits(1)==limits(2)
limits =[limits(1)-0.5 limits(1)+0.5];
end
set(line2,'xdata',[],'ydata',[]);
set(line1,'xdata',[],'ydata',[]);
set(axs,'xlim',[dur(1) dur(2)],'ylim',limits);
set(line3,'xdata',tr,'ydata',yr,'linestyle','-','erasemode','back','color','c');
s_tit = ['Signal Reconstruction to k = ' nbr];
set(m_title,'string',s_tit);
set(m_xlabel,'string','Time [s]');
if ver4,er_str='xor';else,er_str='back';end
for k=1:n,
sm=ck(k)*cos(2*k*pi*(tr/T)+tk(k));
yr=yr+sm;
if ver4
set(line3,'xdata',tr,'ydata',yr,'linestyle','-','erasemode','back','color','c');
else
set(line3,'xdata',tr,'ydata',yr,'erasemode','back');
end
end
set(ui(32),'userdata',[yr(:) tr(:)]);
elseif plt_type == 2
dtstem(ui(38:39),(0:n)/T,[abs(c0) ck],1);
set(line3,'xdata',[],'ydata',[]);
ym=1.1*max([abs(c0) ck]);
if ym==0,ym=1;end
set(axs,'xlim',[0,n/T],'ylim',[0 ym]);
set(m_title,'string',['Magnitude Spectrum to k = ' nbr]);
set(m_xlabel,'string','Frequency [Hz]');
elseif plt_type == 3
dtstem(ui(38:39),(0:n)/T,[180*(c0<0) tk*180/pi],1);
set(line3,'xdata',[],'ydata',[]);
set(axs,'xlim',[0,n/T],'ylim',[-180 180]);
set(m_title,'string',['Phase Spectrum to k = ' nbr]);
set(m_xlabel,'string','Frequency [Hz]');
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -