diff --git a/vtkm/worklet/Wavelets.h b/vtkm/worklet/Wavelets.h index 58de95436..dd4114409 100644 --- a/vtkm/worklet/Wavelets.h +++ b/vtkm/worklet/Wavelets.h @@ -30,121 +30,120 @@ namespace vtkm { namespace worklet { +// Wavelet filter class; +// functionally equivalent to WaveFiltBase and its subclasses in VAPoR. +class WaveletFilter +{ +public: + // constructor + WaveletFilter( const std::string &wname ) + { + lowDecomposeFilter = highDecomposeFilter = + lowReconstructFilter = highReconstructFilter = NULL; + this->filterLength = 0; + if( wname.compare("CDF9/7") == 0 ) + { + this->filterLength = 9; + AllocateFilterMemory(); + wrev( vtkm::worklet::internal::hm4_44, lowDecomposeFilter, filterLength ); + qmf_wrev( vtkm::worklet::internal::h4, highDecomposeFilter, filterLength ); + verbatim_copy( vtkm::worklet::internal::h4, lowReconstructFilter, filterLength ); + qmf_even( vtkm::worklet::internal::hm4_44, highReconstructFilter, filterLength ); + } + else + { + // throw an error here + } + } + + // destructor + virtual ~WaveletFilter() + { + if( lowDecomposeFilter ) delete[] lowDecomposeFilter; + if( highDecomposeFilter ) delete[] highDecomposeFilter; + if( lowReconstructFilter ) delete[] lowReconstructFilter; + if( highReconstructFilter ) delete[] highReconstructFilter; + } + +protected: + vtkm::Id filterLength; + vtkm::Float64* lowDecomposeFilter; + vtkm::Float64* highDecomposeFilter; + vtkm::Float64* lowReconstructFilter; + vtkm::Float64* highReconstructFilter; + + void AllocateFilterMemory() + { + lowDecomposeFilter = new vtkm::Float64[ this->filterLength ]; + highDecomposeFilter = new vtkm::Float64[ this->filterLength ]; + lowReconstructFilter = new vtkm::Float64[ this->filterLength ]; + highReconstructFilter = new vtkm::Float64[ this->filterLength ]; + } + + // Flipping operation; helper function to initialize a filter. + void wrev( const vtkm::Float64* sigIn, vtkm::Float64* sigOut, vtkm::Id sigLength ) + { + for( vtkm::Id count = 0; count < sigLength; count++) + sigOut[count] = sigIn[sigLength - count - 1]; + } + + // Quadrature mirror filtering operation: helper function to initialize a filter. + void qmf_even ( const vtkm::Float64* sigIn, vtkm::Float64* sigOut, vtkm::Id sigLength ) + { + for (vtkm::Id count = 0; count < sigLength; count++) + { + sigOut[count] = sigIn[sigLength - count - 1]; + + if (sigLength % 2 == 0) { + if (count % 2 != 0) { + sigOut[count] = -1.0 * sigOut[count]; + } + } + else { + if (count % 2 == 0) { + sigOut[count] = -1.0 * sigOut[count]; + } + } + } + } + + // Flipping and QMF at the same time: helper function to initialize a filter. + void qmf_wrev ( const vtkm::Float64* sigIn, vtkm::Float64* sigOut, vtkm::Id sigLength ) + { + for (vtkm::Id count = 0; count < sigLength; count++) { + sigOut[count] = sigIn[sigLength - count - 1]; + + if (sigLength % 2 == 0) { + if (count % 2 != 0) { + sigOut[count] = -1 * sigOut[count]; + } + } + else { + if (count % 2 == 0) { + sigOut[count] = -1 * sigOut[count]; + } + } + } + + vtkm::Float64 tmp; + for (vtkm::Id count = 0; count < sigLength/2; count++) { + tmp = sigOut[count]; + sigOut[count] = sigOut[sigLength - count - 1]; + sigOut[sigLength - count - 1] = tmp; + } + } + + // Verbatim Copying: helper function to initialize a filter. + void verbatim_copy ( const vtkm::Float64* sigIn, vtkm::Float64* sigOut, vtkm::Id sigLength ) + { + for (vtkm::Id count = 0; count < sigLength; count++) + sigOut[count] = sigIn[count]; + } +}; // class Filter + class Wavelets { public: - - // Wavelet filter class; - // functionally equivalent to WaveFiltBase and its subclasses in VAPoR. - class Filter - { - public: - // constructor - Filter( const std::string &wname ) - { - lowDecomposeFilter = highDecomposeFilter = - lowReconstructFilter = highReconstructFilter = NULL; - this->filterLength = 0; - if( wname.compare("CDF9/7") == 0 ) - { - this->filterLength = 9; - AllocateFilterMemory(); - wrev( vtkm::worklet::internal::hm4_44, lowDecomposeFilter, filterLength ); - qmf_wrev( vtkm::worklet::internal::h4, highDecomposeFilter, filterLength ); - verbatim_copy( vtkm::worklet::internal::h4, lowReconstructFilter, filterLength ); - qmf_even( vtkm::worklet::internal::hm4_44, highReconstructFilter, filterLength ); - } - else - { - // throw an error here - } - } - - // destructor - virtual ~Filter() - { - if( lowDecomposeFilter ) delete[] lowDecomposeFilter; - if( highDecomposeFilter ) delete[] highDecomposeFilter; - if( lowReconstructFilter ) delete[] lowReconstructFilter; - if( highReconstructFilter ) delete[] highReconstructFilter; - } - - protected: - vtkm::Id filterLength; - vtkm::Float64* lowDecomposeFilter; - vtkm::Float64* highDecomposeFilter; - vtkm::Float64* lowReconstructFilter; - vtkm::Float64* highReconstructFilter; - - void AllocateFilterMemory() - { - lowDecomposeFilter = new vtkm::Float64[ this->filterLength ]; - highDecomposeFilter = new vtkm::Float64[ this->filterLength ]; - lowReconstructFilter = new vtkm::Float64[ this->filterLength ]; - highReconstructFilter = new vtkm::Float64[ this->filterLength ]; - } - - // Flipping operation; helper function to initialize a filter. - void wrev( const vtkm::Float64* sigIn, vtkm::Float64* sigOut, vtkm::Id sigLength ) - { - for( vtkm::Id count = 0; count < sigLength; count++) - sigOut[count] = sigIn[sigLength - count - 1]; - } - - // Quadrature mirror filtering operation: helper function to initialize a filter. - void qmf_even ( const vtkm::Float64* sigIn, vtkm::Float64* sigOut, vtkm::Id sigLength ) - { - for (vtkm::Id count = 0; count < sigLength; count++) - { - sigOut[count] = sigIn[sigLength - count - 1]; - - if (sigLength % 2 == 0) { - if (count % 2 != 0) { - sigOut[count] = -1.0 * sigOut[count]; - } - } - else { - if (count % 2 == 0) { - sigOut[count] = -1.0 * sigOut[count]; - } - } - } - } - - // Flipping and QMF at the same time: helper function to initialize a filter. - void qmf_wrev ( const vtkm::Float64* sigIn, vtkm::Float64* sigOut, vtkm::Id sigLength ) - { - for (vtkm::Id count = 0; count < sigLength; count++) { - sigOut[count] = sigIn[sigLength - count - 1]; - - if (sigLength % 2 == 0) { - if (count % 2 != 0) { - sigOut[count] = -1 * sigOut[count]; - } - } - else { - if (count % 2 == 0) { - sigOut[count] = -1 * sigOut[count]; - } - } - } - - vtkm::Float64 tmp; - for (vtkm::Id count = 0; count < sigLength/2; count++) { - tmp = sigOut[count]; - sigOut[count] = sigOut[sigLength - count - 1]; - sigOut[sigLength - count - 1] = tmp; - } - } - - // Verbatim Copying: helper function to initialize a filter. - void verbatim_copy ( const vtkm::Float64* sigIn, vtkm::Float64* sigOut, vtkm::Id sigLength ) - { - for (vtkm::Id count = 0; count < sigLength; count++) - sigOut[count] = sigIn[count]; - } - }; // class Filter - // helper worklet class ForwardTransform: public vtkm::worklet::WorkletMapField diff --git a/vtkm/worklet/testing/UnitTestWavelets.cxx b/vtkm/worklet/testing/UnitTestWavelets.cxx index 928ef83a2..038e9b521 100644 --- a/vtkm/worklet/testing/UnitTestWavelets.cxx +++ b/vtkm/worklet/testing/UnitTestWavelets.cxx @@ -49,7 +49,7 @@ void TestWavelets() // make a wavelet filter std::string wname = "CDF9/7"; - vtkm::worklet::Wavelets::Filter CDF97( wname ); + vtkm::worklet::WaveletFilter CDF97( wname ); // initialize the worklet vtkm::worklet::Wavelets::ForwardTransform forwardTransform;