IDWT1D finishes, but still has bugs.

This commit is contained in:
Samuel Li 2016-07-20 18:05:14 -06:00
parent 132a4dfe33
commit a8d47c4bf1
3 changed files with 97 additions and 18 deletions

@ -123,7 +123,7 @@ public:
// Func:
// Performs one level of 1D discrete wavelet transform
// It takes care of boundary conditions, etc.
template< typename SignalArrayType, typename CoeffArrayType>
@ -197,8 +197,8 @@ public:
vtkm::worklet::DispatcherMapField<vtkm::worklet::ForwardTransform>
dispatcher(forwardTransform);
dispatcher.Invoke( sigInExtended,
filter->GetLowDecomposeFilter(),
filter->GetHighDecomposeFilter(),
this->filter->GetLowDecomposeFilter(),
this->filter->GetHighDecomposeFilter(),
coeffOutTmp );
// Separate cA and cD.
@ -221,7 +221,7 @@ public:
}
// Func:
// Performs one level of inverse wavelet transform
// It takes care of boundary conditions, etc.
template< typename CoeffArrayType, typename SignalArrayType>
@ -301,31 +301,98 @@ public:
typedef typename CoeffArrayType::ValueType CoeffValueType;
typedef vtkm::cont::ArrayHandle<CoeffValueType> CoeffArrayTypeTmp;
typedef vtkm::cont::ArrayHandleConcatenate< CoeffArrayTypeTmp, CoeffArrayTypeTmp>
typedef vtkm::cont::ArrayHandle<CoeffValueType> ExtensionArrayType;
typedef vtkm::cont::ArrayHandleConcatenate< ExtensionArrayType, CoeffArrayType >
ArrayConcat;
typedef vtkm::cont::ArrayHandleConcatenate< ArrayConcat, CoeffArrayTypeTmp > ArrayConcat2;
typedef vtkm::cont::ArrayHandleConcatenate< ArrayConcat, ExtensionArrayType > ArrayConcat2;
ArrayConcat2 cATemp, cDTemp;
/*this->Extend1D( sigIn, sigInExtended, addLen, this->wmode, this->wmode ); */
/*
if( doSymConv ) // Actually extend cA and cD
{
this->Extend1D( cA, cATemp, addLen, cALeftMode, cARightMode );
{ // make a CoeffArrayType to send into Extend1D
CoeffArrayType cABasic;
vtkm::cont::DeviceAdapterAlgorithm< VTKM_DEFAULT_DEVICE_ADAPTER_TAG >::Copy
(cA, cABasic);
this->Extend1D( cABasic, cATemp, addLen, cALeftMode, cARightMode );
}
if( cDPadLen > 0 )
{
// Add back the missing final cD: 0.0
CoeffArrayTypeTmp singleValArray;
ExtensionArrayType singleValArray;
singleValArray.Allocate(1);
singleValArray.GetPortalControl().Set(0, 0.0);
vtkm::cont::ArrayHandleConcatenate< PermutArrayType
vtkm::cont::ArrayHandleConcatenate< PermutArrayType, ExtensionArrayType >
cDPad( cD, singleValArray );
// make a CoeffArrayType to send into Extend1D
CoeffArrayType cDBasic;
vtkm::cont::DeviceAdapterAlgorithm< VTKM_DEFAULT_DEVICE_ADAPTER_TAG >::Copy
( cDPad, cDBasic );
this->Extend1D( cDBasic, cDTemp, addLen, cDLeftMode, cDRightMode );
}
else
{
CoeffArrayType cDBasic;
vtkm::cont::DeviceAdapterAlgorithm< VTKM_DEFAULT_DEVICE_ADAPTER_TAG >::Copy
( cD, cDBasic );
this->Extend1D( cDBasic, cDTemp, addLen, cDLeftMode, cDRightMode );
}
} // end if( doSymConv )
else // Make cATemp and cDTemp from cA and cD
{
ExtensionArrayType zeroLenArray;
// make correct ArrayHandle for cATemp
{
CoeffArrayType cABasic;
vtkm::cont::DeviceAdapterAlgorithm< VTKM_DEFAULT_DEVICE_ADAPTER_TAG >::Copy
(cA, cABasic);
ArrayConcat leftOn( zeroLenArray, cABasic );
cATemp = vtkm::cont::make_ArrayHandleConcatenate( leftOn, zeroLenArray );
}
// make correct ArrayHandle for cDTemp
{
CoeffArrayType cDBasic;
vtkm::cont::DeviceAdapterAlgorithm< VTKM_DEFAULT_DEVICE_ADAPTER_TAG >::Copy
(cD, cDBasic);
ArrayConcat leftOn( zeroLenArray, cDBasic );
cDTemp = vtkm::cont::make_ArrayHandleConcatenate( leftOn, zeroLenArray );
}
}
*/
if( filterLen % 2 != 0 )
{
// Concatenate cATemp and cDTemp
vtkm::cont::ArrayHandleConcatenate< ArrayConcat2, ArrayConcat2>
coeffInExtended( cATemp, cDTemp );
std::cerr << "cATemp has length: " << cATemp.GetNumberOfValues() << std::endl;
for( vtkm::Id i = 0; i < cATemp.GetNumberOfValues(); i++ )
std::cout << cATemp.GetPortalConstControl().Get(i) << std::endl;
std::cerr << "cDTemp has length: " << cDTemp.GetNumberOfValues() << std::endl;
for( vtkm::Id i = 0; i < cATemp.GetNumberOfValues(); i++ )
std::cout << cATemp.GetPortalConstControl().Get(i) << std::endl;
std::cerr << "coeffIn has length: " << coeffInExtended.GetNumberOfValues() << std::endl;
// Initialize a worklet
vtkm::worklet::InverseTransformOdd inverseXformOdd;
inverseXformOdd.SetFilterLength( filterLen );
inverseXformOdd.SetCALength( L[0] );
vtkm::worklet::DispatcherMapField< vtkm::worklet::InverseTransformOdd >
dispatcher( inverseXformOdd );
dispatcher.Invoke( coeffInExtended,
this->filter->GetLowReconstructFilter(),
this->filter->GetHighReconstructFilter(),
sigOut );
// need to take out the first L[2] values to put into sigOut
}
else
{
// need to implement the even filter length worklet first
}
return 0;

@ -55,7 +55,7 @@ void TestExtend1D()
std::cout << "\nFinish testing Extend1D" << std::endl;
}
void TestDWT1D()
void TestDWTIDWT1D()
{
vtkm::Id sigLen = 20;
std::cout << "Testing Wavelets Worklet" << std::endl;
@ -78,10 +78,12 @@ void TestDWT1D()
vtkm::cont::ArrayHandle<vtkm::Float64> coeffOut;
vtkm::Id L[3];
// Forward Transform
vtkm::filter::internal::WaveletDWT waveletdwt( "CDF9/7" );
waveletdwt.DWT1D( inputArray, coeffOut, L );
std::cout << "Output Coeff length = " << coeffOut.GetNumberOfValues() << std::endl;
std::cout << "Forward Wavelet Transform: result coeff length = " <<
coeffOut.GetNumberOfValues() << std::endl;
printf("L[0] = %lld, L[1] = %lld, L[2] = %lld\n", L[0], L[1], L[2] );
for( vtkm::Id i; i < coeffOut.GetNumberOfValues(); i++ )
{
@ -91,13 +93,23 @@ void TestDWT1D()
std::cout << " <-- cD --> " << std::endl;
std::cout << coeffOut.GetPortalConstControl().Get(i) << std::endl;
}
// Inverse Transform
vtkm::cont::ArrayHandle<vtkm::Float64> reconstructArray;
waveletdwt.IDWT1D( coeffOut, L, reconstructArray );
std::cout << "Inverse Wavelet Transform: result signal length = " <<
reconstructArray.GetNumberOfValues() << std::endl;
for( vtkm::Id i; i < reconstructArray.GetNumberOfValues(); i++ )
{
std::cout << reconstructArray.GetPortalConstControl().Get(i) << std::endl;
}
}
void TestWaveletCompressor()
{
std::cout << "Welcome to WaveletCompressorFilter test program :) " << std::endl;
//TestExtend1D();
TestDWT1D();
TestDWTIDWT1D();
}
int UnitTestWaveletCompressorFilter(int, char *[])

@ -137,7 +137,7 @@ class InverseTransformOdd: public vtkm::worklet::WorkletMapField
{
public:
typedef void ControlSignature(WholeArrayIn<ScalarAll>, // Input: coeffs
// cA followed by cD
// cA followed by cD
WholeArrayIn<Scalar>, // lowFilter
WholeArrayIn<Scalar>, // highFilter
FieldOut<ScalarAll>); // output