www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wavelet/dw1dfile.m

    function [out1,out2,out3,out4] = dw1dfile(option,win_dw1dtool,in3,in4)
%DW1DFILE Discrete wavelet 1-D file manager.
%   [OUT1,OUT2,OUT3,OUT4] = DW1DFILE(OPTION,WIN_DW1DTOOL,IN3,IN4)

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
%   Last Revision 06-Jul-2012.
%   Copyright 1995-2012 The MathWorks, Inc.

% MemBloc0 of stored values.
%---------------------------
n_InfoInit   = 'DW1D_InfoInit';
ind_filename =  1;
ind_pathname =  2;
% nb0_stored   =  2;

% MemBloc1 of stored values.
%---------------------------
n_param_anal   = 'DWAn1d_Par_Anal';
ind_sig_name   = 1;
% ind_sig_size   = 2;
ind_wav_name   = 3;
ind_lev_anal   = 4;
% ind_axe_ref    = 5;
% ind_act_option = 6;
% ind_ssig_type  = 7;
% ind_thr_val    = 8;
% nb1_stored     = 8;

% MemBloc2 of stored values.
%---------------------------
n_coefs_longs = 'Coefs_and_Longs';
ind_coefs     = 1;
ind_longs     = 2;
% nb2_stored    = 2;

% MemBloc3 of stored values.
%---------------------------
n_synt_sig = 'Synt_Sig';
ind_ssig   =  1;
% nb3_stored =  1;

% MemBloc4 of stored values.
%---------------------------
n_miscella     = 'DWAn1d_Miscella';
% ind_graph_area =  1;
% ind_view_mode  =  2;
ind_savepath   =  3;
% nb4_stored     =  3;

% Default values.
%---------------- 
percentYLIM = 0.01;
epsilon = 0.01;
nbMinPt = 20;
Wave_Name = wmemtool('rmb',win_dw1dtool,n_param_anal,ind_wav_name);

switch option
    case 'anal'
        %******************************************************%
        %** OPTION = 'anal' -  Computing and saving Analysis.**%
        %******************************************************%
        % in3 optional (for 'load_dec' or 'synt' or 'new_anal')
        %------------------------------------------------------
        if nargin==2
            numopt = 1;
        elseif strcmp(in3,'new_anal')
            numopt = 2;
        else
            numopt = 3;
        end     

        % Getting  Analysis parameters.
        %------------------------------
        [Signal_Name,Level_Anal] =   ...
                wmemtool('rmb',win_dw1dtool,n_param_anal,  ...
                               ind_sig_name,ind_lev_anal  ...
                               );
        pathname = wmemtool('rmb',win_dw1dtool,n_InfoInit,ind_pathname);
        filename = wmemtool('rmb',win_dw1dtool,n_InfoInit,ind_filename);
        if numopt<3
            if numopt==1
                try
                    Anal_Data_Info = wtbxappdata('get',win_dw1dtool,...
                        'Anal_Data_Info');
                    Signal_Anal = Anal_Data_Info{1};
                catch %#ok<*CTCH>
                    try
                        load([pathname filename],'-mat');
                        Signal_Anal = eval(Signal_Name);
                        if size(Signal_Anal,1)>1 , Signal_Anal = Signal_Anal'; end
                    catch
                        [Signal_Anal,ok] = ...
                            utguidiv('direct_load_sig',win_dw1dtool,pathname,filename);
                        if ~ok
                            msg = getWavMSG('Wavelet:dw1dRF:ErrFile',filename);
                            wwaiting('off',win_dw1dtool);
                            errordlg(msg,getWavMSG('Wavelet:dw1dRF:LoadSigErr'),'modal');
                            return
                        end
                    end
                end
            else
                Signal_Anal = dw1dfile('sig',win_dw1dtool);
            end
            [coefs,longs] = wavedec(Signal_Anal,Level_Anal,Wave_Name);

            % Writing coefficients.
            %----------------------
            wmemtool('wmb',win_dw1dtool,n_coefs_longs,...
                           ind_coefs,coefs,ind_longs,longs);
        else
            [coefs,longs] = wmemtool('rmb',win_dw1dtool,n_coefs_longs,...
                                           ind_coefs,ind_longs);
        end

        % Saving.
        %-------
        out1 = wrcoef('a',coefs,longs,Wave_Name,0);
        wmemtool('wmb',win_dw1dtool,n_synt_sig,ind_ssig,out1);
        
    case 'comp_ss'
        %***********************************************************%
        %** OPTION = 'comp_ss' -  Computing and saving Synt. Sig. **%
        %***********************************************************%
        % Used by return_comp & return_deno
        % in3 = hdl_lin
        %------------------------------------
        ssig_rec = get(in3,'YData');
        wmemtool('wmb',win_dw1dtool,n_synt_sig,ind_ssig,ssig_rec);

    case 'app'
        [coefs,longs] = wmemtool('rmb',win_dw1dtool,n_coefs_longs,...
            ind_coefs,ind_longs);
        out1 = wrmcoef('a',coefs,longs,Wave_Name,in3);
        if nargin<4 , return; end;
        switch in4
            case 1
                lx = size(out1,2);
                l3 = length(in3);
                bord = getEdgeSize(in3,Wave_Name);
                lrem = lx+1-2*bord;
                out2 = zeros(1,l3);
                out4 = zeros(1,l3);
                out3 = zeros(1,l3);
                for k = 1:l3
                    if lrem(k)>nbMinPt
                        out2(k) = 1;
                        Xidx = bord(k):lrem(k)+bord(k);
                    else
                        Xidx = 1:lx;
                    end
                    [out3(k),out4(k)] = getMinMax(out1(k,Xidx),percentYLIM);
                end

            case 2
                [out2,out3] = getMinMax(out1,percentYLIM);

            case 3
                lx  = size(out1,2);
                l3  = length(in3);
                bord = getEdgeSize(in3,Wave_Name);
                lrem = lx+1-2*bord;
                out2 = zeros(1,l3);
                out3 = zeros(1,l3);
                for k = 1:l3
                    if lrem(k)>nbMinPt
                        Xidx = bord(k):lrem(k)+bord(k);
                    else
                        Xidx = 1:lx;
                    end
                    [out2(k),out3(k)] = getMinMax(out1(k,Xidx),percentYLIM);
                end
        end

    case 'det'
        [coefs,longs] = wmemtool('rmb',win_dw1dtool,n_coefs_longs,...
            ind_coefs,ind_longs);
        out1 = wrmcoef('d',coefs,longs,Wave_Name,in3);
        if nargin<4 , return; end;
        if in4==1
            lx = size(out1,2);
            l3 = length(in3);
            bord = getEdgeSize(in3,Wave_Name);
            lrem = lx+1-2*bord;
            out2 = zeros(1,l3);
            out4 = zeros(1,l3);
            out3 = zeros(1,l3);
            for k = 1:l3
                if lrem(k)>nbMinPt
                    out2(k) = 1;
                    Xidx = bord(k):lrem(k)+bord(k);
                else
                    Xidx = 1:lx;
                end
                [out3(k),out4(k)] = ...
                    getMinMax(out1(k,Xidx),percentYLIM);
            end
        elseif in4==2
            [out2,out3] = getMinMax(out1,percentYLIM);
        end

    case 'sig'
        [coefs,longs] = wmemtool('rmb',win_dw1dtool,n_coefs_longs,...
            ind_coefs,ind_longs);
        out1 = wrcoef('a',coefs,longs,Wave_Name,0);
        if nargin==3
            [out2,out3] = getMinMax(out1,percentYLIM);
        end

    case 'ssig'
        out1 = wmemtool('rmb',win_dw1dtool,n_synt_sig,ind_ssig);
        if nargin==3
            [out2,out3] = getMinMax(out1,percentYLIM);
        end

    case 'cfs_beg'
        [coefs,longs] = wmemtool('rmb',win_dw1dtool,n_coefs_longs,...
            ind_coefs,ind_longs);
        cfs_beg = wrepcoef(coefs,longs);
        out1 = cfs_beg(in3,:);
        if nargin<4 , return; end;
        if in4==1
            lx = size(out1,2);
            l3 = length(in3);
            bord = getEdgeSize(in3,Wave_Name);
            lrem = lx+1-2*bord;
            out2 = zeros(1,l3);
            out4 = zeros(1,l3);
            out3 = zeros(1,l3);
            for k = 1:l3
                if lrem(k)>nbMinPt
                    out2(k) = 1;
                    Xidx = bord(k):lrem(k)+bord(k);
                else
                    Xidx = 1:lx;
                end
                [out3(k),out4(k)] = ...
                    getMinMax(out1(k,Xidx),percentYLIM);
            end
        elseif in4==2
            [out2,out3] = getMinMax(out1,percentYLIM);
        end
        
    case 'app_cfs'
        [coefs,longs] = wmemtool('rmb',win_dw1dtool,n_coefs_longs,...
                                       ind_coefs,ind_longs);
        out1 = appcoef(coefs,longs,Wave_Name,in3);
        if nargin<4 , return; end;
        if in4==1
            bord = getEdgeSize(in3,Wave_Name);
            lx = size(out1,2);
            lrem = lx+1-2*bord;
            if lrem>nbMinPt
                out2 = 1;
                Xidx = (bord:lrem+bord);
                [out3,out4] = getMinMax(out1(Xidx),percentYLIM);
            else
                out2 = 0;
                out3 = -epsilon;
                out4 = epsilon;
            end
        elseif in4==2
            [out2,out3] = getMinMax(out1,percentYLIM);
        end

    case 'det_cfs'
        [coefs,longs] = wmemtool('rmb',win_dw1dtool,n_coefs_longs,...
                                       ind_coefs,ind_longs);
        out1 = detcoef(coefs,longs,in3);
        if nargin<4 , return; end;
        if in4==1
            bord = getEdgeSize(in3,Wave_Name);
            lx = size(out1,2);
            lrem = lx+1-2*bord;
            if lrem>nbMinPt
                out2 = 1;
                Xidx = bord:lrem+bord;
                [out3,out4] = getMinMax(out1(Xidx),percentYLIM);
            else
                out2 = 0;
                out3 = -epsilon;
                out4 = epsilon;
            end
        elseif in4==2
            [out2,out3] = getMinMax(out1,percentYLIM);
        end

    case 'del'
        %************************************%
        %** OPTION = 'del' -  Delete files.**%
        %************************************%
        pathname = wmemtool('rmb',win_dw1dtool,n_miscella,ind_savepath);
        if ~isempty(pathname)
           try    
               cd(pathname);
           catch
               return;
           end
        end
        wmemtool('wmb',win_dw1dtool,n_miscella,ind_savepath,'');
end


%---------------------------------------------------------------
function [mini,maxi] = getMinMax(val,percent)

[~,dim] = max(size(val));
mini  = min(val,[],dim);
maxi  = max(val,[],dim);
delta = max([maxi-mini,sqrt(eps)]);
mini  = mini-percent*delta;
maxi  = maxi+percent*delta;
%---------------------------------------------------------------
function edgeS = getEdgeSize(lev,wname)

f = wfilters(wname);
edgeS = (2.^(lev+1))+ length(f);
%---------------------------------------------------------------