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

波变换

开发平台:

Matlab

  1. function varargout = dcmdmala(varargin)
  2. %DCMDMALA Demonstrates Mallat algorithm in the Wavelet Toolbox. 
  3. %
  4. % This is a slideshow file for use with wshowdrv.m
  5. % To see it run, type 'wshowdrv dcmdmala', 
  6. %
  7. % See also CONV, DWT, IDWT, DYADDOWN, DYADUP, WFILTERS, WKEEP.
  8. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  9. %   Last Revision: 12-Apr-2001.
  10. %   Copyright 1995-2002 The MathWorks, Inc.
  11. % $Revision: 1.13 $
  12. % DEMALLAT Short demo about basic steps of FWT 1-D.
  13. % Non documented function, demo function file.
  14. % Initialization and Local functions if necessary.
  15. if nargin>0
  16. action = varargin{1};
  17. switch action
  18.   case 'auto'    , wshowdrv('#autoMode',mfilename,'close');
  19.   case 'gr_auto' , wshowdrv('#gr_autoMode',mfilename,'close');
  20.   case 'getFigParam'
  21. figName  = 'Mallat Algorithm (FWT)';
  22. showType = 'mix6';
  23. varargout = {figName,showType};
  24. end
  25. return
  26. end
  27. if nargout<1,
  28.   wshowdrv(mfilename)
  29. else
  30.   idx = 0;
  31.   %========== Slide 1 ==========
  32.   idx = idx+1;
  33.   slide(idx).code = {
  34.   'figHandle = gcf;',
  35.   'ax = findall(figHandle,''type'',''axes''); delete(ax); drawnow;  h = [];',   
  36.   '' };
  37.  
  38.   slide(idx).text = {
  39.   '',
  40.   ' Press the "Start" button to see a demonstration of',
  41.   ' Mallat algorithm in the Wavelet Toolbox.',
  42.   '',
  43.   ' This demo uses Wavelet Toolbox functions.',
  44.   ''};
  45.   %========== Slide 2 ==========
  46.   idx = idx+1;
  47.   slide(idx).code = {
  48.   's = 2 + kron(ones(1,8),[1 -1]) + ((1:16).^2)/32 + 0.2*randn(1,16);',
  49.   'h(1) = subplot(3,1,1); plot(s,''r'');',
  50.   'title(''Original signal s.'');',
  51.   'set(h(1),''Xlim'',[1 16])',
  52.   'delete(findobj([subplot(3,2,3);subplot(3,2,4)]));',
  53.   '' };
  54.   slide(idx).text = {
  55.   ' % Construct elementary original 1-D signal.',
  56.   ' ', 
  57.   '         s = 2 + kron(ones(1,8),[1 -1]) + ...' ,
  58.   '             ((1:16).^2)/32 + 0.2*randn(1,16);',
  59.   ''};
  60.   
  61.   %========== Slide 3 ==========
  62.   idx = idx+1;
  63.   slide(idx).code = {
  64.   '[Lo_D,Hi_D] = wfilters(''db1'',''d'');',
  65.   'x_fil = 1:length(Lo_D);',
  66.   'stemCOL = ''y'';',
  67.   'h(3) = subplot(3,2,3); wdstem(h(3),x_fil,Lo_D,stemCOL);',
  68.   'xlabel(''Lo_D.'');',
  69.   'h(4) = subplot(3,2,4); wdstem(h(4),x_fil,Hi_D,stemCOL);',
  70.   'xlabel(''Hi_D.'');',
  71.   '' };
  72.   slide(idx).text = {
  73.   ' % For a given orthogonal wavelet,',
  74.   ' % compute the two associate',
  75.   ' % decomposition filters.',
  76.   ' ',
  77.   '         [Lo_D,Hi_D] = wfilters(''db1'',''d'');',
  78.   ''};
  79.   slide(idx).info = 'wfilters';
  80.   %========== Slide 4 ==========
  81.   idx = idx+1;
  82.   slide(idx).code = {
  83.   'sm = sum(Lo_D);',
  84.   'h(3) = subplot(3,2,3); xlabel([''Lo_D : sum = '', num2str(sm)]);',
  85.   '' };
  86.   slide(idx).text = {
  87.   ' % Lo_D is the decomposition low-pass filter.',
  88.   ' % Check for sum.',
  89.   ' ',
  90.   '         sm = sum(Lo_D);',
  91.   ''};
  92.   %========== Slide 5 ==========
  93.   idx = idx+1;
  94.   slide(idx).code = {
  95.   'nrm = norm(Lo_D);',
  96.   ['idxPREV = wshowdrv(''#get_idxSlide'',figHandle); idxSlide = ' int2str(idx) ';'],
  97.   'if idxPREV>idxSlide',
  98.   '   h(3) = subplot(3,2,3); wdstem(h(3),x_fil,Lo_D,stemCOL);',
  99.   '   h(4) = subplot(3,2,4); wdstem(h(4),x_fil,Hi_D,stemCOL);',
  100.   '   xlabel(''Hi_D.'');',
  101.   'end',
  102.   'h(3) = subplot(3,2,3); xlabel([''Lo_D : norm = '', num2str(nrm)]);',
  103.   '' };
  104.  
  105.   slide(idx).text = {
  106.   ' % Lo_D is the decomposition low-pass filter.',
  107.   ' % Check for square norm.',
  108.   ' ',
  109.   '         nrm = norm(Lo_D);',
  110.   ''};
  111.   %========== Slide 6 ==========
  112.   idx = idx+1;
  113.   slide(idx).code = {
  114.   'tempo = conv(s,Lo_D);',
  115.   'set(subplot(3,1,1),''Xticklabel'',[]);',
  116.   'h(2) = subplot(3,1,2); plot(tempo);',
  117.   'title(''s and Lo_D convolution.'');',
  118.   'set(h(2),''Xlim'',[1 length(tempo)]);',
  119.   'delete(subplot(3,2,5));',
  120.   '' };
  121.   slide(idx).text = {
  122.   ' % Compute approx. coef. of s using db1 : first step.',
  123.   ' % Convolve s and Lo_D the',
  124.   ' % decomposition low-pass filter.',
  125.   ' ',
  126.   '         tempo = conv(s,Lo_D);',
  127.   ''};
  128.   %========== Slide 7 ==========
  129.   idx = idx+1;
  130.   slide(idx).code = {
  131.   ['idxPREV = wshowdrv(''#get_idxSlide'',figHandle); idxSlide = ' int2str(idx) ';'],
  132.   'if idxPREV>idxSlide',
  133.   '   h(2) = subplot(3,1,2); plot(tempo);',
  134.   '   title(''s and Lo_D convolution.'');',
  135.   '   set(h(2),''Xlim'',[1 length(tempo)]);',
  136.   'end'
  137.   'ca1 = dyaddown(tempo);',
  138.   'h(5) = subplot(3,2,5); plot(ca1);',
  139.   'xlabel(''Approx. coef. : ca1.'');',
  140.   'set(h(5),''Xlim'',[1 length(ca1)]);',
  141.   '' };
  142.   slide(idx).text = {
  143.   ' % Compute approx. coef. of s using db1 : second step.',
  144.   ' % Decimate convolution result and keep central part.',
  145.   ' ',
  146.   '         ca1 = dyaddown(tempo);',
  147.   ''};
  148.   slide(idx).info = 'dyaddown';
  149.   %========== Slide 8 ==========
  150.   idx = idx+1;
  151.   slide(idx).code = {
  152.   'h(3) = subplot(3,2,3); wdstem(h(3),x_fil,Lo_D,stemCOL);',
  153.   'h(4) = subplot(3,2,4); wdstem(h(4),x_fil,Hi_D,stemCOL);',
  154.   'xlabel(''Hi_D.'');',
  155.   ''};
  156.   slide(idx).text = {
  157.   ''};
  158.   %========== Slide 9 ==========
  159.   idx = idx+1;
  160.   slide(idx).code = {
  161.   'sm = sum(Hi_D);',
  162.   'h(4) = subplot(3,2,4); xlabel([''Hi_D : sum = '', num2str(sm)]);',
  163.   ''};
  164.   slide(idx).text = {
  165.   ' % Hi_D is the decomposition high-pass filter.',
  166.   ' % Check for sum.',
  167.   ' ',
  168.   '         sm = sum(Hi_D);',
  169.   ''};
  170.   %========== Slide 10 ==========
  171.   idx = idx+1;
  172.   slide(idx).code = {
  173.   'nrm = norm(Hi_D);',
  174.   ['idxPREV = wshowdrv(''#get_idxSlide'',figHandle); idxSlide = ' int2str(idx) ';'],
  175.   'if idxPREV>idxSlide',
  176.   '   h(3) = subplot(3,2,3); wdstem(h(3),x_fil,Lo_D,stemCOL);',
  177.   '   h(4) = subplot(3,2,4); wdstem(h(4),x_fil,Hi_D,stemCOL);',
  178.   'end',
  179.   'h(4) = subplot(3,2,4); xlabel([''Hi_D : norm = '', num2str(nrm)]);',
  180.   ''};
  181.   
  182.   slide(idx).text = {
  183.   ' % Hi_D is the decomposition high-pass filter.',
  184.   ' % Check for square norm.',
  185.   ' ',
  186.   '         nrm = norm(Hi_D);',
  187.   ''};
  188.   %========== Slide 11 ==========
  189.   idx = idx+1;
  190.   slide(idx).code = {
  191.   'tempo = conv(s,Hi_D);',
  192.   'h(2) = subplot(3,1,2); plot(tempo);',
  193.   'title(''s and Hi_D convolution.'');',
  194.   'set(h(2),''Xlim'',[1 length(tempo)]);',
  195.   'delete(subplot(3,2,6));',
  196.   ''};
  197.   slide(idx).text = {
  198.   ' % Compute detail coef. of s using db1 : first step.',
  199.   ' % Convolve s and Lo_D the',
  200.   ' % decomposition high-pass filter.',
  201.   ' ',
  202.   '         tempo = conv(s,Hi_D);',
  203.   ''};       
  204.   %========== Slide 12 ==========
  205.   idx = idx+1;
  206.   slide(idx).code = {
  207.   'cd1 = dyaddown(tempo);',
  208.   
  209.   ['idxPREV = wshowdrv(''#get_idxSlide'',figHandle); idxSlide = ' int2str(idx) ';'],
  210.   'if idxPREV>idxSlide',
  211.   '   h(5) = subplot(3,2,5); plot(ca1);',
  212.   '   xlabel(''Approx. coef. : ca1.'');',
  213.   '   set(h(5),''Xlim'',[1 length(ca1)]);',
  214.   'end',
  215.   'h(6) = subplot(3,2,6); plot(cd1);',
  216.   'xlabel(''Detail coef. : cd1.'');',
  217.   'set(h(6),''Xlim'',[1 length(cd1)]);',
  218.   ''};
  219.   slide(idx).text = {
  220.   ' % Compute detail coef. of s using db1 : second step.',
  221.   ' % Decimate convolution result',
  222.   ' % and keep central part.',
  223.   ' ',
  224.   '         cd1 = dyaddown(tempo);',
  225.   ''};       
  226.   slide(idx).info = 'dyaddown';
  227.   %========== Slide 13 ==========
  228.   idx = idx+1;
  229.   slide(idx).code = {
  230.   '[ca1,cd1] = dwt(s,''db1'');',
  231.   
  232.   ['idxPREV = wshowdrv(''#get_idxSlide'',figHandle); idxSlide = ' int2str(idx) ';'],
  233.   'if idxPREV>idxSlide',
  234.   '   h(1) = subplot(3,1,1); plot(s,''r'');',
  235.   '   title(''Original signal s.'');',
  236.   '   set(h(1),''Xlim'',[1 16],''Xtick'',[])',
  237.   '   tempo = conv(s,Hi_D);',
  238.   '   h(2) = subplot(3,1,2); plot(tempo);',
  239.   '   title(''s and Hi_D convolution.'');',
  240.   '   set(h(2),''Xlim'',[1 length(tempo)]);',
  241.   'end'
  242.   
  243.   'h(5) = subplot(3,2,5); plot(ca1,''g'');',
  244.   'xlabel(''Approx. coef. : ca1.'');',
  245.   'set(h(5),''Xlim'',[1 length(ca1)]);',
  246.   'h(6) = subplot(3,2,6); plot(cd1,''g'');',
  247.   'xlabel(''Detail coef. : cd1.'');',
  248.   'set(h(6),''Xlim'',[1 length(cd1)]);',
  249.   ''};
  250.   slide(idx).text = {
  251.   ' % This sequence is the one step',
  252.   ' % discrete wavelet transform of s.',
  253.   ' % M-file dwt performs it directly.',
  254.   ' ',
  255.   '         [ca1,cd1] = dwt(s,''db1'');',
  256.   ''};       
  257.   slide(idx).info = 'dwt';
  258.   %========== Slide 14 ==========
  259.   idx = idx+1;
  260.   slide(idx).code = {
  261.   '[Lo_R,Hi_R] = wfilters(''db1'',''r'');',
  262.   'ax = findall(figHandle,''type'',''axes''); delete(ax); drawnow;  h = [];',   
  263.   'h(3) = subplot(3,2,3); wdstem(h(3),x_fil,Lo_R,stemCOL);',
  264.   'xlabel(''Lo_R.'');',
  265.   'h(4) = subplot(3,2,4); wdstem(h(4),x_fil,Hi_R,stemCOL);',
  266.   'xlabel(''Hi_R.'');',
  267.   'h(1) = subplot(3,2,1); plot(ca1,''g'');',
  268.   'set(h(1),''Xlim'',[1 length(ca1)]);',
  269.   'title(''Approx. coef. : ca1.'');',
  270.   'h(2) = subplot(3,2,2); plot(cd1,''g'');',
  271.   'title(''Detail coef. : cd1.'');',
  272.   'set(h(2),''Xlim'',[1 length(cd1)]);',
  273.   ''};
  274.   slide(idx).text = {
  275.   ' % Now how to reconstruct ?',
  276.   ' % For a given orthogonal wavelet,',
  277.   ' % compute the two associate',
  278.   ' % reconstruction filters.',
  279.   ' ',
  280.   '         [Lo_R,Hi_R] = wfilters(''db1'',''r'');',
  281.   ''};
  282.   slide(idx).info = 'wfilters';
  283.   %========== Slide 15 ==========
  284.   idx = idx+1;
  285.   slide(idx).code = {
  286.   'tempo = dyadup(cd1);',
  287.   'subplot(3,2,3); xlabel('''');',
  288.   'subplot(3,2,4); xlabel('''');',
  289.   'h(3) = subplot(3,1,3); plot(tempo);',
  290.   'xlabel(''Upsampled det. coeff. cd1.'');',
  291.   'set(h(3),''Xlim'',[1 length(tempo)]);',
  292.   ''};
  293.   slide(idx).text = {
  294.   ' % Reconstruct detail : first step.',
  295.   ' % Upsample cd1 inserting zeros.',
  296.   ' ',
  297.   '         tempo = dyadup(cd1);' ,
  298.   ''};
  299.   slide(idx).info = 'dyadup';
  300.   %========== Slide 16 ==========
  301.   idx = idx+1;
  302.   slide(idx).code = {
  303.   'tempo = conv(tempo,Hi_R);',
  304.   'h(3) = subplot(3,1,3); plot(tempo);',
  305.   'xlabel(''Upsampled detail coeff. and Hi_R convolution.'');',
  306.   'set(h(3),''Xlim'',[1 length(tempo)]);',
  307.   ''};
  308.   slide(idx).text = {
  309.   ' % Reconstruct detail : second step.',
  310.   ' % Convolves upsampled detail coeff.',
  311.   ' % and Hi_R reconstruction high-pass filter.',
  312.   ' ',
  313.   '         tempo = conv(tempo,Hi_R);',
  314.   ''};
  315.   %========== Slide 17 ==========
  316.   idx = idx+1;
  317.   slide(idx).code = {
  318.   'd1 = wkeep(tempo,16);',
  319.   'h(3) = subplot(3,1,3); plot(d1);',
  320.   'xlabel(''Reconstructed detail d1.'');',
  321.   'set(h(3),''Xlim'',[1 length(d1)]);',
  322.   ''};
  323.   slide(idx).text = {
  324.   ' % Reconstruct detail : last step.',
  325.   ' % Take central part of length 16',
  326.   ' % of upsampled detail coeff. and Hi_R',
  327.   ' % convolution.',
  328.   ' ',
  329.   '         d1 = wkeep(tempo,16);',
  330.   ''};
  331.   slide(idx).info = 'wkeep';
  332.   %========== Slide 18 ==========
  333.   idx = idx+1;
  334.   slide(idx).code = {
  335.   'tempo = dyadup(ca1);',
  336.   'h(3) = subplot(3,1,3); plot(tempo);',
  337.   'xlabel(''Upsampled approx. coeff. ca1'');',
  338.   'set(h(3),''Xlim'',[1 length(tempo)]);',
  339.   ''};
  340.   slide(idx).text = {
  341.   ' % Using the same line reconstruct',
  342.   ' % approximation. First step. Upsample',
  343.   ' % ca1 inserting zeros.',
  344.   ' ',
  345.   '         tempo = dyadup(ca1);',
  346.   ''};
  347.   slide(idx).info = 'dyadup';
  348.   %========== Slide 19 ==========
  349.   idx = idx+1;
  350.   slide(idx).code = {
  351.   'tempo = conv(tempo,Lo_R);',
  352.   'h(3) = subplot(3,1,3); plot(tempo);',
  353.   'xlabel(''Upsampled approx coeff. and Lo_R convolution.'');',
  354.   'set(h(3),''Xlim'',[1 length(tempo)]);',
  355.   ''};
  356.   slide(idx).text = {
  357.   ' % Reconstruct approx. : second step.',
  358.   ' % Convolves upsampled approx coeff.',
  359.   ' % and Lo_R reconstruction low-pass filter.',
  360.   ' ',
  361.   '         tempo = conv(tempo,Lo_R);', 
  362.   ''};
  363.   %========== Slide 20 ==========
  364.   idx = idx+1;
  365.   slide(idx).code = {
  366.   'a1 = wkeep(tempo,16);',
  367.   
  368.   ['idxPREV = wshowdrv(''#get_idxSlide'',figHandle); idxSlide = ' int2str(idx) ';'],
  369.   'if idxPREV>idxSlide',
  370.   '   h(3) = subplot(3,2,3); wdstem(h(3),x_fil,Lo_R,stemCOL);',
  371.   '   h(4) = subplot(3,2,4); wdstem(h(4),x_fil,Hi_R,stemCOL);',
  372.   '   h(1) = subplot(3,2,1); plot(ca1,''g'');',
  373.   '   set(h(1),''Xlim'',[1 length(ca1)]);',
  374.   '   title(''Approx. coef. : ca1.'');',
  375.   '   h(2) = subplot(3,2,2); plot(cd1,''g'');',
  376.   '   title(''Detail coef. : cd1.'');',
  377.   '   set(h(2),''Xlim'',[1 length(cd1)]);',
  378.   'end'
  379.   
  380.   'h(3) = subplot(3,1,3); plot(a1);',
  381.   'xlabel(''Reconstructed approx. a1.'');',
  382.   'set(h(3),''Xlim'',[1 length(a1)]);',
  383.   ''};
  384.   slide(idx).text = {
  385.   ' % Reconstruct approx : last step.',
  386.   ' % Take central part of length 16',
  387.   ' % of upsampled approx coeff. and Lo_R',
  388.   ' % convolution.',
  389.   ' ',
  390.   '        a1 = wkeep(tempo,16);',
  391.   ''};
  392.   slide(idx).info = 'wkeep';
  393.   %========== Slide 21 ==========
  394.   idx = idx+1;
  395.   slide(idx).code = {
  396.   'a0 = a1 + d1;'
  397.   'ax = findall(figHandle,''type'',''axes''); delete(ax); drawnow;  h = [];',   
  398.   'h(1) = subplot(3,1,1); plot(s,''r'');',
  399.   'title(''Original signal s.'');',
  400.   'set(h(1),''Xlim'',[1 16]);',
  401.   'pause(1)',
  402.   'set(h(1),''Xticklabel'',[]);',
  403.   'h(2) = subplot(3,1,2); plot(1:16,a1,1:16,d1);',
  404.   'title(''a1 and d1.'');',
  405.   'set(h(2),''Xlim'',[1 16]);',
  406.   'pause(1)',
  407.   'set(h(2),''Xticklabel'',[]);',
  408.   'h(3) = subplot(3,1,3); plot(a0);',
  409.   'title(''Reconstructed signal : a0 = a1 + d1.'');',
  410.   'set(h(3),''Xlim'',[1 16]);',
  411.   ''};
  412.   slide(idx).text = {
  413.   ' % Now add a1 and d1 in order to',
  414.   ' % recover original signal.',
  415.   ' ',
  416.   '         a0 = a1 + d1;',
  417.   ''};
  418.   %========== Slide 22 ==========
  419.   idx = idx+1;
  420.   slide(idx).code = {
  421.   'a0 = idwt(ca1,cd1,''db1'',16);',
  422.   'h(3) = subplot(3,1,3); plot(a0,''g'');',
  423.   'title(''Reconstructed signal a0.'');',
  424.   'set(h(3),''Xlim'',[1 16]);',
  425.   ''};
  426.   slide(idx).text = {
  427.       ' % This sequence is the one step',
  428.       ' % inverse discrete wavelet transform of s.',
  429.       ' % M-file idwt performs it directly.',
  430.       ' ',
  431.       '        a0 = idwt(ca1,cd1,''db1'',16);',
  432.       ''};
  433.   slide(idx).info = 'idwt';
  434.   varargout{1} = slide;
  435. end