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

📄 dtsigedt.m

📁 ADSP TOOLBOX: Version 2.0 and gui m-files
💻 M
字号:
function dtsigedt(mode,cur_txt)
%DTSIGEDT Signal editing for DTSIGGUI and DTSIMGUI


% 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


%  NOTE: Also used by DTSIMGUI

  
f = gcf;
ui = get(f,'userdata');
edts = ui(15:3:27);
cust_edt = ui(63);
stat_bar = ui(61);
ele_mat = get(ui(1),'userdata');
top_axs = ui(29);
ele_loc = get(ui(14),'userdata');
ele_axs = get(ui(12),'userdata');
ele_sld = get(ele_axs,'userdata');
ele_typ = get(ui(5),'value');
[r,c] = size(ele_mat);

if any(mode == [1:3]), % displaying elements

   if any(mode == [1,3]),
      axes(ele_axs);
      cla;
      top = 0.8;
      range = 1:r;
   else
      ele_loc = get(ui(14),'userdata');
      range = ele_loc;
   end

   for k = range,

      ele_vec = ele_mat(k,:);
      ele_str1 = num2str(ele_vec(1),2);
      ele_str2 = num2str(ele_vec(2),2);
      ele_str3 = num2str(ele_vec(3),2);
      ele_str4 = num2str(ele_vec(4),2);
      ele_str5 = num2str(ele_vec(5),2);
      ele_str7 = num2str(ele_vec(7),2);
      ele_str9 = num2str(ele_vec(9),2);

      if ele_vec(6) == 1, % power function
         txt_str = genasig(ele_vec(1:5),'n');
      elseif ele_vec(6) == 2, % Matlab array
          if isnan(ele_vec(1)) | mode == 2
             txt_str = get(cust_edt,'string');
          else
             txt_str = get(ele_vec(1),'userdata');
          end


      end
      if any(finite([ele_vec(7),ele_vec(9)])),
         if finite(ele_vec(7)), ele_str7 = [',[',ele_str7];
         else ele_str7 = [',(',ele_str7]; end
         if finite(ele_vec(9)), ele_str9 = [ele_str9,']'];
         else ele_str9 = [ele_str9,')']; end

         txt_str = [txt_str,' ',ele_str7,',',ele_str9];
      end

      if any(mode == [1,3]),
          clr='k';

          axes(ele_axs);
         if k ~= 1,
            txt1 = text(0.05,top,'+','color',clr,'fontsize',10,...
                  'fontweight','bold','verti','top','horiz','center',...
                  'clipping','on');
         else
            txt1 = text(0,top,' ','vis','off');
         end

         txt2 = text(0.1,top,txt_str,'color',clr,'fontsize',10,...
               'fontweight','bold','verti','top',...
               'clipping','on','userdata',[k,txt1],...
               'buttondownfcn','dtsigedt(5)');

         txt_ext = get(txt2,'extent');
         if txt_ext(3) > 0.94, set(txt2,'fontsize',8); end
         top = top - txt_ext(4);

            if ele_vec(6) == 2
               axes(top_axs);
                 if isnan(ele_vec(1))
                    txt3 = text('vis','off');
                    set(txt3,'userdata',get(cust_edt,'string'));
                    ele_mat(k,1) = txt3;
                 elseif mode == 2
                    set(ele_mat(k,1),'userdata',get(cust_edt,'string'));
                 end
            end


      else
         set(cur_txt,'string',txt_str);
         txt_ext = get(cur_txt,'extent');
         if txt_ext(3) > 0.94, set(cur_txt,'fontsize',8);
         else set(cur_txt,'fontsize',10); end

            if ele_vec(6) == 2
               set(ele_vec(1),'userdata',get(cust_edt,'string'));
            end

      end

   end

   if mode == 1,
      set(ui(14),'userdata',k);
      set(ui(3),'userdata',txt2);
   end

   if any(mode == [1,3]),
      if r > 4, set(ele_sld,'vis','on'); end
   end

   set(ui(1),'userdata',ele_mat);

elseif mode == 4, % moving element list
   val = get(ele_sld,'value');
   set(ele_axs,'ylim',[0,1]+val);

      if val == 0 & r <= 4, set(ele_sld,'vis','off'); end

elseif mode == 5, % selecting an element
   cur_obj = gco;
   cur_par = get(cur_obj,'parent');
   colour=get(cur_obj,'color');
   if colour(3)==1, % color is [0 0 1]=blue
      set(get(cur_par,'chil'),'color','k');
      data = get(cur_obj,'userdata');
      set([cur_obj,data(2)],'color','k');
      set(ui(6),'enable','on');
      set(ui(7),'enable','off');
      set([edts,ui(13),cust_edt],'callback','');
      set(ui([4,5,8,9]),'enable','on');
%    set(stat_bar,'string','ADD signal or click on component to EDIT/DELETE');
      return
   end

   set(get(cur_par,'chil'),'color','k');
   data = get(cur_obj,'userdata');
   set([cur_obj,data(2)],'color','b');
   ele_loc = data(1);
   set(ui(14),'userdata',ele_loc);
   set(ui(3),'userdata',cur_obj);
   set(ui(5),'value',ele_mat(ele_loc,6));
   set(ui(6),'enable','off');
   set(ui(7),'enable','on');
   set(ui([4,5,8,9]),'enable','off');
   set(stat_bar,'string','EDIT values & click on component or click DEL to DELETE.');

   if get(ui(10),'userdata') == 1,
      dtsiggui(8,ele_loc);
   elseif get(ui(10),'userdata') == 2,
      convgui(8,ele_loc);
   elseif get(ui(10),'userdata') == 3,
      dtsimgui(8,ele_loc);
   end

 elseif mode == 6, % editing an element

   if length(ele_loc),
         edt = gco;
            edt_st = get(edt,'string');

      if edt==ui(13)
   n_str = get(ui(13),'string');
   if isempty(n_str)
      errordlg('No values entered for signal range.','Input Error');
         set(ui(13),'string',get(ui(13),'userdata'));
      return;
   end
   n_val = eval(['[',n_str,']'],'[]');
   if isempty(n_val)
      errordlg('MATLAB syntax error for signal range.','Input Error');
         set(ui(13),'string',get(ui(13),'userdata'));
      return;
   end
   if length(n_val)~=2
      errordlg('Signal range requires 2 end values.','Input Error');
         set(ui(13),'string',get(ui(13),'userdata'));
      return;
   end
   minn=n_val(1);maxn=n_val(2);
   if minn >= maxn,
      errordlg('Signal range must be entered as  min, max.','Input Error');
         set(ui(13),'string',get(ui(13),'userdata'));
       return;
   end
   if rem(minn,1) |  rem(maxn,1)
      errordlg('Signal range must be entered as integers.','Input Error');
         set(ui(13),'string',get(ui(13),'userdata'));
       return;
   end
      if get(ui(10),'userdata') == 3
      if minn < 0 | maxn < 0,
         errordlg('Signal range must be non-negative (causal)','Input Error');
         ele_vec=ele_mat(ele_loc,:);
         set(ui(13),'string',get(ui(13),'userdata'));
         return;
      end
      end
      end

problem=0;
if ele_typ==2
if edt_st(1)=='W',
edt_st(1)=[];evalin('base',[edt_st ';'],'problem=1;')
if problem==0, edt_st=evalin('base',edt_st);
else
   errordlg('MATLAB Syntax error.','Input Error');
   return
end
end
end



n=[1,2];ttt=0;
if ~isstr(edt_st)
edt_val=edt_st;
else
  eval(['[', edt_st, '];'],'ttt=1;');
     if ttt==1
        errordlg('MATLAB Syntax error.','Input Error');
        return
     end
edt_val = eval(['[', edt_st, ']']);
end


            if ele_typ==2 & ~length(edt_val),
               errordlg('No entry for x[n]!!','Input Error');

             ele_vec = ele_mat(ele_loc,:);
             txt_st = get(ele_vec(1),'userdata');
             set(cust_edt,'string',txt_st);
               return;
            end

          if ele_typ==1
          if edt == ui(18) 
            if isempty(edt_st),
               errordlg('  a must be non-empty and non-zero.','Input Error');
               ele_vec=ele_mat(ele_loc,:);
               set(ui(18),'string',num2str(ele_vec(2)));
               return;
            end
            if edt_val==0,
               errordlg('  a must be non-empty and non-zero.','Input Error');
               ele_vec=ele_mat(ele_loc,:);
               set(ui(18),'string',num2str(ele_vec(2)));
               return;
            end
          end

          if edt==ui(21) & ~isempty(edt_st) 
               if rem(edt_val,1),
               errordlg('  b must be an integer.','Input Error');
               ele_vec=ele_mat(ele_loc,:);
               set(ui(21),'string',num2str(ele_vec(3)));
               return;
               end
          end
          end

      cur_obj = get(ui(3),'userdata');

% obtain local range values
   n_str = get(ui(13),'string');
   if isempty(n_str)
      errordlg('No values entered for signal range.','Input Error');
         set(ui(13),'string',get(ui(13),'userdata'));
      return;
   end
   n_val = eval(['[',n_str,']'],'[]');
   if isempty(n_val)
      errordlg('MATLAB syntax error for signal range.','Input Error');
         set(ui(13),'string',get(ui(13),'userdata'));
      return;
   end
   if length(n_val)~=2
      errordlg('Signal range requires 2 end values.','Input Error');
         set(ui(13),'string',get(ui(13),'userdata'));
      return;
   end
   minn=n_val(1);maxn=n_val(2);
   if minn >= maxn,
      errordlg('Signal range must be entered as  min, max.','Input Error');
         set(ui(13),'string',get(ui(13),'userdata'));
       return;
   end
   if rem(minn,1) |  rem(maxn,1)
      errordlg('Signal range must be entered as integers.','Input Error');
         set(ui(13),'string',get(ui(13),'userdata'));
       return;
   end
      if get(ui(10),'userdata') == 3 
      if minn < 0 | maxn < 0,
         errordlg('Signal range must be non-negative (causal)','Input Error');
         ele_vec=ele_mat(ele_loc,:);
         set(ui(13),'string',get(ui(13),'userdata'));
         return;
      end
      end

      val6 = get(ui(5),'value');
      if val6 ~= 2
         val1 = str2num(get(edts(1),'string'));
      else
         val1 = ele_mat(ele_loc,1);
      end

      val2 = str2num(get(edts(2),'string'));
      val3 = str2num(get(edts(3),'string'));
      val4 = str2num(get(edts(4),'string'));
      val5 = str2num(get(edts(5),'string'));
      val7 = minn;       % min value of range
      val8 = 1;  % step value
      val9 = maxn;       % max value of range

      if ~length(val2), val2 = 0; end
      if ~length(val3), val3 = 0; end
      if ~length(val4), val4 = 0; end
      if ~length(val5), val5 = 0; end

      if val6 == 2

      xn_str = get(cust_edt,'string');
problem=0;if xn_str(1)=='W',
xn_str(1)=[];evalin('base',[xn_str ';'],'problem=1;')
if problem==0, xn_str=evalin('base',xn_str);
%if ~isstr(xn_str), xn_str=num2str(xn_str,15);end
else
   errordlg('MATLAB Syntax error.','Input Error');
   return
end
end


r_str = get(ui(13),'string');
n = eval(['[',r_str,']']);
n = n(1):n(2);
if isstr(xn_str)
      xn_str = ['[',xn_str,']'];
      ttt=0;
          eval([xn_str ';'],'ttt=1;');
          if ttt
             errordlg('Incorrect Matlab Syntax.','Input Error');
             return
          end
          xn_str=eval(xn_str);
end
if length(xn_str) ~= length(n) & length(xn_str) ~= 1
   errordlg('Time and signal arrays have different length.','Input Error');
   return
end

      end
      set(ui(13),'userdata',n_str);


      ele_mat(ele_loc,:) = [val1,val2,val3,val4,val5,val6,val7,val8,val9];

      set(ui(1),'userdata',ele_mat);
      dtsigedt(2,cur_obj);
      dtsigplt(2);

      plot_val = get(ui(10),'userdata');
         if plot_val == 1,
            dtoplt;
         elseif plot_val == 3
            dtsimplt;
         end
   end

elseif mode == 7, % deleting an element
   set(ui(6),'enable','on');
   set(ui(7),'enable','off');
   set(ui([4,5,8,9]),'enable','on');
   set([edts,ui(13),cust_edt],'callback','');

% removing element
   ele_mat(ele_loc,:)=[];
   set(ui(1),'userdata',ele_mat);

   set(stat_bar,'string','Deleting selected signal...');
   dtsigedt(3);
   dtsigplt(2);
   set(stat_bar,'string','Signal deleted.  PRESS Add to UNDO.');

end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -