dw1dtrem.m
上传用户:haiyisale
上传日期:2013-01-09
资源大小:3246k
文件大小:17k
源码类别:

波变换

开发平台:

Matlab

  1. function [out1,out2] = dw1dtrem(option,win_dw1dtool,in3,in4)
  2. %DW1DTREM Discrete Wavelet 1-D tree mode manager.
  3. %   [OUT1,OUT2] = DW1DTREM(OPTION,WIN_DW1DTOOL,IN3,IN4)
  4. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  5. %   Last Revision: 15-Dec-2000.
  6. %   Copyright 1995-2002 The MathWorks, Inc.
  7. %   $Revision: 1.18 $
  8. % MemBloc1 of stored values.
  9. %---------------------------
  10. n_param_anal   = 'DWAn1d_Par_Anal';
  11. ind_sig_name   = 1;
  12. ind_sig_size   = 2;
  13. ind_wav_name   = 3;
  14. ind_lev_anal   = 4;
  15. ind_axe_ref    = 5;
  16. ind_act_option = 6;
  17. ind_ssig_type  = 7;
  18. ind_thr_val    = 8;
  19. nb1_stored     = 8;
  20. % MemBloc4 of stored values.
  21. %---------------------------
  22. n_miscella     = 'DWAn1d_Miscella';
  23. ind_graph_area =  1;
  24. ind_view_mode  =  2;
  25. ind_savepath   =  3;
  26. nb4_stored     =  3;
  27. % Tag property of objects.
  28. %-------------------------
  29. tag_pus_anal = 'Pus_Anal';
  30. tag_axe_sig  = 'Axe_Sig_Tre';
  31. tag_axe_ele  = 'Axe_Ele_Tre';
  32. tag_axe_tre  = 'Axe_Tree_Tre';
  33. tag_axe_txt  = 'Axe_Txt_Tre';
  34. tag_s_tre    = 'S_tre';
  35. tag_ss_tre   = 'SS_Tre';
  36. tag_ele_tre  = 'Ele_Tre';
  37. tag_app      = 'App_Tre';
  38. tag_det      = 'Det_Tre';
  39. axe_handles   = findobj(get(win_dw1dtool,'Children'),'flat','type','axes');
  40. txt_a_handles = findobj(axe_handles,'Type','text');
  41. switch option
  42.     case 'ssig'
  43.         % in3 = chk_handle
  44.         %-----------------
  45.         [flg_s_ss,ccfs] = dw1dvmod('get_vm',win_dw1dtool,5);
  46.         val = get(in3,'Value');
  47.         flg_s_ss(2) = val; 
  48.         dw1dvmod('set_vm',win_dw1dtool,5,flg_s_ss,ccfs);
  49.         ss_tre  = findobj(axe_handles,'Tag',tag_ss_tre);
  50.         if val==0
  51.             set(ss_tre,'Visible','off');
  52.         else
  53.             set(ss_tre,'Visible','on');
  54.         end
  55.         ss_type = wmemtool('rmb',win_dw1dtool,n_param_anal,ind_ssig_type);
  56.         if ss_type=='ss'
  57.             str_plus = 'Synthesized';
  58.         elseif ss_type=='cs'
  59.             str_plus  = 'Compressed';
  60.         elseif ss_type=='ds'
  61.             str_plus  = 'De-noised';
  62.         end
  63.         if val==1
  64.             str_title = ['Signal and ' str_plus ' signal.'];
  65.         else
  66.             str_title = ['Signal'];
  67.         end
  68.         axe_sig = findobj(axe_handles,'flat','Tag',tag_axe_sig);
  69.         axes(axe_sig)
  70.         wtitle(str_title,'Parent',axe_sig);
  71.     case 'view'
  72.         % in3 = old_mode or ...
  73.         % in3 = -1 : same mode
  74.         % in3 =  0 : clean
  75.         %-------------------------
  76.         % in4 = level (optional)
  77.         %-------------------------
  78.         % Get Globals.
  79.         %-------------
  80.         Terminal_Prop = mextglob('get','Terminal_Prop');
  81.         old_mode = in3;
  82.         [Wave_Name,Level_Anal,Signal_Size] = ...
  83.                         wmemtool('rmb',win_dw1dtool,n_param_anal,...
  84.                                 ind_wav_name,ind_lev_anal,ind_sig_size);
  85.         if nargin==3 , level = Level_Anal; else level = in4; end
  86.         [v_flg,ccfs_m] = dw1dvmod('get_vm',win_dw1dtool,5);
  87.         vis_str = getonoff(v_flg);
  88.         v_s  = vis_str(1,:);
  89.         v_ss = vis_str(2,:);
  90.         axe_sig = findobj(axe_handles,'flat','Tag',tag_axe_sig);
  91.         if isempty(axe_sig)
  92.             dw1dtrem('axes',win_dw1dtool);
  93.             axe_handles = findobj(win_dw1dtool,'Type','axes');
  94.             axe_sig = findobj(axe_handles,'flat','Tag',tag_axe_sig);
  95.         end
  96.         axe_ele = findobj(axe_handles,'flat','Tag',tag_axe_ele);
  97.         axe_txt = findobj(axe_handles,'flat','Tag',tag_axe_txt);
  98.         set([axe_sig axe_ele axe_txt],'Visible','On');
  99.         s_tre   = findobj(axe_sig,'Tag',tag_s_tre);
  100.         ss_tre  = findobj(axe_sig,'Tag',tag_ss_tre);
  101.         ele_tre = findobj(axe_ele,'Tag',tag_ele_tre);
  102.         ss_type = wmemtool('rmb',win_dw1dtool,n_param_anal,ind_ssig_type);
  103.         switch ss_type
  104.             case 'ss' , str_plus = 'Synthesized';
  105.             case 'cs' , str_plus = 'Compressed';
  106.             case 'ds' , str_plus = 'De-noised';
  107.         end
  108.         if v_flg(1)==1
  109.             if v_flg(2)==1
  110.                 str_title = ['Signal and ' str_plus ' signal.'];
  111.             else
  112.                 str_title = ['Signal'];
  113.             end
  114.         else
  115.             if v_flg(2)==1
  116.                 str_title = [str_plus ' signal.'];
  117.             else
  118.                 str_title = '';
  119.             end
  120.         end
  121.         if isempty(s_tre)
  122.             [x,ymin,ymax] = dw1dfile('sig',win_dw1dtool,1);
  123.             xmin = 1;  xmax = length(x);
  124.             set(axe_sig,'Xlim',[xmin xmax]);
  125.             col = wtbutils('colors','sig');
  126.             axes(axe_sig);
  127.             line(...
  128.                  'Xdata',[xmin:xmax],...
  129.                  'Ydata',x,...
  130.                  'Color',col,...
  131.                  'Visible',v_s,...
  132.                  'Tag',tag_s_tre,...
  133.                  'Parent',axe_sig);
  134.             set(axe_sig,'Ylim',[ymin ymax]);
  135.         else
  136.             set(s_tre,'Visible',v_s);
  137.         end
  138.         if isempty(ss_tre)
  139.             [x,ymin,ymax] = dw1dfile('ssig',win_dw1dtool,1);
  140.             ylim = get(axe_sig,'Ylim');
  141.             if ylim(1)<ymin , ymin = ylim(1); end
  142.             if ylim(2)>ymax , ymax = ylim(2); end
  143.             col = wtbutils('colors','ssig');
  144.             xmin = 1;  xmax = length(x);
  145.             axes(axe_sig);
  146.             line(...
  147.                  'Xdata',[xmin:xmax],...
  148.                  'Ydata',x,...
  149.                  'Color',col,...
  150.                  'Visible',v_ss,...
  151.                  'Tag',tag_ss_tre,...
  152.                  'Parent',axe_sig);
  153.             set(axe_sig,'Ylim',[ymin,ymax]);
  154.         else
  155.             set(ss_tre,'Visible',v_ss);
  156.         end
  157.         axes(axe_sig)
  158.         wtitle(str_title,'Parent',axe_sig);
  159.         col_app = wtbutils('colors','app',Level_Anal);
  160.         col_det = wtbutils('colors','det',Level_Anal);
  161.         if isempty(ele_tre)
  162.             [x,ymin,ymax] = dw1dfile('app',win_dw1dtool,Level_Anal,3);
  163.             axe = axe_ele;
  164.             axes(axe);
  165.             xmin = 1;  xmax = length(x);
  166.             line(...
  167.                  'Parent',axe,                   ...
  168.                  'Xdata',[xmin:xmax],'Ydata',x,  ...
  169.                  'Color',col_app(Level_Anal,:),  ...
  170.                  'Userdata',Level_Anal,'Tag',tag_ele_tre);
  171.             set(axe,'Ylim',[ymin ymax]);
  172.             wtitle(sprintf(' Approximation at level %d (reconstructed).',Level_Anal),'Parent',axe);
  173.         else
  174.             set(ele_tre,'Visible','on');
  175.         end
  176.         push = findobj(win_dw1dtool,'Style','pushbutton','tag',tag_pus_anal);
  177.         A_or_S = get(push,'String');
  178.         A_or_S = lower(A_or_S(1));
  179.         xdiv = 4;
  180.         ydiv = 12;
  181.         xa   = 1/xdiv;
  182.         xd   = (xdiv-1)/xdiv;
  183.         y    = 1/ydiv;
  184.         dy   = (ydiv-2)/(ydiv*Level_Anal);
  185.         col  = get(axe_txt,'Xcolor');
  186.         lineWidth = 1;
  187.         line(...
  188.              'Parent',axe_txt,               ...
  189.              'Xdata',[xa xa],                ...
  190.              'Ydata',[1/ydiv (ydiv-1)/ydiv], ...
  191.              'LineWidth',lineWidth,          ...
  192.              'Color',col                     ...
  193.              );
  194.         for k = 1:Level_Anal
  195.             line(...
  196.                  'Parent',axe_txt,       ...
  197.                  'Xdata',[xa xd],        ...
  198.                  'Ydata',[y y+dy],       ...
  199.                  'LineWidth',lineWidth,  ...
  200.                  'Color',col             ...
  201.                  );
  202.             y = y+dy;
  203.         end
  204.         
  205.         if A_or_S=='a' , sens = -1; else , sens = 1; end
  206.         y     = 1/ydiv+dy/2;
  207.         lon   = 0.03;
  208.         scaleX = sens*lon;
  209.         scaleY = sens*lon;
  210.         alpha = pi/4;
  211.         theta = pi/2;
  212.         betaP = theta+alpha;
  213.         betaM = theta-alpha;
  214.         for k = 1:Level_Anal
  215.             xx = xa + [0 , scaleX*cos(betaP) , NaN , 0 , scaleX*cos(betaM)]';
  216.             yy = y  + [0 , scaleY*sin(betaP) , NaN , 0 , scaleY*sin(betaM)]';
  217.             line(...
  218.          'Parent',axe_txt,...
  219.          'Xdata',xx,'Ydata',yy,...
  220.          'LineWidth',lineWidth,'Color',col);
  221.             y  = y+dy;
  222.         end
  223.         old_u = get(axe_txt,'Units');
  224.         set(axe_txt,'Units','pixels');
  225.         pos = get(axe_txt,'Position');
  226.         set(axe_txt,'Units',old_u);
  227.         tp  = mextglob('get','Terminal_Prop');
  228.         mul = (tp(1)*pos(3))/(tp(2)*pos(4));
  229.         
  230.         y     = 1/ydiv+dy/2;
  231.         xm    = (xa+xd)/2;
  232.         lon   = 0.02;
  233.         scaleX = 2*sens*lon;
  234.         scaleY = sens*lon;
  235.         alpha = atan(dy/((xd-xa)*mul));
  236.         theta = alpha;
  237.         betaP = theta+alpha;
  238.         betaM = theta-alpha;
  239.         for k = 1:Level_Anal
  240.             xx = xm + [0 , scaleX*cos(betaP) , NaN , 0 , scaleX*cos(betaM)]';
  241.             yy = y  + [0 , scaleY*sin(betaP) , NaN , 0 , scaleY*sin(betaM)]';
  242.             line(...
  243.          'Parent',axe_txt,...
  244.          'Xdata',xx,'Ydata',yy,...
  245.          'LineWidth',lineWidth,'Color',col);
  246.             y = y+dy;
  247.         end
  248.        
  249.         y  = 1/ydiv;
  250.         Ps = [xa;y];
  251.         Pa = [xa*ones(1,Level_Anal) ; y+dy*[1:Level_Anal]];
  252.         Pd = [xd*ones(1,Level_Anal) ; y+dy*[1:Level_Anal]];
  253.         lPts = line(...
  254.                     'Parent',axe_txt,                  ...
  255.                     'Xdata',[Ps(1,:),Pa(1,:),Pd(1,:)], ...
  256.                     'Ydata',[Ps(2,:),Pa(2,:),Pd(2,:)], ...
  257.                     'LineStyle','none', ...
  258.                     'Marker','.',       ...
  259.                     'MarkerSize',28,    ...
  260.                     'Color',col         ...
  261.                     );        
  262.         axes(axe_txt)
  263.         if A_or_S=='a' ,
  264.             wtitle('DWT : Wavelet Tree','Parent',axe_txt);
  265.             sig_nam = 's';
  266.         else
  267.             wtitle('IDWT : Wavelet Tree','Parent',axe_txt);
  268.             sig_nam = 'ss';
  269.         end
  270.         beg_cba = [mfilename '(''select'',' int2str(win_dw1dtool) ','];
  271.         y       = 1/ydiv;
  272.         fontsize = wmachdep('fontsize','normal',6,Level_Anal)+2;
  273.         col     = wtbutils('colors','sig');
  274.         xa = xa-0.5/xdiv;
  275.         xd = xd+0.5/xdiv;
  276.         commonProp = {...
  277.            'Parent',axe_txt,               ...
  278.            'FontWeight','bold',            ...
  279.            'FontSize',fontsize,            ...
  280.            'HorizontalAlignment','center', ...
  281.            'VerticalAlignment','middle',   ...
  282.            'Clipping','on'                 ...
  283.            };
  284.         locProp = {commonProp{:}, ...
  285.                    'String', sig_nam,   ...
  286.                    'Position',[xa y 0], ...
  287.                    'UserData',0,        ...
  288.                    'Color',col,         ...
  289.                    'tag',tag_app        ...
  290.                    };
  291.         txt = text(locProp{:});
  292.         set(txt,'ButtonDownFcn',[beg_cba num2mstr(txt) ');']);
  293.         y = y+dy;
  294.         for k = 1:Level_Anal
  295.             locProp = {commonProp{:}, ...
  296.                        'String',['a' wnsubstr(k)],...
  297.                        'Position',[xa y 0], ...
  298.                        'UserData',k,        ...
  299.                        'Color',col_app(k,:),...
  300.                        'tag',tag_app        ...
  301.                        };
  302.             txt = text(locProp{:});
  303.             set(txt,'ButtonDownFcn',[beg_cba num2mstr(txt) ');']);
  304.             locProp = {commonProp{:}, ...
  305.                        'String',['d' wnsubstr(k)],...
  306.                        'Position',[xd y 0], ...
  307.                        'UserData',k,        ...
  308.                        'Color',col_det(k,:),...
  309.                        'tag',tag_det        ...
  310.                        };
  311.             txt = text(locProp{:});
  312.             set(txt,'ButtonDownFcn',[beg_cba num2mstr(txt) ');']);
  313.             y = y+dy;
  314.         end
  315.         set(axe_txt,'Visible','on')
  316.         % Axes attachment.
  317.         %-----------------
  318.         okNew = dw1dvdrv('test_mode',win_dw1dtool,'tre',old_mode);
  319.         if okNew
  320.             set([axe_sig axe_ele],'Xlim',[1 Signal_Size]);
  321.             dynvtool('init',win_dw1dtool,[],[axe_sig axe_ele],[],[1 0]);
  322.         end
  323.         % Reference axes used by stat. & histo & ...
  324.         %-------------------------------------------
  325.         wmemtool('wmb',win_dw1dtool,n_param_anal,ind_axe_ref,axe_sig);
  326.     case 'axes'
  327.         % in3 = level_view
  328.         %-----------------
  329.         Level_Anal = wmemtool('rmb',win_dw1dtool,n_param_anal,ind_lev_anal);
  330.         if nargin==2 , in3 = Level_Anal; end
  331.         % Axes Positions.
  332.         %----------------
  333.         pos_graph = wmemtool('rmb',win_dw1dtool,n_miscella,ind_graph_area);
  334.         pos_win   = get(win_dw1dtool,'Position');
  335.         win_units = get(win_dw1dtool,'Units');
  336.         bdx    = 0.05*pos_win(3);
  337.         bdy    = 0.06*pos_win(4);
  338.         w_used = pos_graph(3)-3*bdx;
  339.         h_used = pos_graph(4)-2*bdy;
  340.         w_tre  = w_used/3;
  341.         h_tre  = h_used;
  342.         y_tre  = pos_graph(2)+bdy;
  343.         w_sig  = (2*w_used)/3;
  344.         h_sig  = (h_used-2*bdy)/2;
  345.         x_sig  = bdx+w_tre+bdx;
  346.         y_sig  = y_tre+h_sig+2*bdy;
  347.         pos_axe_tre = [bdx y_tre w_tre h_tre];
  348.         pos_axe_ele = [x_sig y_tre w_sig h_sig];
  349.         pos_axe_sig = [x_sig y_sig w_sig h_sig];
  350.         axe_sig = axes(...
  351.                         'Parent',win_dw1dtool,  ...
  352.                         'Units',win_units,      ...
  353.                         'Visible','off',        ...
  354.                         'Position',pos_axe_sig, ...
  355.                         'Nextplot','add',       ...
  356.                         'DrawMode','Fast',      ...
  357.                         'Box','On',             ...
  358.                         'Tag',tag_axe_sig       ...
  359.                         );
  360.         axe_ele = axes(...
  361.                         'Parent',win_dw1dtool,  ...
  362.                         'Units',win_units,      ...
  363.                         'Visible','off',        ...
  364.                         'Position',pos_axe_ele, ...
  365.                         'DrawMode','Fast',      ...
  366.                         'Box','On',             ...
  367.                         'Tag',tag_axe_ele       ...
  368.                         );
  369.         axe_txt = axes(...
  370.                         'Parent',win_dw1dtool,  ...
  371.                         'Units',win_units,      ...
  372.                         'Visible','off',        ...
  373.                         'XLim',[0 1],           ...
  374.                         'YDir','reverse',       ...
  375.                         'YLim',[0 1],           ...
  376.                         'Position',pos_axe_tre, ...
  377.                         'DrawMode','Fast',      ...
  378.                         'Box','On',             ...
  379.                         'Xtick',[],             ...
  380.                         'Ytick',[],             ...
  381.                         'Xticklabel',[],        ...
  382.                         'Yticklabel',[],        ...
  383.                         'Tag',tag_axe_txt       ...
  384.                         );
  385.     case 'select'
  386.         % in3 = txt_handle
  387.         %------------------
  388. selectType = get(win_dw1dtool,'SelectionType');
  389. if ~isequal(selectType,'normal') , return; end
  390.         mousefrm(0,'watch')
  391.         axe_sig = findobj(axe_handles,'flat','Tag',tag_axe_sig);
  392.         axe_ele = findobj(axe_handles,'flat','Tag',tag_axe_ele);
  393.         usr = get(in3,'Userdata');
  394.         col = get(in3,'Color');
  395.         if usr~=0 
  396.             tag = get(in3,'tag');
  397.             if tag==tag_app , app = 1; else , app = 0; end
  398.         end
  399.         delete(get(axe_ele,'Children'));
  400.         if usr==0
  401.             push = findobj(win_dw1dtool,'Style','pushbutton','tag',tag_pus_anal);
  402.             A_or_S  = get(push,'String');
  403.             A_or_S  = lower(A_or_S(1));
  404.             if A_or_S=='a' ,
  405.                 str_title = ['Signal (approximation at level 0).'];
  406.             else
  407.                 str_title = ['Synthesized signal (approximation at level 0).'];
  408.             end
  409.             [x,ymin,ymax] = dw1dfile('sig',win_dw1dtool,1);
  410.         elseif app
  411.             [x,ymin,ymax] = dw1dfile('app',win_dw1dtool,usr,3);
  412.             str_title = sprintf('Approximation at level %d (reconstructed).', usr);
  413.         else
  414.             [x,set_ylim,ymin,ymax] = dw1dfile('det',win_dw1dtool,usr,1);
  415.             str_title = sprintf('Detail at level %d (reconstructed).', usr);
  416.         end
  417.         xlim = get(axe_sig,'Xlim');
  418.         axes(axe_ele);
  419.         xmin = 1; xmax = length(x);
  420.         line(...
  421.              'Xdata',[xmin:xmax],...
  422.              'Ydata',x,...
  423.              'Color',col,...
  424.              'Userdata',usr,...
  425.              'tag',tag_ele_tre,...
  426.              'Parent',axe_ele);
  427.         set(axe_ele,'Xlim',xlim,'Ylim',[ymin ymax]);
  428.         wtitle(str_title,'Parent',axe_ele)
  429.         mousefrm(0,'arrow')
  430.     case 'del_ss'
  431.         lin_handles = findobj(axe_handles,'Type','line');
  432.         ss_sig      = findobj(lin_handles,'Tag',tag_ss_tre);
  433.         delete(ss_sig);
  434.     case 'clear'
  435.         dynvtool('stop',win_dw1dtool);
  436.         axe_sig = findobj(axe_handles,'flat','tag',tag_axe_sig);
  437.         axe_ele = findobj(axe_handles,'flat','Tag',tag_axe_ele);
  438.         axe_txt = findobj(axe_handles,'flat','Tag',tag_axe_txt);
  439.         out1 = [axe_sig axe_ele axe_txt];
  440.         delete(out1);
  441.     otherwise
  442.         errargt(mfilename,'Unknown Option','msg');
  443.         error('*');
  444. end