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

波变换

开发平台:

Matlab

  1. function varargout = demolift(varargin)
  2. %DEMOLIFT Demonstrates Lifting functions in the Wavelet Toolbox.  
  3. %
  4. % This is a slideshow file for use with wshowdrv.m
  5. % To see it run, type 'wshowdrv demolift', 
  6. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 10-Dec-2002.
  7. %   Last Revision: 04-Sep-2003.
  8. %   Copyright 1995-2004 The MathWorks, Inc.
  9. %   $Revision: 1.1.6.3 $  $Date: 2004/04/13 00:39:08 $
  10. % Initialization and Local functions if necessary.
  11. if nargin>0
  12. action = varargin{1};
  13.     switch action
  14.         case 'addHelp'
  15.             % Add Help Item.
  16.             %---------------
  17.             hdlFig = varargin{2};
  18.             wfighelp('addHelpItem',hdlFig,'Wavelet Decomposition','DW1D_DECOMPOS');
  19.             
  20.         case 'auto'    , wshowdrv('#autoMode',mfilename,'close');
  21.         case 'gr_auto' , wshowdrv('#gr_autoMode',mfilename,'close');
  22.         case 'getFigParam'
  23.             figName  = 'Lifting';
  24.             showType = 'mix10';
  25.             varargout = {figName,showType};
  26.             
  27.         case 'initShowViewer'
  28.             figHandle = varargin{2};
  29.             slideData = get(figHandle,'Userdata');
  30.             autoHndl = slideData.autoHndl;
  31.             propAuto = get(autoHndl,{'Units','Position','BackGroundColor'});
  32.             txtBkColor = get(slideData.slitxtHndl,'BackGroundColor');
  33.             pos  = propAuto{2};
  34.             hBtn = pos(4);
  35.             pos(2) = pos(2)-2*hBtn;
  36.             popstr = strvcat('db1','db2');
  37.             txtstr = 'Wavelet';
  38.             propUIC = {'Units',propAuto{1},'Position',pos,'BackGroundColor',txtBkColor};
  39.             slideData.txtLocHandle = uicontrol('Parent',figHandle,...
  40.                 'style','text','String',txtstr,propUIC{:});
  41.             pos(2) = pos(2)-hBtn+hBtn/2;
  42.             propUIC = {'Units',propAuto{1},'Position',pos,'BackGroundColor',propAuto{3}};
  43.             propAuto{2} = pos;
  44.             propUIC{4}  = propAuto{2};
  45.             slideData.popLocHandle = uicontrol('Parent',figHandle,...
  46.                 'style','popupmenu','String',popstr,propUIC{:}, ...
  47.                 'Tag','popWAV','Enable','Off');
  48.             pos(2) = pos(2)-hBtn;
  49.             popstr = strvcat('blocks','bumps','heavy sine','doppler','quadchirp','mishmash');
  50.             txtstr = 'Signal';
  51.             propUIC = {'Units',propAuto{1},'Position',pos,'BackGroundColor',txtBkColor};
  52.             slideData.txtLocHandle(2) = uicontrol('Parent',figHandle,...
  53.                 'style','text','String',txtstr,propUIC{:});
  54.             pos(2) = pos(2)-hBtn+hBtn/2;
  55.             propUIC = {'Units',propAuto{1},'Position',pos,'BackGroundColor',propAuto{3}};
  56.             propAuto{2} = pos;
  57.             propUIC{4}  = propAuto{2};
  58.             slideData.popLocHandle(2) = uicontrol('Parent',figHandle,...
  59.                 'style','popupmenu','String',popstr,propUIC{:}, ...
  60.                 'Tag','popSIG','Enable','Off');
  61.  
  62.             pos(2) = pos(2)-hBtn;
  63.             editstr = '';
  64.             txtstr = 'Nb. Kept Cfs.';
  65.             propUIC = {'Units',propAuto{1},'Position',pos,'BackGroundColor',txtBkColor};
  66.             slideData.txtLocHandle(3) = uicontrol('Parent',figHandle,...
  67.                 'style','text','String',txtstr,propUIC{:});
  68.             pos(2) = pos(2)-hBtn+hBtn/2;
  69.             propUIC = {'Units',propAuto{1},'Position',pos,'BackGroundColor',propAuto{3}};
  70.             pos(4) = pos(4)/2;
  71.             pos(2) = pos(2)+hBtn/2;
  72.             propUIC{4}  = pos;
  73.             edit_CB = ['demolift(''Local_FUN'',''edit_CB'');'];
  74.             slideData.editLocHandle = uicontrol('Parent',figHandle,...
  75.                 'style','edit','String',editstr,propUIC{:},...
  76.                 'Tag','ediCFS','Enable','Off','Callback',edit_CB);
  77.             
  78.             set(figHandle,'Userdata',slideData);
  79.  
  80.         case 'Local_FUN'
  81.             funNAME = varargin{2};
  82.             nbOUT = nargout;
  83.             varargout = cell(1,nbOUT);
  84.             switch nbOUT
  85.                 case 0 , feval(funNAME,varargin{3:end});
  86.                 case 1 , varargout{1} = feval(funNAME,varargin{3:end});
  87.                 case 2 , [varargout{1},varargout{2}] = feval(funNAME,varargin{3:end});    
  88.         end
  89. end
  90. return
  91. end
  92. if nargout<1,
  93.   wshowdrv(mfilename)
  94. else
  95.   idx = 0;
  96.   
  97.   %========== Slide 1 ==========
  98.   idx = idx+1;
  99.   slide(idx).code = {
  100. 'figHandle = gcf;',
  101.     'set(figHandle,''Position'',[240 100 752 612]);'
  102.     'demolift(''Local_FUN'',''set_UI_Graphics'',-1); ',
  103. '' };
  104.   slide(idx).text = {
  105. '',
  106. ' Press the "Start" button to see a demonstration of Lifting tools.',
  107. '',
  108. '',
  109. ' This demo uses Wavelet Toolbox functions.',
  110. ''};
  111.   %========== Slide 2 ==========
  112.   idx = idx+1;
  113.   slide(idx).code = {
  114. 'popWAV = findall(figHandle,''style'',''popupmenu'',''tag'',''popWAV'');',
  115.     'popSIG = findobj(figHandle,''style'',''popupmenu'',''Tag'',''popSIG'');',
  116. 'ediCFS = findobj(figHandle,''style'',''edit'',''Tag'',''ediCFS''); drawnow',
  117. 'set([popWAV,popSIG,ediCFS],''enable'',''Off''); ',
  118. 'set(popWAV,''Value'',1, ''String'',strvcat(''db1'',''db2'')); ',
  119. 'set(ediCFS,''String'',''''); ',
  120.     
  121.     'blanc = '' '';';  
  122.     'S1  = ''LIFTING (1)'';',
  123.     'S2  = ''-----------'';',
  124.     'S3  = blanc;',
  125.     'S4  = '' In the Wavelet Toolbox, the lifting functions are'';',
  126.     'S5  = '' designed to implement the discrete wavelet transform'';',
  127.     'S6  = '' and the inverse discrete wavelet transform using the'';',
  128.     'S7  = '' "LIFTING SCHEME" tool (See W. SWELDENS).'';',
  129.     'S8  = blanc;',
  130.     'S9  = '' The main feature of the Lifting Scheme Tool is that all'';',
  131.     'S10 = '' constructions are derived in the spatial domain. Staying in '';',
  132.     'S11 = '' spatial domain leads to two major advantages:'';',
  133.     'S12 = blanc;',    
  134.     'S13 = ''     1) the machinery of Fourier analysis is not required'';',
  135.     'S14 = ''     2) lifting leads to algorithms that can easily be  '';',
  136.     'S15 = ''        generalized to more complex geometric situations.'';',
  137.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15);',
  138.     'demolift(''Local_FUN'',''set_UI_Graphics'',0);',
  139.     'hdl_UI_Graphics = wtbxappdata(''get'',figHandle,''hdl_UI_Graphics'');',
  140.     'ax = hdl_UI_Graphics.ax ; t = hdl_UI_Graphics.t;',
  141.     'set(t(1),''String'',Infostr,''FontName'',''Courier New'',''FontSize'',10);',
  142. '' };
  143.   slide(idx).text = {
  144.     ' ',    
  145.     '   type: doc lifting',
  146.     ' ',    
  147.     '   or click on the "Info" button ',
  148.     ' ',
  149.     '   to see more information about lifting functions',
  150.   ''};
  151.   slide(idx).info = 'lifting';
  152.   
  153.   %========== Slide 3 ==========
  154.   idx = idx+1;
  155.   slide(idx).code = {
  156.     'S1  = ''LIFTING (2)'';',
  157.     'S2  = ''-----------'';',
  158.     'S3  = blanc;',
  159.     'S4  = '' To implement the discrete wavelet transform, the POLYPHASE'';',
  160.     'S5  = '' technique is used. So the Lifting Wavelet Transform (LWT) may be'';',
  161.     'S6  = '' expressed with ELEMENTARY LIFTING STEPS.'';',
  162.     'S7  = blanc;',
  163.     'S8  = '' There are two types of elementary lifting steps:'';',
  164.     'S9  = ''     "primal" lifting and "dual" lifting'';',
  165.     'S10 = blanc;',
  166.     'S11 = '' This implementation leads to three major advantages: '';',
  167.     'S12 = blanc;',
  168.     'S13 = ''     1) the traditional "well known" wavelets used in the DWT '';',
  169.     'S14 = ''        transform may have one or more "lifted" decompositions'';'
  170.     'S15 = ''     2) the inverse discrete wavelet transform is very easily'';',
  171.     'S16 = ''        computed'';',    
  172.     'S17 = ''     3) "generalized" wavelets can be easily constructed.'';',
  173.     
  174.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17);',
  175.     'set(t(1),''String'',Infostr,''FontName'',''Courier New'',''FontSize'',10);',
  176. '' };
  177.   slide(idx).text = {
  178.     ' ',    
  179.     '   type: doc lifting',
  180.     ' ',    
  181.     '   or click on the "Info" button ',
  182.     ' ',
  183.     '   to see more information about lifting functions',
  184.   ''};
  185.   slide(idx).info = 'lifting';
  186.   
  187.   %========== Slide 4 ==========
  188.   idx = idx+1;
  189.   slide(idx).code = {
  190.     'S1  = ''LIFTING (3)'';',
  191.     'S2  = ''-----------'';',
  192.     'S3  = blanc;',
  193.     'S4  = '' Each elementary lifting step is defined by:'';',
  194.     'S5  = ''     - a TYPE : "primal" (p) or "dual" (d)'';',
  195.     'S6  = ''     - a LAURENT POLYNOMIAL P(z) which defines the coefficients'';',
  196.     'S7  = ''       of the filter associated to the lifting step'';',
  197.     'S8  = blanc;',
  198.     'S9  = '' A LIFTING SCHEME (LS) is a set of elementary lifting steps'';',
  199.     'S10 = '' completed by an information about normalization coefficients.'';',
  200.     'S11 = '' (see W. SWELDENS papers for more information about theory)'';',
  201.     'S12  = blanc;',
  202.     'S13 = '' Example 1: lifting decomposition of DWT for the db1 wavelet '';',
  203.     'bcar = '' '';',
  204.     'LS = liftwave(''db1'');',
  205.     'TMP = displs(LS,''%8.4f''); nbROW = size(TMP,1);',
  206.     'S14 = [bcar(ones(nbROW,12)),TMP];',
  207.     'S15  = blanc;',
  208.     'S16 = '' See next slide for comments ...'';',    
  209.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,blanc,S14,S15,S16);',
  210.     
  211.     'set(t(1),''String'',Infostr,''FontName'',''Courier New'',''FontSize'',10);',
  212. '' };
  213.   slide(idx).text = {
  214.     ' ',    
  215.     '   type: doc lifting',
  216.     ' ',    
  217.     '   or click on the "Info" button ',
  218.     ' ',
  219.     '   to see more information about lifting functions',
  220.   ''};
  221.   slide(idx).info = 'lifting';
  222.  
  223.   %========== Slide 5 ==========
  224.   idx = idx+1;
  225.   slide(idx).code = {
  226.     'S1  = ''LIFTING (3) - continu '';',
  227.     'S2  = ''----------------------'';',
  228.     'S3  = blanc;',
  229.     'S4  = '' Example 2: lifting decomposition of DWT for the wavelet db2'';',
  230.     'bcar = '' '';',
  231.     'LSdb2 = liftwave(''db2'');',
  232.     'PStr = disp(lp(LSdb2{2,2},LSdb2{2,3}));',
  233.     'PStr = demolift(''Local_FUN'',''wlift_str_util'',''replace'',PStr);',
  234.     'TMP = displs(LSdb2,''%8.4f''); nbROW = size(TMP,1);',
  235.     'S5  = [bcar(ones(nbROW,12)),TMP];',
  236.     'S6  = '' The last line contains the normalization coefficients.'';', 
  237.     'S7  = '' In the other lines:'';',
  238.     'S8  = ''    - The third column contains the Laurent Polynomial'';', 
  239.     'S9  = ''      maximal degree.'';', 
  240.     'S10 = ''    - The second column contains the Laurent Polynomial'';',
  241.     'S11 = ''      coefficients. For example in the second line: '';',
  242.     'S12 = [''         P'', PStr ''  ''];',
  243.     'Infostr = strvcat(S1,S2,S3,S4,blanc,S5,S6,S7,blanc,S8,S9,blanc,S10,S11,S12);',
  244.     
  245.     'set(t(1),''String'',Infostr,''FontName'',''Courier New'',''FontSize'',10);',
  246. '' };
  247.   slide(idx).text = {
  248.     ' ',    
  249.     '   type: doc lifting',
  250.     ' ',    
  251.     '   or click on the "Info" button ',
  252.     ' ',
  253.     '   to see more information about lifting functions',
  254.   ''};
  255.   slide(idx).info = 'lifting';
  256.  
  257.   %========== Slide 6 ==========
  258.   idx = idx+1;
  259.   slide(idx).code = {
  260.     'S1  = ''LIFTING (4)'';',
  261.     'S2  = ''------------'';',
  262.     'S4  = '' To implement LIFTING SCHEMES and POLYPHASE techniques'';',
  263.     'S5  = '' the Wavelet Toobox needs two types of object:'';',
  264.     'S7  = ''    - LP Object to manage Laurent Polynomials.'';',
  265.     'S8  = ''    - LM Object to manage Laurent Matrices.'';',
  266.     'S10 = '' The last one is used in particular for the Factorization'';',
  267.     'S11 = '' Algorithm of "usual" wavelets.'';',
  268.     'Infostr = strvcat(S1,S2,blanc,S4,S5,blanc,S7,blanc,S8,blanc,S10,S11);',
  269.     
  270.     'set(t(1),''String'',Infostr,''FontName'',''Courier New'',''FontSize'',10);',
  271. '' };
  272.   slide(idx).text = {
  273.     ' ',    
  274.     '   type: doc lifting',
  275.     ' ',    
  276.     '   or click on the "Info" button ',
  277.     ' ',
  278.     '   to see more information about lifting functions',
  279.   ''};
  280.   slide(idx).info = 'lifting';
  281.   
  282.   %========== Slide 7 ==========
  283.   idx = idx+1;
  284.   slide(idx).code = {
  285.     'S1  = ''LIFTING (5): lp OBJECT'';',
  286.     'S2  = ''-------------------------'';',
  287.     'HelpSTR = help(''lp'');',
  288.     'HelpSTR = demolift(''Local_FUN'',''wlift_str_util'',''replacePOW'',HelpSTR);',
  289.     'Infostr = strvcat(S1,S2,HelpSTR);',
  290.     'set(t(1),''String'',Infostr,''FontName'',''Courier New'',''FontSize'',9);',
  291. '' };
  292.   slide(idx).text = {
  293.     ' ',    
  294.     '   type: doc lp',
  295.     ' ',    
  296.     '   or click on the "Info" button ',
  297.     ' ',
  298.     '   to see more information about lp OBJECT',
  299.   ''};
  300.   slide(idx).info = 'lp'; 
  301.   
  302.   %========== Slide 8 ==========
  303.   idx = idx+1;
  304.   slide(idx).code = {
  305.     'S1  = ''LIFTING (6): lm OBJECT'';',
  306.     'S2  = ''-------------------------'';',
  307.     'HelpSTR = help(''lm'');',
  308.     'HelpSTR = demolift(''Local_FUN'',''wlift_str_util'',''replacePOW'',HelpSTR);',
  309.     'Infostr = strvcat(S1,S2,HelpSTR);',
  310.     'set(t(1),''String'',Infostr,''FontName'',''Courier New'',''FontSize'',10);',
  311. '' };
  312.   slide(idx).text = {
  313.     ' ',    
  314.     '   type: doc lm',
  315.     '   ',    
  316.     '   or click on the "Info" button ',
  317.     '   ',
  318.     '   to see more information about lm OBJECT',
  319.   ''};
  320.   slide(idx).info = 'lm';
  321.   
  322.   %========== Slide 9 ==========
  323.   idx = idx+1;
  324.   slide(idx).code = {
  325.   'set(popWAV,''enable'',''off'');',
  326.       
  327.     'S1  = ''LIFTING (7): MAIN LIFTING FUNCTIONS'';',
  328.     'S2  = ''-----------------------------------'';',
  329.     'S3  = blanc;',
  330.     
  331.     'S4  = ''addlift   - Adding lifting and dual-lifting steps.'';', 
  332.     'S5  = ''bswfun    - Biorthogonal scaling and wavelet functions.'';', 
  333.     'S6  = ''displs    - Display lifting scheme.'';',
  334.     'S7  = ''filt2ls   - Filters to lifting scheme.'';',
  335.     'S8  = ''ilwt      - Wavelet reconstruction 1-D using lifting.'';',
  336.     'S9  = ''ilwt2     - Wavelet reconstruction 2-D using lifting.'';',
  337.     'S10 = ''liftfilt  - Apply elementary lifting steps on filters.'';', 
  338.     'S11 = ''liftwave  - Lifting structure for wavelets.'';',
  339.     'S12 = ''lsinfo    - Information about lifting schemes.'';',
  340.     'S13 = ''lwt       - Wavelet decomposition 1-D using lifting.'';',
  341.     'S14 = ''lwt2      - Wavelet decomposition 2-D using lifting.'';',
  342.     'S15 = ''lwtcoef   - Extract or reconstruct 1-D wavelet coefficients.'';',
  343.     'S16 = ''lwtcoef2  - Extract or reconstruct 2-D wavelet coefficients.'';',
  344.     'S17 = ''wave2lp   - Laurent polynomial associated to a wavelet.'';',
  345.     'S18 = ''wavenames - Wavelet names information.'';',
  346.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,S18);',
  347.     
  348.     'set(t(1),''String'',Infostr,''FontName'',''Courier New'',''FontSize'',10);',
  349. '' };
  350.     
  351.   slide(idx).text = {
  352.     ' ',    
  353.     '   type: doc lifting',
  354.     ' ',    
  355.     '   or click on the "Info" button ',
  356.     ' ',
  357.     '   to see more information about lifting functions',
  358.   ''};
  359.   slide(idx).info = 'lifting';
  360.   
  361.   %========== Slide 10 ==========
  362.   idx = idx+1;
  363.   slide(idx).code = {
  364. 'set(popWAV,''enable'',''On'');',
  365.     
  366.     'S1  = ''LIFTING (8): FILTERS and POLYNOMIALS ...'';',
  367.     'S2  = ''----------------------------------------'';',
  368.     'S3  = blanc;',
  369.     'S4  = '' Choose the Wavelet (db1 or db2) with the popupMenu'';',
  370.     'S5  = '' on the right part of the window.'';',
  371.     
  372.     'Infostr = strvcat(S1,S2,S3,S4,S5);',
  373.     'set(t(1),''String'',Infostr);',
  374.     'demolift(''Local_FUN'',''set_UI_Graphics'',0);', 
  375. '' };
  376.   slide(idx).text = {
  377.     ' ',    
  378.     '   type: doc lifting',
  379.     ' ',    
  380.     '   or click on the "Info" button ',
  381.     ' ',
  382.     '   to see more information about lifting functions',
  383.   ''};
  384.   slide(idx).info = 'lifting';
  385.   %========== Slide 11 ==========
  386.   idx = idx+1;
  387.   slide(idx).code = {
  388.   'set(popWAV,''enable'',''off'');',
  389. 'lstWAV = get(popWAV,''String''); idxWAV = get(popWAV,''Value'');',
  390. 'wname = deblankl(lstWAV(idxWAV,:));',
  391. 'comma = char(39);',
  392. 'newTXT = [''        wname = '',comma,wname,comma,'';''];';
  393. 'wshowdrv(''#modify_Comment'',figHandle,3,newTXT);',
  394.     'W = load(wname);',
  395.     'F = sqrt(2)*W.(wname);',
  396.     'FStr =  [ ''F = ['' num2str(F,4) '']'' ];',
  397.     
  398.     'S1  = ''LIFTING (9): FILTERS and POLYNOMIALS ...'';',
  399.     'S2  = ''----------------------------------------'';',
  400.     'S3  = blanc;',
  401.     'S4  = FStr;',
  402.     'Infostr = strvcat(S1,S2,S3,S4);', 
  403.     
  404.     'set(t(1),''String'',Infostr);',
  405.     'demolift(''Local_FUN'',''set_UI_Graphics'',0);', 
  406. '' };
  407.   slide(idx).text = {
  408. ' % Load wavelet filter.',
  409. '',
  410. '        wname = ''db1'';',
  411. '        load(wname);',
  412. '',
  413. ' % Compute the associated normalized filter F.',
  414.     '',
  415.     '        F = sqrt(2)*wname;',
  416. ''};
  417.   slide(idx).info = 'lifting';
  418.   %========== Slide 12 ==========
  419.   idx = idx+1;
  420.   slide(idx).code = {
  421.     'H = lp(F);',
  422.     'HStr = disp(H);',
  423.     'HStr = demolift(''Local_FUN'',''wlift_str_util'',''replace'',HStr);',
  424.     'S1  = ''LIFTING (10): FILTERS and POLYNOMIALS ...'';',
  425.     'S2  = ''-----------------------------------------'';',    
  426.     'S3  = blanc;',
  427.     'S4  = FStr;',
  428.     'S5  = blanc;',
  429.     'S6  = HStr;',
  430.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6);', 
  431.     
  432. 'set(t(1),''String'',Infostr);',
  433. '' };
  434.   slide(idx).text = {
  435. ' % Compute the associated reconstruction low-pass',
  436.     ' % Laurent polynomial H.',
  437. '',
  438.   '        H = lp(F);',
  439. ''};
  440.   slide(idx).info = 'lp';
  441.   
  442. %   %========== Slide 13 ==========
  443.   idx = idx+1;
  444.   slide(idx).code = {
  445.     'G = lp(1,-1)*modulate(reflect(H));',
  446.     'GStr = disp(G);',
  447.     'GStr = demolift(''Local_FUN'',''wlift_str_util'',''replace'',GStr);',
  448.     
  449.     'S1  = ''LIFTING (11): FILTERS and POLYNOMIALS ...'';',
  450.     'S2  = ''-----------------------------------------'';',
  451.     'S3  = blanc;',
  452.     'S4  = FStr;',
  453.     'S5  = HStr;',
  454.     'S6  = blanc;',
  455.     'S7  = GStr;',
  456.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7);', 
  457.     
  458. 'set(t(1),''String'',Infostr);',
  459. '' };
  460.   slide(idx).text = {
  461. ' % Compute the associated reconstruction high-pass',
  462.     ' % Laurent polynomial G.',
  463. '',
  464.   '        G = lp(1,-1)*modulate(reflect(H));',
  465. ''};
  466.   slide(idx).info = 'lp/modulate';
  467.   
  468.   %========== Slide 14 ==========
  469.   idx = idx+1;
  470.   slide(idx).code = {
  471.     'E_H = even(H); H_EvenPart = disp(E_H);',
  472.     'O_H = odd(H);  H_OddPart  = disp(O_H);',
  473.     'H_EvenPart = demolift(''Local_FUN'',''wlift_str_util'',''replace'',H_EvenPart);',
  474.     'H_OddPart  = demolift(''Local_FUN'',''wlift_str_util'',''replace'',H_OddPart);',
  475.   
  476.     'S1  = ''LIFTING (12): FILTERS and POLYNOMIALS ...'';',
  477.     'S2  = ''-----------------------------------------'';',
  478.     'S3  = blanc;',
  479.     'S4  = FStr;',
  480.     'S5  = HStr;',
  481.     'S6  = GStr;',
  482.     'S7  = blanc;',
  483.     'S8  = H_EvenPart;',
  484.     'S9  = H_OddPart;',
  485.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9);', 
  486.     
  487. 'set(t(1),''String'',Infostr);',
  488. '' };
  489.   slide(idx).text = {
  490. ' % Compute the even and odd parts of H ...',
  491. '',
  492.   '        E_H = even(H);',
  493.     '        O_H = odd(H); ',
  494. ''};
  495.   slide(idx).info = 'lp/even';
  496.   %========== Slide 15 ==========
  497.   idx = idx+1;
  498.   slide(idx).code = {
  499.     'E_G = even(G); G_EvenPart = disp(E_G);',
  500.     'O_G = odd(G);  G_OddPart  = disp(O_G);',
  501.     'G_EvenPart = demolift(''Local_FUN'',''wlift_str_util'',''replace'',G_EvenPart);',
  502.     'G_OddPart  = demolift(''Local_FUN'',''wlift_str_util'',''replace'',G_OddPart);',
  503.     
  504.     'S1  = ''LIFTING (13): FILTERS and POLYNOMIALS ...'';',
  505.     'S2  = ''-----------------------------------------'';',
  506.     'S3  = blanc;',
  507.     'S4  = FStr;',
  508.     'S5  = HStr;',
  509.     'S6  = GStr;',
  510.     'S7  = blanc;',
  511.     'tmpSTR_E = strvcat(H_EvenPart,G_EvenPart);',
  512.     'tmpSTR_O = strvcat(H_OddPart,G_OddPart);',
  513.     'tmpSTR_EO = [tmpSTR_E , bcar(ones(2,8)) , tmpSTR_O];';
  514.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,tmpSTR_EO);', 
  515.     
  516. 'set(t(1),''String'',Infostr);',
  517. '' };
  518.   slide(idx).text = {
  519. ' % Compute the even and odd parts of G ...',
  520. '',
  521.   '        E_G = even(G);',
  522.     '        O_G = odd(G); ',
  523. ''};
  524.   slide(idx).info = 'lp/odd';
  525.   %========== Slide 16 ==========
  526.   idx = idx+1;
  527.   slide(idx).code = {
  528.     'S1  = ''LIFTING (14): FILTERS and POLYNOMIALS ...'';',
  529.     'S2  = ''-----------------------------------------'';',
  530.     'S3  = blanc;',
  531.     'S4  = FStr;',
  532.     'S5  = HStr;',
  533.     'S6  = GStr;',
  534.     'S7  = blanc;',
  535.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,tmpSTR_EO);', 
  536.     
  537. 'set(t(1),''String'',Infostr);',
  538. '' };
  539.   slide(idx).text = {
  540. ' % Now we have the even and odd parts of H and G.',
  541. ' % So we can built the Polyphase Matrix.',
  542.   '',
  543.   '        |  E_H    E_G  | ',
  544.     '        |  O_H    O_G  | ',
  545. ''};
  546.   slide(idx).info = 'lp/ppm';
  547.   %========== Slide 17 ==========
  548.   idx = idx+1;
  549.   slide(idx).code = {
  550.     'PolyMAT = ppm(H,G);',
  551.     'M_dispSTR = disp(PolyMAT);',
  552.     
  553.     'S1  = ''LIFTING (15): POLYPHASE MATRIX ...'';',
  554.     'S2  = ''----------------------------------'';',
  555.     'S3  = blanc;',
  556.     'S4  = M_dispSTR;',
  557.     'if isequal(wname,''db2''),',
  558.     '   S4  = demolift(''Local_FUN'',''wlift_str_util'',''replaceMAT'',S4);',
  559.     'end',
  560.     
  561.     'Infostr = strvcat(S1,S2,S3,S4);', 
  562.     
  563. 'set(t(1),''String'',Infostr);',
  564. '' };
  565.   slide(idx).text = {
  566. ' % Compute the associated polyphase matrix: PolyMAT',
  567. '',
  568.   '        PolyMAT = ppm(H,G);',
  569. ''};
  570.   slide(idx).info = 'lp/ppm';
  571.   %========== Slide 18 ==========
  572.   idx = idx+1;
  573.   slide(idx).code = {
  574.     'MatFACT = ppmfact(H,G);',
  575.     'DEC = MatFACT{1}; tmpSTR = [];',
  576.     'for j = 1:length(DEC), ',
  577.     '    tmp{j} = disp(DEC{j},''M''); tmp{j}(:,[1:4]) = '' '';',
  578.     '    if isequal(wname,''db2'')',
  579.     '        tmp{j}(2:3,:) = [];',
  580.     '        tmp{j} = demolift(''Local_FUN'',''wlift_str_util'',''replaceMAT_2'',tmp{j});',    
  581.     '    end',
  582.     'end',
  583.     'if isequal(wname,''db2'')',
  584.     '   tmpSTR = strvcat([tmp{1},tmp{2}],'' '','' '',[tmp{3},tmp{4}]);',
  585.     '   interSTR = ''none'';',    
  586.     'else',
  587.     '   for j = 1:length(DEC), tmpSTR = [tmpSTR , tmp{j}]; end',
  588.     '   interSTR = ''tex'';',
  589.     'end',
  590.     
  591.     'S1  = ''LIFTING (16): POLYPHASE MATRIX DECOMPOSITION'';',
  592.     'S2  = ''--------------------------------------------'';',
  593.     'S3  = blanc;',
  594.     'S4  = '' The polyphase matrix may be decomposed in '';',
  595.     'S5  = '' elementary lifting steps matrices:'';',
  596.     'S6  = blanc;',
  597.     'S7  = tmpSTR;',
  598.     'S8  = blanc;',
  599.     'S9  = '' The last matrix is devoted to a normalization operation.'';',
  600.     
  601.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9);', 
  602.     
  603. 'set(t(1),''Interpreter'',interSTR,''String'',Infostr);',
  604. '' };
  605.   slide(idx).text = {
  606. ' % Compute Matrix decomposition(s) ...',
  607. '',
  608.   '        MatFACT = ppmfact(H,G);',
  609. ''};
  610.   slide(idx).info = 'lp/ppmfact';
  611.   %========== Slide 19 ==========
  612.   idx = idx+1;
  613.   slide(idx).code = {
  614.     '[LS_d,LS_p] = pmf2ls(MatFACT,''t''); LSd = LS_d{1}; LSp = LS_p{1};',
  615.     'LS_d_STR  = displs(LSd,''%8.4f'');',
  616.     'bcar = '' '';',
  617.     'nbROW = size(LS_d_STR,1);',
  618.     'LS_d_STR = [bcar(ones(nbROW,4)),LS_d_STR];',
  619.     'LS_p_STR  = displs(LSp,''%8.4f''); ',
  620.     'bcar = '' '';',
  621.     'nbROW = size(LS_p_STR,1);',
  622.     'LS_p_STR = [bcar(ones(nbROW,4)),LS_p_STR];',
  623.     
  624.     'S1  = ''LIFTING (17): POLYPHASE MATRIX DECOMPOSITION'';',
  625.     'S2  = ''--------------------------------------------'';',
  626.     'S3  = blanc;',
  627.     'S4  = ''Now we can build the Lifting Scheme(s) associated'';',
  628.     'S5  = ''with the previous decomposition:'';',
  629.     'S6  = blanc;',
  630.     'S7  = LS_d_STR;',
  631.     'S8  = ''  or '';',
  632.     'S9  = blanc;',
  633.     'S10  = LS_p_STR;',
  634.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10);', 
  635.     
  636. 'set(t(1),''Interpreter'',''tex'',''FontSize'',10,''String'',Infostr);',
  637. '' };
  638.   slide(idx).text = {
  639. ' % Computing and Viewing lifting schemes table ...',
  640. '',
  641.   '        [LS_d,LS_p] = pmf2ls(MatFACT,''t'');',
  642. ''};
  643.   slide(idx).info = 'pmf2ls';
  644.   %========== Slide 20 ==========
  645.   idx = idx+1;
  646.   slide(idx).code = {
  647.     'LS = liftwave(wname);',
  648.     'LS_STR  = displs(LS,''%8.4f'');',
  649.     'bcar = '' '';',
  650.     'nbROW = size(LS_STR,1);',
  651.     'LS_STR = [bcar(ones(nbROW,4)),LS_STR];',
  652.     'S1  = ''LIFTING (18): LIFTING SCHEME'';',
  653.     'S2  = ''----------------------------'';',
  654.     'S3  = blanc;',
  655.     'S4  = ''For "classical" wavelets we can obtain directly '';',
  656.     'S5  = ''the associated Lifting Scheme using the LIFTWAVE function:'';',
  657.     'S6  = blanc;',
  658.     'S7  = ''   LS = liftwave(wname);'';',
  659.     'S8  = blanc;',    
  660.     'S9  = ''So we get:'';',
  661.     'S10  = blanc;',
  662.     'S11 = LS_STR;',
  663.     
  664.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11);',
  665.     
  666. 'set(t(1),''FontSize'',10,''String'',Infostr);',
  667.     'demolift(''Local_FUN'',''set_UI_Graphics'',0);',
  668.     
  669. '' };
  670.   slide(idx).text = {
  671. ' % Compute the lifting scheme  ...',
  672. '',
  673.   '        ',
  674. ''};
  675.   slide(idx).info = 'liftwave';
  676.   %========== Slide 21 ==========
  677.   idx = idx+1;
  678.   slide(idx).code = {
  679.     'popstr = strvcat(''db1'',''db2'');',
  680.     'set(popWAV,''String'',popstr,''Value'',idxWAV)',      
  681.     'LS = liftwave(wname);',
  682.     
  683.     'demolift(''Local_FUN'',''set_UI_Graphics'',1);',
  684.     'demolift(''Local_FUN'',''plot_phi_psi'',LS,ax);', 
  685. '' };
  686.   slide(idx).text = {
  687. ' % Viewing Scaling function and Wavelet ... ',
  688. '',
  689.   '        ',
  690. ''};
  691.   slide(idx).info = 'liftwave';
  692.   
  693.   %========== Slide 22 ==========
  694.   idx = idx+1;
  695.   slide(idx).code = {
  696.     'liftSTEP = {''p'' , [-1 2 -1]/4 , [1] };',
  697.     'LSnew_1 = addlift(LS,liftSTEP);',
  698.     'LS_STR = displs(LSnew_1,''%8.4f'');',
  699.     'bcar = '' '';',
  700.     'nbROW = size(LS_STR,1);',
  701.     'LS_STR = [bcar(ones(nbROW,4)),LS_STR];',
  702.     
  703.     'newWAV = [wname ''_LS1''];',
  704.     'popstr = strvcat(''db1'',''db2'',newWAV);',
  705.     'set(popWAV,''String'',popstr,''Value'',3)',
  706.     
  707.     'S1  = ''LIFTING (19): LIFTING SCHEME'';',
  708.     'S2  = ''----------------------------'';',
  709.     'S3  = blanc;',
  710.     'S4  = ''Compute a new Lifting Scheme adding a new '';',
  711.     'S5  = ''elementary lifting step:'';',
  712.     'S6  = blanc;',
  713.     'S7  = LS_STR(end-2,:);',
  714.     'S8  = blanc;',    
  715.     'S9  = ''So we get:'';',
  716.     'S10 = blanc;',
  717.     'S11 = LS_STR;',
  718.     'S12 = blanc;',
  719.     'S13 = ''Plot the new "Scaling function" and "Wavelet".'';', 
  720.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13);',
  721.     
  722. 'set(t(1),''FontSize'',10,''String'',Infostr);',
  723.     'demolift(''Local_FUN'',''set_UI_Graphics'',0);', 
  724. '' };
  725.   slide(idx).text = {
  726. ' % Viewing a new Lifting Scheme ... ',
  727.   ' ',
  728. ' '};
  729.   slide(idx).info = 'addlift';
  730.   
  731.   %========== Slide 23 ==========
  732.   idx = idx+1;
  733.   slide(idx).code = {
  734.     'demolift(''Local_FUN'',''set_UI_Graphics'',1);', 
  735.     'demolift(''Local_FUN'',''plot_phi_psi'',LSnew_1,ax);', 
  736. '' };
  737.   slide(idx).text = {
  738. ' % Viewing new Scaling function and new Wavelet ... ',
  739.   ' ',
  740. ' '};
  741.   slide(idx).info = 'addlift';
  742.   %========== Slide 24 ==========
  743.   idx = idx+1;
  744.   slide(idx).code = {
  745.     'liftSTEP = { ''p'' , [3 2 1 7 -1 2 -1]/4  ,  [1] };',   
  746.     'LSnew_2 = addlift(LS,liftSTEP);',
  747.     'LS_STR = displs(LSnew_2,''%6.2f'');',
  748.     'bcar = '' '';',
  749.     'nbROW = size(LS_STR,1);',
  750.     'LS_STR = [bcar(ones(nbROW,4)),LS_STR];',
  751.     
  752.     'Lift_1 = [wname ''_LS1'']; Lift_2 = [wname ''_LS2''];',
  753.     'popstr = strvcat(''db1'',''db2'',Lift_1,Lift_2);',
  754.     'set(popWAV,''String'',popstr,''Value'',4)',    
  755.     
  756.     'S1  = ''LIFTING (20): LIFTING SCHEME'';',
  757.     'S2  = ''----------------------------'';',
  758.     'S3  = blanc;',
  759.     'S4  = ''Compute a new Lifting Scheme adding a new '';',
  760.     'S5  = ''elementary lifting step:'';',
  761.     'S6  = blanc;',
  762.     'S7  = LS_STR(end-2,:);',
  763.     'S8  = blanc;',    
  764.     'S9  = ''So we get:'';',
  765.     'S10 = blanc;',
  766.     'S11 = LS_STR;',
  767.     'S12 = blanc;',
  768.     'S13 = ''Plot the new "Scaling function" and "Wavelet".'';', 
  769.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13);',
  770.     
  771. 'set(t(1),''FontSize'',10,''String'',Infostr);',
  772.     'demolift(''Local_FUN'',''set_UI_Graphics'',0);', 
  773. '' };
  774.   slide(idx).text = {
  775. ' % Viewing a new Lifting Scheme ... ',
  776.   ' ',
  777. ' '};
  778.   slide(idx).info = 'addlift';
  779.   
  780.   %========== Slide 25 ==========
  781.   idx = idx+1;
  782.   slide(idx).code = {
  783.     'set([popWAV,popSIG],''Enable'',''Off'')',  
  784.     
  785.     'demolift(''Local_FUN'',''set_UI_Graphics'',1);', 
  786.     'demolift(''Local_FUN'',''plot_phi_psi'',LSnew_2,ax);', 
  787. '' };
  788.   slide(idx).text = {
  789. ' % Viewing new "Scaling function" and new "Wavelet" ... ',
  790.     ' ',    
  791.   '   This is not a wavelet in the usal sense since:'
  792.     ' ',    
  793.     '       mean(PSI) is not zero ! ',
  794.     ' ',
  795. ' '};
  796.   slide(idx).info = 'addlift';
  797.     
  798.   %========== Slide 26 ==========
  799.   idx = idx+1;
  800.   slide(idx).code = {
  801.     'set([popWAV,popSIG],''Enable'',''On'')',
  802.     
  803.     'S1  = ''LIFTING (21): ANALYSIS'';',
  804.     'S2  = ''----------------------'';',
  805.     'S3  = blanc;',
  806.     'S4  = ''Choose the SIGNAL to analyze and the WAVELET using '';',
  807.     'S5  = ''the popupmenus in the right part of the window.'';',
  808.     'S6  = blanc;',
  809.     'S7  = ''The LEVEL of decomposition is 5.'';',    
  810.     'S8  = blanc;',
  811.     'S9  = ''Then Press the "Next" button to perform the analysis.'';',
  812.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9);',
  813.     
  814. 'set(t(1),''FontSize'',10,''String'',Infostr);',
  815.     'demolift(''Local_FUN'',''set_UI_Graphics'',0);', 
  816. '' };
  817.   slide(idx).text = {
  818. ' % Analysis with a Lifting Scheme ... ',
  819.   ' ',
  820. ' '};
  821.   slide(idx).info = 'addlift';
  822.   
  823.   %========== Slide 27 ==========
  824.   idx = idx+1;
  825.   slide(idx).code = {
  826.     'set([popWAV,popSIG],''Enable'',''Off'')',
  827. 'lstSIG = get(popSIG,''String''); idxSIG = get(popSIG,''Value'');',
  828. 'sigNAM = deblankl(lstSIG(idxSIG,:));',
  829. 'idxWAV = get(popWAV,''Value'');',
  830.     'switch idxWAV ',
  831.     '    case {1,2} , LSnew = LS;',
  832.     '    case 3     , LSnew = LSnew_1;',
  833.     '    case 4     , LSnew = LSnew_2;',
  834.     'end', 
  835.     'x  = wnoise(sigNAM,10); level = 5;',
  836. 'lx = length(x);',
  837. 'xDEC = lwt(x,LSnew,level);',
  838. 'a = zeros(level,lx);',
  839. 'd = zeros(level,lx);',
  840.     'for k = 1:level',
  841.        'a(k,:) = lwtcoef(''a'',xDEC,LSnew,level,k);',
  842.        'd(k,:) = lwtcoef(''d'',xDEC,LSnew,level,k);' ,
  843.     'end',
  844.     'demolift(''Local_FUN'',''set_UI_Graphics'',2);',
  845.     'demolift(''Local_FUN'',''plot_ANALYSIS'',x,a,d,1,ax(4:6));',
  846.     'demolift(''Local_FUN'',''store_ANALYSIS'',x,xDEC,LSnew,level,ax(4:7),lx,''1D'');',
  847.     
  848. '' };
  849.   slide(idx).text = {
  850. ' % Compute the decomposition at level 5.',
  851.   ' ',
  852. '       xDEC = lwt(x,LSnew,level);',
  853. '       a = zeros(level,lx);',
  854. '       d = zeros(level,lx);',
  855.     '       for k = 1:level',
  856.     '           a(k,:) = lwtcoef(''a'',xDEC,LSnew,level,k);',
  857.     '           d(k,:) = lwtcoef(''d'',xDEC,LSnew,level,k);' ,
  858.     '       end',
  859.    ' ',   
  860. ' % And view the decomposition at level 1.',
  861.   ' ',
  862. ' '};
  863.   slide(idx).info = 'lwtcoef';
  864.   
  865.   %========== Slide 28 ==========
  866.   idx = idx+1;
  867.   slide(idx).code = {
  868.     'errorSTR = [];',
  869.     'for k = 1:level,',
  870.       'er = x-a(k,:);',
  871.       'for j=1:k , er = er-d(j,:); end',
  872.       'err(k) = max(abs(er));',
  873.       'errLEV = [''    level:'' int2str(k) '' - error = '' num2str(err(k))];',
  874.       'errorSTR = strvcat(errorSTR,errLEV);',
  875.     'end',
  876.     
  877. 'wshowdrv(''#modify_Comment'',figHandle,9,errorSTR);',
  878. 'set(popSIG,''enable'',''off'');',      
  879.     'demolift(''Local_FUN'',''set_UI_Graphics'',3);',
  880.     'demolift(''Local_FUN'',''plot_ANALYSIS'',x,a,d,2,ax(4:7));', 
  881. '' };
  882.   slide(idx).text = {
  883. ' % View the decomposition at level 2.',
  884.   ' ',
  885.   ' % S = A1 + D1 = A2 + D2 + D1 = A3 + D3 + D2 + D1 ...',
  886.   ' ',
  887.   ' % err_Level_1 = max( | S - A1 - D1 | )',
  888.   ' % err_Level_2 = max( | S - A1 - D1 - D2 | )',
  889.   ' % ...',
  890.   ' ',
  891.   ' ',    
  892. ' '};
  893.   slide(idx).info = 'lwtcoef';
  894.   
  895.   %========== Slide 29 ==========
  896.   idx = idx+1;
  897.   slide(idx).code = {
  898.     'set(ediCFS,''String'','' '',''Enable'',''Off'');',      
  899. 'wshowdrv(''#modify_Comment'',figHandle,3,errorSTR);',      
  900.     'demolift(''Local_FUN'',''set_UI_Graphics'',4);', 
  901.     'demolift(''Local_FUN'',''plot_ANALYSIS'',x,a,d,3,ax(4:8));',        
  902. '' };
  903.   slide(idx).text = {
  904. ' % View the decomposition at level 3.',
  905.   ' ',
  906.   ' ',    
  907. ' '};
  908.   slide(idx).info = 'addlift';
  909.   
  910.   %========== Slide 30 ==========
  911.   idx = idx+1;
  912.   slide(idx).code = {
  913. 'keptCFSMAX = length(x);',
  914. 'set(ediCFS,''String'',int2str(keptCFSMAX),''Enable'',''On'');',
  915.     'demolift(''Local_FUN'',''set_UI_Graphics'',5);', 
  916.     'demolift(''Local_FUN'',''plot_DECOMP'',x,xDEC,LSnew,level,ax(4:7),keptCFSMAX,''1D'');',
  917. '' };
  918.   slide(idx).text = {
  919.   ' ',      
  920. '   Choose the number of kept coefficients in the edit.',
  921.     ' ',
  922.   '   Then:' , 
  923.   '              Press the "Enter" key to execute the edit button callback.' , 
  924.   '   Or:',    
  925.   '              Press the "Next" button.',
  926. ' '};
  927.   slide(idx).info = 'addlift';
  928.   
  929.   %========== Slide 31 ==========
  930.   idx = idx+1;
  931.   slide(idx).code = {
  932.     'img = findall(ax(4:7),''type'',''image''); delete(img);',
  933.     'keptDEF = 10;',
  934.     'keptCFS = str2num(get(ediCFS,''String''));',
  935.     ['if isempty(keptCFS) | keptCFS<0 | keptCFSMAX<keptCFS | keptCFS~=fix(keptCFS)' ...
  936.            ' , keptCFS = keptDEF; end'],
  937. 'set(ediCFS,''String'',int2str(keptCFS));',      
  938.     'demolift(''Local_FUN'',''set_UI_Graphics'',5);', 
  939.     'demolift(''Local_FUN'',''plot_DECOMP'',x,xDEC,LSnew,level,ax(4:7),keptCFS,''1D'');',
  940. '' };
  941.   slide(idx).text = {
  942.   ' ',
  943. '   Choose the number of kept coefficients in the edit then ',
  944.   '   Press the "Enter" key to execute the edit button callback.' , 
  945.   ' ',    
  946.   '   Or',
  947.   ' ',    
  948.   '   Press the "Prev" button.',
  949. '   Choose the number of kept coefficients in the edit.',
  950.   '   Then press the "Next" button.',
  951. ' '};
  952.   slide(idx).info = 'addlift';
  953.   
  954.   %========== Slide 32 ==========
  955.   idx = idx+1;
  956.   slide(idx).code = {
  957.     'S1  = ''LIFTING (22): 2D ANALYSIS'';',
  958.     'S2  = ''-------------------------'';',
  959.     'S3  = blanc;',
  960.     'S4  = ''  Like for one dimensional signal, you can perform '';',
  961.     'S5  = ''  2D analysis using Lifting Tools.'';',
  962.     'S6  = ''  Look at LWT2, ILWT2, LWTCOEF2 functions to get more information.'';',
  963.     'S7  = blanc;',
  964.     'S8  = ''  As an example:'';',  
  965.     'S9  = ''      Load an image (woman)'';', 
  966.     'S10 = ''      And perform a 2D wavelet analysis at level 8'';',  
  967.     'S11 = ''      using the Haar wavelet.'';',  
  968.     'S12 = blanc;',
  969.     'S13 = '' '';',
  970.     'Infostr = strvcat(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13);',
  971.     
  972. 'set(t(1),''FontSize'',10,''String'',Infostr);',
  973.     'demolift(''Local_FUN'',''set_UI_Graphics'',0);', 
  974. '' };
  975.   slide(idx).text = {
  976. ' % Compute the decomposition at level 8.',
  977.   ' ',
  978.     '       LSdb1 = liftwave(''db1''); level2D = 8;',
  979.     '       St = load(''woman.mat'');',
  980. '       xDEC = lwt2(St.X,LSdb1,level2D);',
  981.   ' ',    
  982. ' % And then view the decomposition.',
  983.   ' ',
  984. '      Choose the number of kept coefficients in the edit then ',
  985.   '      Press the "Enter" key to execute the edit button callback.' , 
  986.   ' ',    
  987.   ' ',
  988. ' '};
  989.   slide(idx).info = 'lwt2';
  990.   %========== Slide 32 ==========
  991.   idx = idx+1;
  992.   slide(idx).code = {
  993.     'lin = findall(ax(4:7),''type'',''line''); delete(lin);',
  994.     'LSdb1 = liftwave(''db1''); level2D = 8;',
  995.     'St = load(''woman.mat'');',
  996. 'xDEC = lwt2(St.X,LS,level2D);',
  997. 'keptCFSMAX = prod(size(St.X));',
  998. 'set(ediCFS,''String'',int2str(keptCFSMAX),''Enable'',''On'');',
  999.     'demolift(''Local_FUN'',''set_UI_Graphics'',6);', 
  1000.     'demolift(''Local_FUN'',''plot_DECOMP'',St.X,xDEC,LS,level2D,ax(4:7),keptCFSMAX,''2D'');',
  1001. '' };
  1002.   slide(idx).text = {
  1003.   ' ',
  1004. '      Choose the number of kept coefficients in the edit then ',
  1005.   '      Press the "Enter" key to execute the edit button callback.' , 
  1006.   ' ',    
  1007.   ' ',
  1008. ' '};
  1009.   slide(idx).info = 'lwt2';
  1010.   
  1011.   %==============================
  1012.   
  1013.   varargout{1} = slide;
  1014.   
  1015. end
  1016. %--------------------------------------------------------------
  1017. function set_UI_Graphics(axMode)
  1018. hdl_UI_Graphics = wtbxappdata('get',gcf,'hdl_UI_Graphics');
  1019. if isempty(hdl_UI_Graphics)
  1020.     pos = [0.0200  0.3700  0.7700  0.6000 ;  ...
  1021.            0.0750  0.4327  0.2848  0.4973 ;  ...
  1022.            0.4652  0.4327  0.2848  0.4973 ;  ...
  1023.            0.1300  0.4527  0.7750  0.1297 ;  ...
  1024.            0.1300  0.2813  0.7750  0.1297 ;  ...
  1025.            0.1300  0.1100  0.7750  0.1297 ;  ...
  1026.            0.1300  0.6240  0.7750  0.1297 ;  ...
  1027.            0.1300  0.7953  0.7750  0.1297    ...
  1028.            ];
  1029.     ax(1) = axes('Position',pos(1,:), ...
  1030.         'Xtick',[],'Ytick',[],'Color',[1 1 1],'Box','On');
  1031.     rectangle('LineWidth',10,'EdgeColor',[1 0.75 0.75]);
  1032.     t(1) = text(0.04,0.95,' ', ...
  1033.         'Interpreter','tex','VerticalAlignment','top',...
  1034.         'Color',[0 0 0],'tag','LiftDEMO');
  1035.     for k = 2:size(pos,1)
  1036.         ax(k) = axes('Position',pos(k,:),'Visible','Off');
  1037.     end
  1038.     %-------------------------------------------------------
  1039.     hdl_UI_Graphics.mode = axMode; 
  1040.     hdl_UI_Graphics.ax = ax; 
  1041.     hdl_UI_Graphics.t  = t;
  1042.     wtbxappdata('set',gcf,'hdl_UI_Graphics',hdl_UI_Graphics);
  1043. else
  1044.     axModeOLD = hdl_UI_Graphics.mode;
  1045.     hdl_UI_Graphics.mode = axMode; 
  1046.     ax = hdl_UI_Graphics.ax;
  1047.     t  = hdl_UI_Graphics.t;
  1048.     pos = get(ax,'Position'); pos = cat(1,pos{:});
  1049. end
  1050. switch axMode
  1051.     case -1
  1052.         setPOS = [];
  1053.         vis ={'Off','Off','Off','Off','Off','Off','Off','Off'};
  1054.         
  1055.     case 0
  1056.         setPOS = [];
  1057.         vis ={'On','Off','Off','Off','Off','Off','Off','Off'};
  1058.         
  1059.     case 1
  1060.         setPOS = [];
  1061.         vis ={'Off','On','On','Off','Off','Off','Off','Off'};
  1062.         
  1063.     case 2
  1064.         setPOS = [4:6]; 
  1065.         pos(setPOS,:) = [...
  1066.                 0.07  0.80  0.70  0.15
  1067.                 0.07  0.60  0.70  0.15
  1068.                 0.07  0.40  0.70  0.15
  1069.                 ];
  1070.         vis ={'Off','Off','Off','On','On','On','Off','Off'}; 
  1071.         
  1072.     case 3
  1073.         setPOS = [4:7];         
  1074.         pos(setPOS,:) = [  ...
  1075.                 0.07  0.85  0.70  0.11
  1076.                 0.07  0.70  0.70  0.11
  1077.                 0.07  0.55  0.70  0.11
  1078.                 0.07  0.40  0.70  0.11
  1079.                 ];
  1080.         vis ={'Off','Off','Off','On','On','On','On','Off'}; 
  1081.         
  1082.     case 4
  1083.         setPOS = [4:8];         
  1084.         pos(setPOS,:) = [  ...
  1085.                 0.07  0.88  0.70  0.09
  1086.                 0.07  0.76  0.70  0.09
  1087.                 0.07  0.64  0.70  0.09
  1088.                 0.07  0.52  0.70  0.09
  1089.                 0.07  0.40  0.70  0.09
  1090.                 ];
  1091.         vis ={'Off','Off','Off','On','On','On','On','On'}; 
  1092.         
  1093.     case {5,6}
  1094.         setPOS = [4:7];                 
  1095.         pos(setPOS,:) = [  ...
  1096.                 0.06  0.72  0.30  0.23                 
  1097.                 0.45  0.72  0.30  0.23
  1098.                 0.06  0.41  0.30  0.23
  1099.                 0.45  0.41  0.30  0.23
  1100.                 ];
  1101.         vis ={'Off','Off','Off','On','On','On','On','Off'}; 
  1102. end
  1103. switch axMode
  1104.     case {2,3,4}
  1105.         hdl_DEN = findobj(ax(4),'type','line','Tag','denoSIG');
  1106.         if ~isempty(hdl_DEN), delete(hdl_DEN); end
  1107.     case 5 , set(ax(4),'Ydir','Normal');
  1108.     case 6 , set(ax(4),'Ydir','Reverse');
  1109. end
  1110. for j=1:length(setPOS)
  1111.     k = setPOS(j);
  1112.     set(ax(k),'Position',pos(k,:));
  1113. end
  1114. for k = 1:size(pos,1)
  1115.     set(findall(ax(k)),'Visible',vis{k});
  1116. end
  1117. %--------------------------------------------------------------
  1118. function plot_phi_psi(LS,ax)
  1119. N = 10;
  1120. phi = zeros(1,16); phi(9) = 1;
  1121. for k = 1:N , phi = dyadup(phi,0); phi = ilwt(phi,LS,1); end;
  1122. phi = (sqrt(2)^N)*phi;
  1123. psi = zeros(1,16); psi(8) = 1;
  1124. psi = ilwt(psi,LS,1);
  1125. for k = 1:N, psi = dyadup(psi,0); psi = ilwt(psi,LS,1); end;
  1126. psi = -(sqrt(2)^(N+1))*psi;
  1127. yLimPHI = [min(phi) max(phi)];
  1128. yLimPSI = [min(psi) max(psi)];
  1129. set(findall(ax),'Visible','Off')
  1130. set(ax(2:3),'Visible','On')
  1131. axes(ax(2)); plot(phi,'r','LineWidth',2); grid
  1132. set(ax(2),'Ylim',yLimPHI);
  1133. xlabel('Scaling Function');
  1134. axes(ax(3)); plot(psi,'g','LineWidth',2); grid
  1135. set(ax(3),'Ylim',yLimPSI);
  1136. xlabel('Wavelet');
  1137. set(ax(2:3),'Xlim',[1 length(psi)],'XtickLabel','')
  1138. %--------------------------------------------------------------
  1139. function plot_ANALYSIS(x,a,d,level,ax)
  1140. lx = length(x);
  1141. for k = 1:level
  1142.    axes(ax(1)) ; plot(x,'r') ; 
  1143.    title(''); yl = ylabel('S');
  1144.    p  = get(yl,'Position'); p(1) = -55;
  1145.    set(yl,'Rotation',0,'Position',p)
  1146.    set(ax(1),'Ylim',[min(x) max(x)]);
  1147.    axes(ax(2)) ; plot(a(k,:),'b') ; 
  1148.    yl = ylabel(['A' int2str(k)]);
  1149.    p  = get(yl,'Position'); p(1) = -55;
  1150.    set(yl,'Rotation',0,'Position',p)
  1151.    
  1152.    set(ax(2),'Ylim',[min(a(k,:)) max(a(k,:))]);
  1153.    for j =1:k
  1154.        idxAX = 3+k-j;
  1155.        axes(ax(idxAX)) ; plot(d(j,:),'g') ; 
  1156.        yl = ylabel(['D' int2str(j)]);
  1157.        p  = get(yl,'Position'); p(1) = -55;
  1158.        set(yl,'Rotation',0,'Position',p)
  1159.        set(ax(idxAX),'Ylim',[min(d(j,:)) max(d(j,:))]);
  1160.    end
  1161.    set(ax,'Xlim',[1 lx])
  1162. end
  1163. %--------------------------------------------------------------
  1164. function plot_DECOMP(x,xDEC,LS,level,ax,keptCFS,DIM)
  1165. switch DIM
  1166.     case '1D'
  1167.         NbMaxCFS = length(x);
  1168.         idxMIN = NbMaxCFS-keptCFS;
  1169.         T = sort(abs(xDEC(:)));
  1170.         
  1171.         xDEC_Thr = xDEC;
  1172.         if idxMIN>0 , thr = T(idxMIN); else , thr = 0; end 
  1173.         xDEC_Thr(abs(xDEC_Thr)<=thr) = 0;
  1174.         xREC = ilwt(xDEC_Thr,LS,level);
  1175.         
  1176.         yLX    = [min(x) max(x)];
  1177.         yLXREC = [min(xREC) max(xREC)];
  1178.         yLX_XREC = [min([yLX(1),yLXREC(1)]) , max([yLX(2),yLXREC(2)])];
  1179.         
  1180.         axes(ax(1)) ; plot(x,'r') ; title('Signal')
  1181.         hdl_DEN = findobj(ax(1),'type','line','Tag','denoSIG');
  1182.         if (idxMIN>0)
  1183.             if isempty(hdl_DEN)
  1184.                 axes(ax(1)) ; hold on; hdl_DEN = plot(xREC,'y','Tag','denoSIG');
  1185.             else
  1186.                 set(hdl_DEN,'Ydata',xREC);
  1187.             end
  1188.             set(ax(1),'Ylim',yLX_XREC);
  1189.         else
  1190.             delete(hdl_DEN)
  1191.             set(ax(1),'Ylim',yLX);
  1192.         end
  1193.         
  1194.         axes(ax(3)) ; plot(xDEC,'b')
  1195.         xlabel('Original Lifted Decomposition (in place)','Color','k')
  1196.         
  1197.         axes(ax(4)) ; plot(xDEC_Thr,'b')
  1198.         xlabel('Modified Lifted Decomposition (in place)','Color','k')
  1199.         
  1200.         axes(ax(2)) ;  plot(xREC,'y') ; set(ax(2),'Ylim',yLXREC);
  1201.         strTITLE = ['Nb. Cfs ==> total: ' int2str(NbMaxCFS) ...
  1202.                 ' - kept: ' int2str(NbMaxCFS-idxMIN)];
  1203.         title(strTITLE,'Color','c');
  1204.         xlabel(['Threshold = ' , num2str(thr)],'Color','c')
  1205.         
  1206.         set(ax,'Xlim',[1,NbMaxCFS]);
  1207.         wtbxappdata('set',gcf,'analysis_PARAM_1D',{x,xDEC,LS,level,ax,keptCFS,DIM});        
  1208.         
  1209.     case '2D'
  1210. LSType  = [];
  1211. NBC = min(max(max(x)),256);
  1212. NbMaxCFS = prod(size(x));
  1213. idxMIN = NbMaxCFS-keptCFS;
  1214. T = sort(abs(xDEC(:)));
  1215. xDEC_Thr = xDEC;
  1216. if idxMIN>0 , thr = T(idxMIN); else , thr = 0; end 
  1217. xDEC_Thr(abs(xDEC_Thr)<=thr) = 0;
  1218. xREC = ilwt2(xDEC_Thr,LS,level);
  1219. set(gcf,'Colormap',pink(NBC));
  1220. axes(ax(1)) ; image(x); title('Original Image')
  1221.         set(ax(1),'Xlim',[1,size(x,2)],'Ylim',[1,size(x,1)])
  1222. axes(ax(3)); 
  1223. if isempty(LSType) , image(abs(xDEC)); else , imagesc(abs(xDEC)); end
  1224. xlabel('Original Lifted Decomposition (in place)','Color','k')
  1225. axes(ax(4));
  1226. if isempty(LSType) , image(abs(xDEC_Thr)); else , imagesc(abs(xDEC_Thr)); end
  1227. xlabel('Modified Lifted Decomposition (in place)','Color','k')
  1228. axes(ax(2)); image(xREC);
  1229. strTITLE = ['Nb. Cfs ==> total: ' int2str(NbMaxCFS) ...
  1230.                     ' - kept: ' int2str(NbMaxCFS-idxMIN)];
  1231. title(strTITLE,'Color','c');
  1232. xlabel(['Threshold = ' , num2str(thr)],'Color','c')
  1233.         wtbxappdata('set',gcf,'analysis_PARAM_2D',{x,xDEC,LS,level,ax,keptCFS,DIM});        
  1234. end
  1235. wtbxappdata('set',gcf,'analysis_DIM',DIM);
  1236. %--------------------------------------------------------------
  1237. function store_ANALYSIS(x,xDEC,LSnew,level,ax,keptCFS,DIM)
  1238. switch DIM
  1239.     case '1D' , wtbxappdata('set',gcf,'analysis_PARAM_1D',{x,xDEC,LSnew,level,ax,keptCFS,DIM});
  1240.     case '2D' , wtbxappdata('set',gcf,'analysis_PARAM_1D',{x,xDEC,LSnew,level,ax,keptCFS,DIM});
  1241. end
  1242. wtbxappdata('set',gcf,'analysis_DIM',DIM);
  1243. %--------------------------------------------------------------
  1244. function edit_CB
  1245. DIM = wtbxappdata('get',gcf,'analysis_DIM');
  1246. switch DIM
  1247.     case '1D' , analysis_PARAM = wtbxappdata('get',gcf,'analysis_PARAM_1D');
  1248.     case '2D' , analysis_PARAM = wtbxappdata('get',gcf,'analysis_PARAM_2D');
  1249. end
  1250. keptCFS = str2num(get(gcbo,'String'));
  1251. if isempty(keptCFS)
  1252.     keptCFS = analysis_PARAM{end-1};
  1253.     set(gcbo,'String',int2str(keptCFS));
  1254. end
  1255. analysis_PARAM{end-1} = keptCFS;
  1256. demolift('Local_FUN','plot_DECOMP',analysis_PARAM{:});  
  1257. %--------------------------------------------------------------
  1258. function S = wlift_str_util(option,S)
  1259. %WLIFT_STR_UTIL String utilities for lifting demos. 
  1260. switch option
  1261.     case 'replace'
  1262.         idx = find(S=='('); S(idx(2:end)) = '{'; 
  1263.         idx = find(S==')'); S(idx(2:end)) = '}';
  1264.         idx = find(S=='*'); S(idx) = ' ';
  1265.     case 'replaceMAT'
  1266.         idx = find(S=='('); S(idx) = '{';
  1267.         idx = find(S==')'); S(idx) = '}';
  1268.         idx = find(S=='*'); S(idx) = ' ';
  1269.         idx = find(S=='|'); S(idx) = ' ';
  1270.     case 'replaceMAT_1'
  1271.         idx = find(S=='('); S(idx) = '{';
  1272.         idx = find(S==')'); S(idx) = '}';
  1273.         idx = find(S=='*'); S(idx) = ' ';
  1274.     case 'replaceMAT_2'
  1275.         idx = find(S=='('); S(idx) = '{';
  1276.         idx = find(S==')'); S(idx) = '}';
  1277.     case 'replacePOW'
  1278.         idx_1 = find(S=='^'); 
  1279.         idx_2 = find(S=='('); idx_3 = find(S==')'); 
  1280.         for k = 1:length(idx_1)
  1281.             j = idx_1(k);
  1282.             if isequal(S(j+1),'(')
  1283.                 S(j+1) = '{';
  1284.                 tmp = find(idx_3>j);
  1285.                 jj = idx_3(tmp(1));
  1286.                 S(jj) = '}';
  1287.             end
  1288.         end
  1289.         idx = find(S=='*'); S(idx) = ' ';
  1290. end
  1291. %--------------------------------------------------------------