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

📄 dtcongui.m

📁 ADSP TOOLBOX: Version 2.0 and gui m-files
💻 M
📖 第 1 页 / 共 2 页
字号:
      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 + -