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

    function wft = waveft2(WAV,omegaX,omegaY,varargin)
%WAVEFT2 Wavelet Fourier transform 2-D.
%   WAVEFT2 computes the wavelet values in the frequency plane.

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 10-Aug-2010.
%   Last Revision: 15-Apr-2013.
%   Copyright 1995-2013 The MathWorks, Inc.

if nargin<2
    wft = getDefault(WAV);
    return
elseif isequal(nargin,2) && isequal(omegaX,'Control_PARAM')
    wft = Control_WAV_Param(WAV);
    return
else
    wname = WAV.wname;
    varargin = WAV.param;
    if ~iscell(varargin) , varargin = {varargin}; end
end

%---------------------------------------------------
% 'cauchy'      - 2D Cauchy Wavelet in frequency plane
% 'endstop1'    - Single 2D EndStop Wavelet in frequency plane
% 'morl'        - 2D Morlet Wavelet in frequency plane
% 'rmorl'       - Real 2D Morlet Wavelet in frequency plane
%---------------------------------------------------
switch wname
    case 'mexh' ,      wft = mexh(omegaX,omegaY,varargin{:});
    case 'dog' ,       wft = dog(omegaX,omegaY,varargin{:});
    case 'cauchy' ,    wft = cauchy(omegaX,omegaY,varargin{:});
    case 'dogpow' ,    wft = dogpow(omegaX,omegaY,varargin{:});
    case 'endstop1' ,  wft = endstop1(omegaX,omegaY,varargin{:});
    case 'endstop2' ,  wft = endstop2(omegaX,omegaY,varargin{:});
    case 'escauchy' ,  wft = escauchy(omegaX,omegaY,varargin{:});
    case 'esmorl' ,    wft = esmorl(omegaX,omegaY,varargin{:});
    case 'esmexh' ,    wft = esmexh(omegaX,omegaY,varargin{:});
    case 'gaus' ,      wft = gaus(omegaX,omegaY,varargin{:});
    case 'gaus2' ,     wft = gaus2(omegaX,omegaY,varargin{:});
    case 'gaus3' ,     wft = gaus3(omegaX,omegaY,varargin{:});
    case 'isodog' ,    wft = isodog(omegaX,omegaY,varargin{:});
    case 'isomorl' ,   wft = isomorl(omegaX,omegaY,varargin{:});
    case 'morl' ,      wft = morlet(omegaX,omegaY,varargin{:});
    case 'pethat' ,    wft = pethat(omegaX,omegaY,varargin{:});
    case 'rmorl' ,     wft = rmorlet(omegaX,omegaY,varargin{:});
    case 'sdog' ,      wft = sdog(omegaX,omegaY,varargin{:});
    case 'dog2' ,      wft = dog2(omegaX,omegaY,varargin{:});
    case 'wheel' ,     wft = wheel(omegaX,omegaY,varargin{:});
    case 'paul' ,      wft = paul(omegaX,omegaY,varargin{:});
    case 'gabmexh' ,   wft = gabmexh(omegaX,omegaY,varargin{:});
    case 'sinc' ,      wft = sincw(omegaX,omegaY,varargin{:});
    case 'fan' ,       wft = fan(omegaX,omegaY,varargin{:});
end
%--------------------------------------------------------------------------
function OkWAV = Control_WAV_Param(WAV)

OkWAV = true;
wname = WAV.wname;
param = WAV.param;   %#ok<*NASGU>
return;

% WAV.wname = wname;
% WAV.param = param;
% WAV_Param_Table = {...
%     'morl'      , {'Omega0','6','6';'Sigma',1,1;'Epsilon',1,1}; ...
%     'mexh'      , {'p',2,2;'sigmax',1,1;'sigmay',1,1}; ...
%     'paul'      , {'p',4,4}; ...
%     'dog'       ,
%       defaults: alpha = 1.25;
%     'cauchy'    ,
%       defaults:  alpha = pi/6; sigma = 1; L = 4; M = 4;
%     'escauchy'  , {'alpha','pi/6','pi/6';'L',4,4;'M',4,4;'sigma',1,1;'Omega0',1,1}; ...
%     'gaus'      , {'p',1,1;'sigmax',1,1;'sigmay',1,1}; ...
%     'wheel'     , {'sigma',2,2}; ...
%     'pethat'    , {};...
%     'dogpow'    , {'alpha',1.25,1.25;'p',2,2}; ...
%     'esmorl'    , {'Omega0','6','6';'Sigma',1,1;'Epsilon',1,1}; ...
%     'esmexh'    , {'sigma',1,1;'epsilon',0.5,0.5}; ...
%     'gaus2'     , {'p',1,1;'sigmax',1,1;'sigmay',1,1}; ...
%     'gaus3'     , {'A',1,1;'B',1,1;'p',1,1;'sigmax',1,1;'sigmay',1,1}; ...
%     'isodog'    , {'alpha',1.25,1.25}; ...
%     'dog2'      , {'alpha',1.25,1.25}; ...
%     'isomorl'   , {'Omega0','6','6';'Sigma',1,1}; ...
%     'rmorl'     , {'Omega0','6','6';'Sigma',1,1;'Epsilon',1,1}; ...
%     'endstop1'  , {'Omega0','6','6';'Sigma',1,1;'Epsilon',1,1}; ...
%     'endstop2'  , {'Omega0','6','6';'Sigma',1,1}; ...
%     'gabmexh'   , {'Omega0','5.336','5.336';'Epsilon',1,1}; ...
%     'sinc'      , {'Ax',1,1;'Ay',1,1;'p',1,1;'Omega0X',0,0;'Omega0Y',0,0}; ...
%     'fan'       , {'Omega0','5.336','5.336';'Sigma',1,1;'Epsilon',1,1;'J',6.5,,6.5}}; ...
%     };
%--------------------------------------------------------------------------


%--------------------------------------------------------------------------
function wft = getDefault(wname)

switch wname
    case 'mexh' ,  wft = {'order',2,'sigmax',1,'sigmay',1};
    case {'gaus','gaus2'} ,  wft = {'order',1,'sigmax',1,'sigmay',1};
    case {'dog'} ,   wft = {'order',2,'sigma',1};
    case {'cauchy','escauchy'} , wft = {'coneAngle',pi/6,'sigma',1,'L',4,'M',4};
    case 'dogpow' ,              wft = {'alpha',1.25,'p',2};
    case{'endstop1'}, wft = {'omega0',6};
    case {'esmorl','morl','rmorl'}
        wft = {'omega0',6,'sigma',1,'epsilon',1};
    case {'endstop2','isomorl'} ,   wft = {'omega0',6,'sigma',1};
    case 'esmexh' ,                 wft = {'sigma',1,'epsilon',0.5};
    case {'gaus3'} ,                wft = {'A',1,'B',1,'order',1,'sigma',1};
    case {'isodog','dog2'}  ,wft = {'alpha', 1.25};
    case 'pethat' ,                 wft = {};
    case 'wheel' ,                  wft = {'sigma',2};
    case 'paul' ,                   wft = {'order',4};
    case 'gabmexh' ,                wft = {'Omega0',5.336,'Epsilon',1};
    case 'sinc' , wft = {'Ax',1,'Ay',1,'p',1,'omega0X',0,'omega0Y',0};
    case 'fan' ,  wft = {'omega0',5.336,'sigma',1,'epsilon',1,'J',6.5};
end
%--------------------------------------------------------------------------
function wft = morlet(omegaX,omegaY,varargin)

nbIN = length(varargin);
switch nbIN
    case 0 , epsilon = 1; sigma = 1; omega0 = 2;
    case 1 , epsilon = 1; sigma = 1; omega0 = varargin{1};
    case 2 , epsilon = varargin{2}; sigma = varargin{2}; omega0 = varargin{1};
    case 3 , epsilon = varargin{3}; sigma = varargin{2}; omega0 = varargin{1};
    otherwise
        error(message('Wavelet:FunctionInput:TooManyParams'));
end

% Computing the wavelet in frequency domain
wft = exp( - sigma^2 * ((omegaX - omega0).^2 + (epsilon*omegaY).^2)/2 );
%--------------------------------------------------------------------------
function wft = esmorl(omegaX,omegaY,varargin)

nbIN = length(varargin);
switch nbIN
    case 0 , epsilon = 1; sigma = 1; omega0 = 2;
    case 1 , epsilon = 1; sigma = 1; omega0 = varargin{1};
    case 2 , epsilon = varargin{2}; sigma = varargin{2}; omega0 = varargin{1};
    case 3 , epsilon = varargin{3}; sigma = varargin{2}; omega0 = varargin{1};
    otherwise
        error(message('Wavelet:FunctionInput:TooManyParams'));
end

% Computing the wavelet in frequency domain
wft = -omegaY.^2 .* exp( - sigma^2 * ((omegaX - omega0).^2 + (epsilon*omegaY).^2)/2 );
%--------------------------------------------------------------------------
function wft = mexh(omegaX,omegaY,varargin)

nbIN = length(varargin);
switch nbIN
    case 0 , sigmay = 1; sigmax = 1; order = 2;
    case 1 , sigmay = 1; sigmax = 1; order = varargin{1};
    case 2 , sigmay = varargin{2}; sigmax = varargin{2}; order = varargin{1};
    case 3 , sigmay = varargin{3}; sigmax = varargin{2}; order = varargin{1};
    otherwise
        error(message('Wavelet:FunctionInput:TooManyParams'));
end

% Computing the wavelet in frequency domain
wft = - (2*pi) * (omegaX.^2 + omegaY.^2).^(order/2) ...
    .* exp( - ((sigmax*omegaX).^2 + (sigmay*omegaY).^2) / 2 );
%--------------------------------------------------------------------------
function wft = esmexh(omegaX,omegaY,sigma,epsilon)

% Computing the wavelet in frequency domain
T  = atan2(omegaY,omegaX)/epsilon;
wft = sin(T) .* (omegaX.^2 + omegaY.^2) .* ...
    exp( - sigma^2 * (omegaX.^2 + omegaY.^2) / 2 ) .* ...
    exp( - T.^2 / 2);
%--------------------------------------------------------------------------
function wft = paul(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , order = 4; else order = varargin{1}; end
factor1 = (2.^order)./sqrt(order.*gamma(2*order));
sqr_mod_D2 = (omegaX.^2 + omegaY.^2)/2;

wft = factor1 .* sqr_mod_D2.^order .* exp( -sqr_mod_D2 );
for i=1:size(wft,1)
    for j=1:size(wft,2)
        if j < size(wft,2)/2+4
            wft(i,j) = 0;
        end
    end
end
%--------------------------------------------------------------------------
function wft = gaus(omegaX,omegaY,varargin)

nbIN = length(varargin);
switch nbIN
    case 0 , sigmay = 1; sigmax = 1; order = 1;
    case 1 , sigmay = 1; sigmax = 1; order = varargin{1};
    case 2 , sigmay = varargin{2}; sigmax = varargin{2}; order = varargin{1};
    case 3 , sigmay = varargin{3}; sigmax = varargin{2}; order = varargin{1};
    otherwise
        error(message('Wavelet:FunctionInput:TooManyParams'));
end

% Computing the wavelet in frequency domain
wft = (1i*omegaX) .^ order ...
    .* exp( - ((sigmax*omegaX).^2 + (sigmay*omegaY).^2) / 2 );
%--------------------------------------------------------------------------
function wft = dog(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , alpha = 1.25; else alpha = varargin{1}; end

% Computing the wavelet in frequency domain
M = (omegaX.^2 + omegaY.^2)/2;
wft = - exp( - M ) + exp( - alpha^2 * M );
%--------------------------------------------------------------------------
function wft = isodog(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , alpha = 1.25; else alpha = varargin{1}; end

% Computing the wavelet in frequency domain
M = (omegaX.^2 + omegaY.^2)/2;
wft = (- exp( - M ) + alpha^2 * exp( - alpha^2 * M ))/(alpha^2 -1);
%--------------------------------------------------------------------------
function wft = dogpow(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , alpha = 1.25; else alpha = varargin{1}; end
if nbIN<2 , pow   = 2;    else pow = varargin{2}; end

% Computing the wavelet in frequency domain
M = (omegaX.^2 + omegaY.^2)/2;
wft = (- exp( - M ) + exp( - alpha^2 * M )).^pow;
%--------------------------------------------------------------------------
function wft = dog2(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , alpha = 1.25; else alpha = varargin{1}; end

% % Computing the wavelet in frequency domain
% M = (omegaX.^2 + omegaY.^2);
% A = alpha^2;
% wft = ( 0.5 * exp(-M/4) + 1/(2*A) * exp (-A*M /4) ...
%             - 2/(A+1) * exp (-A*M/(2*(A+1)) ))/(2*pi);

M = (omegaX.^2 + omegaY.^2)/2;
wft = (- exp( - M ) + exp( - alpha^2 * M )).^3;
%--------------------------------------------------------------------------
function wft = cauchy(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , coneAngle = pi/6; else coneAngle = varargin{1}; end
if nbIN<2 , sigma = 1; else sigma = varargin{2}; end
if nbIN<3 , L = 4; else L = varargin{3}; end
if nbIN<4 , M = 4; else M = varargin{4}; end

% Computing the wavelet in frequency domain
dot1  =  sin(coneAngle)*omegaX + cos(coneAngle)*omegaY;
dot2  = -sin(coneAngle)*omegaX + cos(coneAngle)*omegaY;
coeff = (dot1.^L).*(dot2.^M);

k0    = (L+M)^0.5 * (sigma - 1)/sigma;
rad2  = 0.5 * sigma * ( (omegaX-k0).^2 + omegaY.^2 );
pond  = tan(coneAngle)*omegaX  > abs(omegaY);
wft   = pond .* coeff .* exp(- rad2 );
%--------------------------------------------------------------------------
function wft = endstop1(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , omega0 = 6; else omega0 = varargin{1}; end

% Computing the wavelet in frequency domain
M = (omegaX.^2 + omegaY.^2)/2;
wft = (-1i*omegaX).*exp(-M).*exp(-((omegaY-omega0).^2 + omegaX.^2)/2);
%--------------------------------------------------------------------------
function wft = endstop2(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , omega0 = 6; else omega0 = varargin{1}; end
if nbIN<2 , sigma = 1; else sigma = varargin{2}; end

% Computing the wavelet in frequency domain
sigma2  = sigma^2;
omegaX2 = omegaX^2;
omegaY2 = omegaY^2;
M = (omegaX2 + omegaY2)/2;
wft = -1/(8*sigma2^2) * (omegaX.^2 - sigma2) .* ...
    exp(-((omegaY-omega0).^2 + omegaX.^2)/2) .* ...
    exp(-M/sigma2);
%--------------------------------------------------------------------------
function wft = escauchy(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , coneAngle = pi/6; else coneAngle = varargin{1}; end
if nbIN<2 , sigma = 1; else sigma = varargin{2}; end
if nbIN<3 , L = 4; else L = varargin{3}; end
if nbIN<4 , M = 4; else M = varargin{4}; end

% Computing the wavelet in frequency domain
dot1  =  sin(coneAngle)*omegaX + cos(coneAngle)*omegaY;
dot2  = -sin(coneAngle)*omegaX + cos(coneAngle)*omegaY;
coeff = (dot1.^L).*(dot2.^M);

k0   = (L+M)^0.5 * (sigma - 1)/sigma;
rad2 = 0.5 * sigma * ( (omegaX-k0).^2 + omegaY.^2 );
pond = tan(coneAngle)*omegaX  > abs(omegaY);
wft  = -omegaY.^2 .* pond .* coeff .* exp(- rad2 );
%--------------------------------------------------------------------------
function wft = gaus2(omegaX,omegaY,varargin)

nbIN = length(varargin);
switch nbIN
    case 0 , sigmay = 1; sigmax = 1; order = 1;
    case 1 , sigmay = 1; sigmax = 1; order = varargin{1};
    case 2 , sigmay = varargin{2}; sigmax = varargin{2}; order = varargin{1};
    case 3 , sigmay = varargin{3}; sigmax = varargin{2}; order = varargin{1};
    otherwise
end

% Computing the wavelet in frequency domain
wft = (1i*(omegaX+1i*omegaY)) .^ order ...
    .* exp( - ((sigmax*omegaX).^2 + (sigmay*omegaY).^2) / 2 );
%--------------------------------------------------------------------------
function wft = gaus3(omegaX,omegaY,varargin)

nbIN = length(varargin);
switch nbIN
    case 0 , sigmay = 1; sigmax = 1; order = 1; B = 1; A = 1;
    case 1 , sigmay = 1; sigmax = 1; order = 1; B = 1; A = varargin{1};
    case 2 ,
        sigmay = 1; sigmax = 1; order = 1;
        B = varargin{2}; A = varargin{1};
    case 3 ,
        sigmay = 1; sigmax = 1; order = varargin{3};
        B = varargin{2}; A = varargin{1};
    case 4
        sigmay = 1; sigmax = varargin{4}; order = varargin{3};
        B = varargin{2}; A = varargin{1};
    case 5
        sigmay = varargin{5}; sigmax = varargin{4}; order = varargin{3};
        B = varargin{2}; A = varargin{1};
    otherwise
end

% Computing the wavelet in frequency domain
wft = (1i*(A*omegaX +B* 1i*omegaY)) .^ order ...
    .* exp( - ((sigmax*omegaX).^2 + (sigmay*omegaY).^2) / 2 );
%--------------------------------------------------------------------------
function wft = isomorl(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , omega0 = 6; else omega0 = varargin{1}; end
if nbIN<2 , sigma = 1; else sigma = varargin{2}; end

% Computing the wavelet in frequency domain
wft = - exp( - sigma^2 * (abs(omegaX+1i*omegaY) - omega0).^2 /2 );
%--------------------------------------------------------------------------
function wft = rmorlet(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , omega0 = 6; else omega0 = varargin{1}; end
if nbIN<2 , sigma = 1; else sigma = varargin{2}; end
if nbIN<3 , epsilon = 1; else epsilon = varargin{3}; end

% Computing the wavelet in frequency domain
wft = exp( - sigma^2 * ((omegaX - omega0).^2 + (epsilon*omegaY).^2)/2 ) + ...
    exp( - sigma^2 * ((omegaX + omega0).^2 + (epsilon*omegaY).^2)/2 );
%--------------------------------------------------------------------------
function wft = wheel(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , sigma = 2; else sigma = varargin{1}; end
if (sigma<=1)
    error(getWavMSG('Wavelet:dualtree:Err_Sigma'));
end

% Computing the Gaussian in frequency domain
M = abs(omegaX + 1i*omegaY);
M((M < (1/sigma)) | (M >= sigma)) = 1/sigma;
wft = cos( (pi/2)*log(M)/log(sigma)).^2;
%--------------------------------------------------------------------------
function wft = pethat(omegaX,omegaY,varargin)

% Computing the wavelet in frequency domain
M = abs(omegaX + 1i*omegaY);
M((M > 4*pi) | (M <pi)) = 4*pi;
wft = cos((pi/2)*log2(M/(2*pi))).^2;
%--------------------------------------------------------------------------
function wft = gabmexh(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , omega0  = 5.336; else omega0 = varargin{1}; end
if nbIN<2 , epsilon = 1; else epsilon = varargin{2}; end

% Computing the wavelet in frequency domain
wft = sqrt(epsilon) * (epsilon*omegaX.^2 + omegaY.^2) ...
    .* exp( - (epsilon*(omegaX).^2 + (omegaY-omega0).^2) / 2 );
%--------------------------------------------------------------------------
function wft = fan(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , omega0  = 5.336; else omega0 = varargin{1}; end
if nbIN<2 , sigma = 1; else sigma = varargin{2}; end
if nbIN<3 , epsilon = 1; else epsilon = varargin{3}; end
if nbIN<4 , J = 6.5; else J = varargin{4}; end

% Computing the wavelet in frequency domain
% J = nb_teta
total_teta = pi;
dteta = total_teta/(J+1);
wft = 0;
for r=0:J
    wft = wft + exp(-sigma^2*((omegaX-omega0.*cos(dteta.*r)).^2 ...
        + (epsilon*omegaY-omega0.*sin(dteta.*r)).^2)/2 );
end
wft = wft /(J+1);
%--------------------------------------------------------------------------
function wft = sincw(omegaX,omegaY,varargin)

nbIN = length(varargin);
if nbIN<1 , Ax = 1; else Ax = varargin{1}; end
if nbIN<2 , Ay = 1; else Ay = varargin{2}; end
if nbIN<3 , p = 1;  else p = varargin{3}; end
if nbIN<4 , omega0X = 0; else omega0X = varargin{4}; end
if nbIN<5 , omega0Y = 0; else omega0Y = varargin{5}; end

wft = wsinc(Ax*(omegaX-omega0X)).*(wsinc(Ay*(omegaY-omega0Y)).^p);
%--------------------------------------------------------------------------
function v = wsinc(t)

idx = find(t==0);
t(idx)= 1;
v = sin(pi*t)./(pi*t);
v(idx) = 1;
%--------------------------------------------------------------------------