www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wavelet/fact_and_ls.m
function fact_and_ls(IN1,IN2,IN3) %FACT_AND_LS Factorizations and lifting schemes for wavelets. % === NOT DOCUMENTED === % M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 30-May-2003. % Last Revision 08-May-2012. % Copyright 1995-2012 The MathWorks, Inc. % Initialization. %---------------- tolerance = 1.E-8; waveCell_ALL = wavenames('all'); % FLAGS and type of display. %--------------------------- filterFLAG = false; % Flag for writing filters. fileFLAG = true; % Flag for writing on files. typeDISP_VAL = {'fact' , 'LS'}; % typeDISP_VAL = {'All'}; % Defaults. %---------- waveCell_DEFAULT = {... 'db1','db2','db3','db4','db5','db6',... 'sym2','sym3','sym4','sym5','sym6',... 'coif1','coif2', ... }; % Check argument. %---------------- if nargin<1 waveCell = waveCell_DEFAULT; elseif iscell(IN1) waveCell = IN1; elseif ischar(IN1) if isequal(IN1,'all') waveCell = waveCell_ALL; elseif isequal(IN1,'haar') waveCell = {'db1'}; else if any(strcmp(IN1,waveCell_ALL)) waveCell = {IN1}; else error(message('Wavelet:FunctionArgVal:Invalid_WavName')) end end end % Power Max setting. %------------------- powMAX_AUTO = false; if nargin<2 powMAX_AUTO = true; elseif isequal(IN2,'auto') powMAX_AUTO = true; elseif isequal(IN2,'set_1') powMAX_VAL = [0,1,NaN]; elseif isnumeric(IN2) powMAX_VAL = IN2; end % Diff. Power setting. %--------------------- difPOW_AUTO = false; if nargin<3 if ~powMAX_AUTO difPOW_VAL = 0; else difPOW_AUTO = true; end else difPOW_VAL = IN3; end % Begin display. %--------------- dispSTR_1 = '#====#====#====#====#====#====#====#====#====#====#====#====#====#====#'; dispSTR_2 = '================================='; dispSTR_3 = '+---+---+---+---+'; dispSTR_4 = '-------------------'; nb_WAVE_CUR = length(waveCell); for k = 1:nb_WAVE_CUR wname = waveCell{k}; if powMAX_AUTO TMP = wfilters(wname); LEN = length(TMP); powMAX_VAL = -LEN:LEN; if difPOW_AUTO difPOW_VAL = 0:2:LEN; end end typeDISP = typeDISP_VAL{1}; dispGENERAL_Info(typeDISP,fileFLAG,wname,dispSTR_1) dispGENERAL_Info(typeDISP,fileFLAG,wname, ... getWavMSG('Wavelet:moreMSGRF:BEG_Cur_Wav',wname)); dispGENERAL_Info(typeDISP,fileFLAG,wname,dispSTR_2) % Initialization. All_dual_APMF = {}; All_prim_APMF = {}; All_dual_LS = {}; All_prim_LS = {}; All_dual_ERR = []; All_prim_ERR = []; All_prim_POW = []; All_dual_POW = []; All_prim_DIF = []; All_dual_DIF = []; for j = 1:length(powMAX_VAL) powMAX = powMAX_VAL(j); dispGENERAL_Info(typeDISP,fileFLAG,wname, ... getWavMSG('Wavelet:moreMSGRF:Cur_Pow_Max',powMAX)); for m = 1:length(difPOW_VAL) difPOW = difPOW_VAL(m); % Compute Laurent Polynomials associated to the wavelet. [Hs,Gs,Ha,Ga] = wave2lp(wname,powMAX,difPOW); % Synthesis Polyphase Matrix, factorizations % and Lifting Steps. [MatFACT,PolyMAT] = ppmfact(Hs,Gs); nbFACT = length(MatFACT); % Compute and Display .... if nbFACT>0 % Compute Analysis Polyphase Matrix Factorizations. [dual_APMF,prim_APMF] = pmf2apmf(MatFACT,'twoFact'); % Compute Lifting Steps. dual_LS = apmf2ls(dual_APMF); prim_LS = apmf2ls(prim_APMF); % Control the factorizations. [dual_errTAB,dual_errFlags] = errlsdec(dual_LS,tolerance); [prim_errTAB,prim_errFlags] = errlsdec(prim_LS,tolerance); % Display Current diff POW. dispGENERAL_Info(typeDISP,fileFLAG,wname, ... getWavMSG('Wavelet:moreMSGRF:Cur_Dif_Pow',difPOW)); % Display Laurent Polynomials Information. dispLP_Info_INI(typeDISP,fileFLAG,wname,Ha,Ga,Hs,Gs) dispLP_Info(typeDISP,fileFLAG,wname,Hs,Gs,PolyMAT) % Display factorizations Information. dispFACT_Info(typeDISP,fileFLAG,wname,nbFACT,dual_errTAB,dual_errFlags) dispFACT_Info(typeDISP,fileFLAG,wname,nbFACT,prim_errTAB,prim_errFlags) % Add new Factorizations and LS ... All_dual_APMF = [All_dual_APMF , dual_APMF]; All_prim_APMF = [All_prim_APMF , prim_APMF]; All_dual_LS = [All_dual_LS , dual_LS]; All_prim_LS = [All_prim_LS , prim_LS]; All_dual_ERR = [All_dual_ERR , dual_errTAB]; %#ok<AGROW> All_prim_ERR = [All_prim_ERR , prim_errTAB]; %#ok<AGROW,AGROW> All_dual_POW = [All_dual_POW , powMAX*ones(1,nbFACT)]; %#ok<AGROW> All_prim_POW = [All_prim_POW , powMAX*ones(1,nbFACT)]; %#ok<AGROW> All_dual_DIF = [All_dual_DIF , difPOW*ones(1,nbFACT)]; %#ok<AGROW> All_prim_DIF = [All_prim_DIF , difPOW*ones(1,nbFACT)]; %#ok<AGROW> end dispGENERAL_Info(typeDISP,fileFLAG,wname,dispSTR_3) end dispGENERAL_Info(typeDISP,fileFLAG,wname,dispSTR_4) end % Merge direct and reverse Factorizations %---------------------------------------- All_FACT = [All_dual_APMF , All_prim_APMF]; All_LS = [All_dual_LS , All_prim_LS]; All_ERR = [All_dual_ERR , All_prim_ERR]; All_POW = [All_dual_POW , All_prim_POW]; All_DIF = [All_dual_DIF , All_prim_DIF]; % Suppress same factorizations. %------------------------------ eqTAB = tablseq(All_LS,tolerance); toDEL = []; for j = 1:length(eqTAB) num = eqTAB{j}; if ~isempty(num) && (num > j) toDEL = [toDEL , num]; %#ok<AGROW> end end All_FACT(toDEL) = []; All_LS(toDEL) = []; All_ERR(toDEL) = []; All_POW(toDEL) = []; All_DIF(toDEL) = []; for j = 1:length(typeDISP_VAL) typeDISP = typeDISP_VAL{j}; switch typeDISP case 'fact' , dispFACT(typeDISP,fileFLAG,wname,All_FACT); case 'LS' , dispLS(typeDISP,fileFLAG,wname,All_LS,... All_ERR,All_POW,All_DIF,filterFLAG); case 'All' , dispFACT(typeDISP,fileFLAG,wname,All_FACT); dispLS(typeDISP,fileFLAG,wname,All_LS,... All_ERR,All_POW,All_DIF,filterFLAG); end end dispGENERAL_Info(typeDISP,fileFLAG,wname,dispSTR_1) end %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% function dispGENERAL_Info(typeDISP,fileFLAG,wname,dispSTR) openDIARY(0,typeDISP,fileFLAG,wname) disp(dispSTR) diary off %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% function dispLP_Info_INI(typeDISP,fileFLAG,wname,Ha,Ga,Hs,Gs) % Open diary. %------------ openDIARY('fact',typeDISP,fileFLAG,wname) % Perfect Reconstruction and Anti-Aliasing Conditions. %----------------------------------------------------- CNS_5_2 = Hs * reflect(Ha) + Gs * reflect(Ga); CNS_5_3 = Hs * modulate(reflect(Ha)) + Gs * modulate(reflect(Ga)); %-------------------------------------- disp('##############################'); disp(getWavMSG('Wavelet:moreMSGRF:Str_WaveName',wname)) disp('----------------------'); disp(disp(Hs)); disp(disp(Gs)); disp(disp(Ha)); disp(disp(Ga)); disp(disp(CNS_5_2)); disp(disp(CNS_5_3)); disp('----------------------'); % Close diary. %------------- diary off %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% function dispLP_Info(typeDISP,fileFLAG,wname,Hs,Gs,PolyMAT) % Open diary. %------------ openDIARY(0,typeDISP,fileFLAG,wname) % Display. %--------- len_H = length(lp2num(Hs)); len_G = length(lp2num(Gs)); len_E_H = length(lp2num(PolyMAT{1,1})); len_O_H = length(lp2num(PolyMAT{2,1})); len_E_G = length(lp2num(PolyMAT{1,2})); len_O_G = length(lp2num(PolyMAT{2,2})); str2disp_1 = [... 'len_Hs = ' , sprintf('%2.0f',len_H) , ' - ' ,... 'len_Gs = ' , sprintf('%2.0f',len_G) ... ]; str2disp_2 = [... 'len_EvenHs = ' , sprintf('%2.0f',len_E_H) , ' - ' ,... 'len_OddHs = ' , sprintf('%2.0f',len_O_H) ... ]; str2disp_3 = [... 'len_EvenGs = ' , sprintf('%2.0f',len_E_G) , ' - ' ,... 'len_OddGs = ' , sprintf('%2.0f',len_O_G) ... ]; disp(str2disp_1); disp('%---+---+---+---+---+---+---+---%') disp(str2disp_2); disp(str2disp_3); disp('%---+---+---+---+---+---+---+---+---+---+---%') % Close diary. %------------- diary off %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% function dispFACT_Info(typeDISP,fileFLAG,wname,nbFACT,errTAB,errFlags) % Open diary. %------------ openDIARY(0,typeDISP,fileFLAG,wname) % Display. %--------- disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_1',nbFACT)); disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_2',nbFACT)) disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_3',sprintf('%3.0f',find(errFlags==0)))); disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_4',sprintf('%12.8f',errTAB(errFlags==0)))); % Close diary. %------------- diary off %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% function dispFACT(typeDISP,fileFLAG,wname,All_FACT) % Format. %-------- format long % Open diary. %------------ openDIARY(1,typeDISP,fileFLAG,wname) % Display. %---------- nbFACT = length(All_FACT); disp('#################################################################') disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_5',wname,nbFACT)); disp('====================================='); disp(' ') for k = 1:nbFACT disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_6',k)) disp('--------------------'); disp(' ') dec = All_FACT{k}; lenFACT = length(dec); for j = 1:lenFACT dispSTR = disp(dec{j},['M' int2str(j)]); disp(dispSTR); disp(' ') end disp('----------------------------------------------'); end disp('#################################################################') % Close diary. %------------- format; diary off %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% function dispLS(typeDISP,fileFLAG,wname,All_LS,... All_ERR,All_POW,All_DIF,filterFLAG) % Tolerance and format. %--------------------- tolerance = 1.E-8; format long % Open diary. %------------ openDIARY(1,typeDISP,fileFLAG,wname) % Display. %---------- nbLS = length(All_LS); disp('#################################################################') disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_5',wname,nbLS)); disp('====================================='); disp(' ') for k = 1:nbLS LSstr = displs(All_LS{k},'%20.16f'); disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_7',k)) disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_8',All_POW(k),All_DIF(k))) disp('%---+----+----+----+----+---%'); disp(LSstr) disp(' ') disp(['Error: ' , num2str(All_ERR(k),16)]); [LoD,HiD,LoR,HiR,prim_LoD,prim_HiD,prim_LoR,prim_HiR] = ... ls2filters(All_LS{k},'a_num'); disp(' '); if filterFLAG disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_9')) disp(['LoD = [', sprintf('%15.8f',LoD) , ' ]']); disp(['HiD = [', sprintf('%15.8f',HiD) , ' ]']); disp(['LoR = [', sprintf('%15.8f',LoR) , ' ]']); disp(['HiR = [', sprintf('%15.8f',HiR) , ' ]']); disp(['prim_LoD = [', sprintf('%15.8f',prim_LoD) , ' ]']); disp(['prim_HiD = [', sprintf('%15.8f',prim_HiD) , ' ]']); disp(['prim_LoR = [', sprintf('%15.8f',prim_LoR) , ' ]']); disp(['prim_HiR = [', sprintf('%15.8f',prim_HiR) , ' ]']); disp('%=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=%'); end end disp('%--------------------------------------------------------%') eqTAB = tablseq(All_LS,tolerance); idx = []; for k = 1:length(eqTAB) if ~isempty(eqTAB{k}) idx = [idx , k]; %#ok<AGROW> end end if ~isempty(idx) disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_10',idx)) eqTAB(idx) else disp(getWavMSG('Wavelet:moreMSGRF:FactLS_MSG_11')) end disp('%--------------------------------------------------------%') disp('#################################################################') % Close diary. %------------- format; diary off %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---% function openDIARY(OPT,typeDISP,fileFLAG,wname) % Open diary. %------------ diaFILE = [typeDISP '_' wname]; if fileFLAG switch OPT case 0 if ~isequal(typeDISP,'All') diaFILE = ['Info_' wname]; end case 1 , case 'fact' if ~isequal(typeDISP,'All') diaFILE = ['fact_' wname]; end case 'LS' if ~isequal(typeDISP,'All') diaFILE = ['LS_' wname]; end end diaFILE(diaFILE=='.') = '_'; diaFILE = [diaFILE '.m']; diary(diaFILE); end %---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---%