/**
* JWave - Java implementation of wavelet transform algorithms
*
* Copyright 2010-2012 Christian Scheiblich
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file FastWaveletTransform.java is part of JWave.
*
* @author Christian Scheiblich
* date 23.02.2010 05:42:23
* contact graetz@mailfish.de
*/
package math.transform.jwave.handlers;
import math.transform.jwave.handlers.wavelets.Wavelet;
import math.transform.jwave.handlers.wavelets.WaveletInterface;
/**
* Base class for the forward and reverse Fast Wavelet Transform in 1-D, 2-D,
* and 3-D using a specified Wavelet by inheriting class.
*
* @date 10.02.2010 08:10:42
* @author Christian Scheiblich
*/
public class FastWaveletTransform extends WaveletTransform {
/**
* Constructor receiving a Wavelet object.
*
* @date 10.02.2010 08:10:42
* @author Christian Scheiblich
* @param wavelet
* object of type Wavelet; Haar02, Daub02, Coif06, ...
*/
public FastWaveletTransform( WaveletInterface wavelet ) {
super(wavelet);
} // FastWaveletTransform
/**
* Constructor receiving a Wavelet object.
*
* @date 10.02.2010 08:10:42
* @author Christian Scheiblich
* @param wavelet
* object of type Wavelet; Haar02, Daub02, Coif06, ...
*/
public FastWaveletTransform( WaveletInterface wavelet, int iteration ) {
super(wavelet, iteration);
} // FastWaveletTransform
/**
* Performs the 1-D forward transform for arrays of dim N from time domain to
* Hilbert domain for the given array using the Fast Wavelet Transform (FWT)
* algorithm.
*
* @date 10.02.2010 08:23:24
* @author Christian Scheiblich
* @see math.transform.jwave.handlers.BasicTransform#forward(double[])
*/
@Override
public double[ ] forwardWavelet( double[ ] arrTime ) {
double[ ] arrHilb = new double[ arrTime.length ];
for( int i = 0; i < arrTime.length; i++ )
arrHilb[ i ] = arrTime[ i ];
int level = 0;
int h = arrTime.length;
int minWaveLength = _wavelet.getWaveLength( );
if( h >= minWaveLength ) {
while( h >= minWaveLength ) {
double[ ] iBuf = new double[ h ];
for( int i = 0; i < h; i++ )
iBuf[ i ] = arrHilb[ i ];
double[ ] oBuf = _wavelet.forward( iBuf );
for( int i = 0; i < h; i++ )
arrHilb[ i ] = oBuf[ i ];
h = h >> 1;
level++;
} // levels
} // if
return arrHilb;
} // forward
/**
* Performs the 1-D reverse transform for arrays of dim N from Hilbert domain
* to time domain for the given array using the Fast Wavelet Transform (FWT)
* algorithm and the selected wavelet.
*
* @date 10.02.2010 08:23:24
* @author Christian Scheiblich
* @see math.transform.jwave.handlers.BasicTransform#reverse(double[])
*/
@Override
public double[ ] reverseWavelet( double[ ] arrHilb ) {
double[ ] arrTime = new double[ arrHilb.length ];
for( int i = 0; i < arrHilb.length; i++ )
arrTime[ i ] = arrHilb[ i ];
int level = 0;
int minWaveLength = _wavelet.getWaveLength( );
int h = minWaveLength;
if( arrHilb.length >= minWaveLength ) {
while( h <= arrTime.length && h >= minWaveLength ) {
double[ ] iBuf = new double[ h ];
for( int i = 0; i < h; i++ )
iBuf[ i ] = arrTime[ i ];
double[ ] oBuf = _wavelet.reverse( iBuf );
for( int i = 0; i < h; i++ )
arrTime[ i ] = oBuf[ i ];
h = h << 1;
level++;
} // levels
} // if
return arrTime;
} // reverse
/**
* Performs the 1-D forward transform for arrays of dim N from time domain to
* Hilbert domain for the given array using the Fast Wavelet Transform (FWT)
* algorithm. The number of transformation levels applied is limited by
* threshold.
*
* @date 15.07.2010 13:26:26
* @author Thomas Haider
* @date 15.08.2010 00:31:36
* @author Christian Scheiblich
* @see math.transform.jwave.handlers.BasicTransform#forward(double[], int)
*/
@Override
public double[ ] forwardWavelet( double[ ] arrTime, int toLevel ) {
double[ ] arrHilb = new double[ arrTime.length ];
for( int i = 0; i < arrTime.length; i++ )
arrHilb[ i ] = arrTime[ i ];
int level = 0;
int h = arrTime.length;
int minWaveLength = _wavelet.getWaveLength( );
if( h >= minWaveLength ) {
while( h >= minWaveLength && level < toLevel ) {
double[ ] iBuf = new double[ h ];
for( int i = 0; i < h; i++ )
iBuf[ i ] = arrHilb[ i ];
double[ ] oBuf = _wavelet.forward( iBuf );
for( int i = 0; i < h; i++ )
arrHilb[ i ] = oBuf[ i ];
h = h >> 1;
level++;
} // levels
} // if
return arrHilb;
} // forward
/**
* Performs the 1-D reverse transform for arrays of dim N from Hilbert domain
* to time domain for the given array using the Fast Wavelet Transform (FWT)
* algorithm and the selected wavelet. The number of transformation levels
* applied is limited by threshold.
*
* @date 15.07.2010 13:28:06
* @author Thomas Haider
* @date 15.08.2010 00:31:09
* @author Christian Scheiblich
* @date 20.06.2011 13:03:27
* @author Pol Kennel
* @see math.transform.jwave.handlers.BasicTransform#reverse(double[], int)
*/
@Override
public double[ ] reverseWavelet( double[ ] arrHilb, int fromLevel ) {
double[ ] arrTime = new double[ arrHilb.length ];
for( int i = 0; i < arrHilb.length; i++ )
arrTime[ i ] = arrHilb[ i ];
int level = 0;
int minWaveLength = _wavelet.getWaveLength( );
// int h = minWaveLength; // bug ... 20110620
int h = (int)( arrHilb.length / ( Math.pow( 2, fromLevel - 1 ) ) ); // added by Pol
if( arrHilb.length >= minWaveLength ) {
while( h <= arrTime.length && h >= minWaveLength && level < fromLevel ) {
double[ ] iBuf = new double[ h ];
for( int i = 0; i < h; i++ )
iBuf[ i ] = arrTime[ i ];
double[ ] oBuf = _wavelet.reverse( iBuf );
for( int i = 0; i < h; i++ )
arrTime[ i ] = oBuf[ i ];
h = h << 1;
level++;
} // levels
} // if
return arrTime;
} // reverse
} // class