📄 dtcongui.m
字号:
eval([xn_str ';'],'ttt=1;');
if ttt
errordlg('Incorrect Matlab syntax for h[n].','Input Error');
set(action_pop,'value',1);
return;
end
hn_eval = eval(xn_str);
else
hn_eval = xn_str;
end
if length(hn_eval) ~= length(n) & length(hn_eval) ~= 1
errordlg('Array length must equal range length for h[n].','Input Error');
set(action_pop,'value',1);
return;
end
if length(hn_eval)==1
hn_eval=hn_eval*ones(size(n));
end
set(h_edt,'userdata',n);
set(hn_edt,'userdata',hn_eval);
xo=xn_eval;
txo=nx;
yo=hn_eval;
tyo=n;
ty=get(action_pop,'value');
if ty==1 %edit
set(ui([4,6,7,10,12]),'enable','on');
set(top_axs,'pos',[210 260 390 150]);
set(bot_axs,'pos',[210 60 390 150]);
set(ui(35),'pos',[-600 260 390 150]);
set(ui(40),'pos',[-600 60 390 150]);
dtstem(ui(30:31),nx,xo);
dtstem(ui(33:34),n,yo);
nmin=min([n,nx]);nmax=max([n,nx]);
set([top_axs,bot_axs],'xlim',[nmin-1 nmax+1]);
ymin=min([xo yo]);ymax=max([xo yo]);
%%% New code
if ymin>0,ymin=0;end
if ymax<0,ymax=0;end
%%%
dely=0.1*(ymax-ymin);
set([top_axs,bot_axs],'ylim',[ymin-dely*(ymin~=0) ymax+dely*(ymax~=0)]);
return;
else
set(ui([4,6,7,10,12]),'enable','off');
set(top_axs,'pos',[-600 260 390 150]);
set(bot_axs,'pos',[-600 60 390 150]);
set(ui(35),'pos',[210 260 390 150]);
set(ui(40),'pos',[210 60 390 150]);
end
if ty==2, %cxy
x=xo;y=yo;t1=txo;t2=tyo;meth='Convolution x[n]*h[n]';y_st=' y_xh';
xhtit=' x[k] and h[n-k] (folded)';
elseif ty==3, %cyx
x=yo;t1=tyo;y=xo;t2=txo;meth='Convolution h[n]*x[n]';y_st=' y_hx';
xhtit=' x[n-k] (folded) and h[k] ';
elseif ty==4, %rxy
x=xo;t1=txo;y=fliplr(yo);t2=-fliplr(tyo);meth='Correlation x[n]**h[n]';
y_st=' r_xh';xhtit=' x[k] and h[k-n] (shifted) ';
elseif ty==5, %ryx
x=yo;t1=tyo;y=fliplr(xo);t2=-fliplr(txo);meth='Correlation h[n]**x[n]';
y_st=' r_hx';xhtit=' x[k-n] (shifted) and h[k] ';
end
x_range=t1;
h_range=t2;
x_n=x;
h_n=fliplr(y);
set(ui(52),'userdata',y_st);
% Now, compute the starting and ending indices of conv
nxs=x_range(1);
nhs=h_range(1);
nxe=x_range(length(x_n));
nhe=h_range(length(h_n));
nys=nxs+nhs; % Starting index of result
% initialize the x[n] & folded [h] axes
y_mx=max([h_n x_n]);
y_mn=min([h_n x_n]);
%%%%%%% For setting limits
if y_mn>0,
y_mn=0;
y_mx=1.2*y_mx;
elseif y_mx<0
y_mx=0;
y_mn=1.2*y_mn;
else
dy=0.2*(y_mx-y_mn);
y_mn=y_mn-dy;
y_mx=y_mx+dy;
end
if y_mx-y_mn<10*eps
y_mx=y_mx+0.1;
y_mn=y_mn-0.1;
end
y_lm=[y_mn y_mx];
dtstem(ui(36:37),x_range,x_n);
set(ui(35),'xlim',[nxs-(length(h_n)+1),nxe+(length(h_n)+1)]);
set(ui(35),'ylim',y_lm);
top_tit=get(ui(35),'title');
set(top_tit,'string',['Signals ' xhtit ' ready for operation']);
%Find Convolution
start_val=get(action_pop,'value');
if start_val==1
dtcongui(1);
else
y_con=conv(x_n,fliplr(h_n));
end
set(ui(8),'userdata',y_con);
ind_ycon=0:length(y_con)-1;
set(ui(7),'userdata',nys+ind_ycon);
y_max=max(y_con);
y_min=min(y_con);
%%%%%%% For setting limits
if y_min>0,
y_min=0;
y_max=1.2*y_max;
elseif y_max<0
y_max=0;
y_min=1.2*y_min;
else
dy=0.2*(y_max-y_min);
y_min=y_min-dy;
y_max=y_max+dy;
end
if y_max-y_min<10*eps
y_max=y_max+0.1;
y_min=y_min-0.1;
end
y_lim=[y_min y_max];
set(ui(40),'xlim',[nys+nxs-nxs-(length(h_n)+1),nys+nxe-nxs+length(h_n)+1],...
'ylim',y_lim);
h_range = (nxs - (length(h_n))):(nxs - 1);
dtstem(ui(38:39),h_range,h_n);
set(ui(41:42),'xdata',nys-1,'ydata',0);
bot_tit=get(ui(40),'title');
set(bot_tit,'string',['Result of ' meth ' starts at n = ' int2str(nys)]);
set(ui(50:51),'enable','on');
set(ui(49),'userdata',[x_range;x_n]);
set(ui(50),'userdata',[h_range;h_n;(1:length(h_n))+nys-2]);
set(ui(51),'userdata',[]);
set(ui(49),'enable','off');
% if auto is on, run it.
if get(auto_check,'value'), dtcongui(12); end
elseif any(mode == [10,11]), % shift h[-k] left or right
start_val = get(action_pop,'value');
xn_data = get(ui(49),'userdata');
hn_data = get(ui(50),'userdata');
yn_data = get(ui(51),'userdata');
y_st = get(ui(52),'userdata');
txt = []; %get(ui(52),'userdata');
xn_range = xn_data(1,:);
hn_range = hn_data(1,:);
hn_flip = hn_data(2,:);
xn = xn_data(2,:);
y_fix = hn_data(3,:); %NEW UPDATE
if mode == 11, % shift right
hn_range = hn_range + 1;
y_fix=y_fix + 1; %NEW UPDATE
else
hn_range = hn_range - 1;
y_fix=y_fix - 1; %NEW UPDATE
end
if length(yn_data),
yn_range = yn_data(1,:);
yn = yn_data(2,:);
nxs=xn_range(1);
nxe=xn_range(length(xn_range));
if hn_range(1) <= nxe,
set(ui(50),'enable','on');
else
set(ui(50),'enable','off');
return
end
if hn_range(length(hn_range)) < nxs,
set(ui(49),'enable','off');
return
else
set(ui(49),'enable','on');
end
else
yn_range = [];
yn = [];
end
dtstem(ui(38:39),hn_range,hn_flip);
set(ui(50),'userdata',[hn_range;hn_flip;y_fix]);
hn_r = fliplr(hn_range);
hn = fliplr(hn_flip);
xn_r = xn_range;
yn_loc=y_fix(1);
% loc_t exists simply to see if a convolution took place
yn_t = 0; loc_t = []; yn_str = [];
for k = 1:length(hn_r),
loc = find(hn_r(k) == xn_r);
if length(loc),
yn_t = hn(k)*xn(loc) + yn_t;
loc_t = [loc_t,loc];
end
end
% if a convolution took place, plot its result
if length(loc_t),
if mode == 11,
yn_range = [yn_range,yn_loc];
yn(length(yn)+1) = yn_t;
elseif length(yn_range),
yn_range(length(yn_range)) = [];
yn(length(yn)) = [];
end
yn_str=[y_st '[',int2str(yn_loc),'] = ' num2str(yn_t,6)];
dtstem(ui(41:42),yn_range,yn);
set(ui(52),'string',yn_str);
end
set(ui(51),'userdata',[yn_range;yn]);
elseif mode == 12, % auto run
start_val = get(action_pop,'value');
set(action_pop,'enable','off');
xn_data = get(ui(49),'userdata');
hn_data = get(ui(50),'userdata');
yn_data = get(ui(51),'userdata');
y_st = get(ui(52),'userdata');
txt = []; %get(ui(52),'userdata');
auto_val = get(auto_check,'value');
if auto_val==1
set(auto_check,'enable','off');
end
xn_range = xn_data(1,:);
hn_range = hn_data(1,:);
hn_flip = hn_data(2,:);
xn = xn_data(2,:);
y_fix = hn_data(3,:);
y_fix = y_fix + 1;
hn_range = hn_range + 1;
nxs=xn_range(1);
nxe=xn_range(length(xn_range));
while hn_range(1) <= nxe & auto_val,
set(ui(49),'enable','off');
set(ui(50),'enable','off');
hn_data = get(ui(50),'userdata');
yn_data = get(ui(51),'userdata');
hn_flip = hn_data(2,:);
y_fix = hn_data(3,:);
if length(yn_data),
yn_range = yn_data(1,:);
yn = yn_data(2,:);
else
yn_range = [];
yn = [];
end
dtstem(ui(38:39),hn_range,hn_flip);
set(ui(50),'userdata',[hn_range;hn_flip;y_fix+1]);
hn_r = fliplr(hn_range);
hn = fliplr(hn_flip);
xn_r = xn_range;
yn_loc=y_fix(1)+1;
% loc_t exists simply to see if a convolution took place
yn_t = 0; loc_t = []; yn_str = [];
for k = 1:length(hn_r),
loc = find(hn_r(k) == xn_r);
if length(loc),
yn_t = hn(k)*xn(loc) + yn_t;
loc_t = [loc_t,loc];
end
end
% if a convolution took place, plot its result
if length(loc_t),
yn_range = [yn_range,yn_loc];
yn(length(yn)+1) = yn_t;
yn_str=[y_st '[',int2str(yn_loc),'] = ' num2str(yn_t,6)];
dtstem(ui(41:42),yn_range,yn);
set(ui(52),'string',yn_str);
end
set(ui(51),'userdata',[yn_range;yn]);
hn_range = hn_range + 1;
y_fix = y_fix + 1;
auto_val = get(auto_check,'value');
pause(1);
drawnow;
end
if hn_range(1) <= nxe,
set(ui(50),'enable','on');
else
set(ui(50),'enable','off');
set(ui(51),'value',0);
end
if hn_range(length(hn_range)) < nxs,
set(ui(49),'enable','off');
else
set(ui(49),'enable','on');
end
set(action_pop,'enable','on');
set(auto_check,'enable','on');
elseif mode == 15, %Export data
str1='Export signal x[n] as';
str2='Export index of x[n] as';
str3='Export signal h[n] as';
str4='Export index of h[n] as';
str5='Export result y[n] as';
str6='Export index of y[n] as';
exp_str={str1,str2,str3,str4,str5,str6};
exp_var={'xsig','xind','hsig','hind','ysig','yind'};
expect=inputdlg(exp_str,'Save Variables as',1,exp_var);
if ~isempty(expect)
txsig=get(ui(4),'userdata');%%% FIX FOR UIs
xsig=get(ui(6),'userdata');%%% FIX FOR UIs
thsig=get(ui(10),'userdata');%%% FIX FOR UIs
hsig=get(ui(12),'userdata');%%% FIX FOR UIs
tysig=get(ui(7),'userdata');
ysig=get(ui(8),'userdata');
if ~isempty(expect{1}),assignin('base',expect{1},xsig);end
if ~isempty(expect{2}),assignin('base',expect{2},txsig);end
if ~isempty(expect{3}),assignin('base',expect{3},hsig);end
if ~isempty(expect{4}),assignin('base',expect{4},thsig);end
if ~isempty(expect{5}),assignin('base',expect{5},ysig);end
if ~isempty(expect{6}),assignin('base',expect{6},tysig);end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -