golib  0.5
dwt.cc

This is an example and test program for the goDWT class.

Author
Christian Gosch
/* Copyright (C) 1998-2011 Christian Gosch, golib at goschs dot de
This file is part of the golib library.
For license regulations, see the file COPYING in the main
directory of the golib source tree. */
#include <godwt.h>
#include <gosignal3d.h>
#include <gosignalmacros.h>
#include <time.h>
#include <iostream>
#include <gorandom.h>
#define TYPE goFloat
int main()
{
block.make(8,8,8,1,4,4);
block2.make (block.getSizeX(), block.getSizeY(), block.getSizeZ(),4,4,4);
// goSignal3D<godwt_t> dwtBlock;
// dwtBlock.make(64,64,64);
clock_t t1,t2;
int i,j,k;
for (i = 0; i < block.getSizeZ(); i++)
{
for (j = 0; j < block.getSizeY(); j++)
{
for (k = 0; k < block.getSizeX(); k++)
{
// *block.getPtr(k,j,i) = i / 0.3 + j / 0.2 + k * 1.76523;
//*block.getPtr(k,j,i) = i + k;
*block.getPtr(k,j,i) = goRandom(); // 127 * (k % 2);
}
}
}
// block.fill(128);
std::cout << "Original block first x/y slice: " << std::endl;
std::cout << "-------------------------------" << std::endl;
for (i = 0; i < block.getSizeY(); i++)
{
for (j = 0; j < block.getSizeX(); j++)
{
std::cout << *block.getPtr(j,i,0) << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
/*
* Test Haar transform.
*/
GO_SIGNAL3D_EACHELEMENT_2(*__ptr_target = *__ptr, block, block2, TYPE, TYPE);
t1 = clock();
// dwt.haar(block, 1);
// goSignal3D<godwt_t> transform (8, 8, 8, 4, 4, 4);
dwt.haar (block, 2);
t2 = clock();
std::cout << "Time for transform: " << (t2-t1) / (float)CLOCKS_PER_SEC << "s" << std::endl;
std::cout << "DWT block first x/y slice: " << std::endl;
std::cout << "--------------------------" << std::endl;
for (i = 0; i < block.getSizeY(); i++)
{
for (j = 0; j < block.getSizeX(); j++)
{
std::cout << *block.getPtr(j,i,0) << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
/*
* Test reverse Haar transform.
*/
t1 = clock();
dwt.unHaar (block, 2);
t2 = clock();
std::cout << "Time for reverse transform: " << (t2-t1) / (float)CLOCKS_PER_SEC << "s" << std::endl;
std::cout << "iDWT block first x/y slice: " << std::endl;
std::cout << "--------------------------" << std::endl;
for (i = 0; i < block.getSizeY(); i++)
{
for (j = 0; j < block.getSizeX(); j++)
{
std::cout << *block.getPtr(j,i,0) << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
std::cout << "block";
goDouble var = 0.0f;
if (block == block2)
{
std::cout << " == ";
}
else
{
std::cout << " != ";
for (i = 0; i < block.getSizeX(); i++)
{
for (j = 0; j < block.getSizeY(); j++)
{
for (k = 0; k < block.getSizeZ(); k++)
{
var += fabs(*block.getPtr(i,j,k) - *block2.getPtr(i,j,k));
}
}
}
var /= (float)(i * j * k);
}
std::cout << "block2" << std::endl;
std::cout << "Mean error: " << var << std::endl;
std::cout << "Memory usage" << std::endl;
std::cout << "------------" << std::endl;
std::cout << "block: " << block.getSize() << " bytes" << std::endl;
block.destroy();
block2.destroy();
exit(1);
}
goSignal3D::make
bool make(const goSize3D &size, const goSize3D &blockSize, const goSize3D &borderSize, goSize_t channelCount)
Allocate memory.
Definition: gosignal3d.cc:329
goDWT::unHaar
void unHaar(goSignal3D< godwt_t > &haarSignal, goSignal3D< T > &targetSignal)
Definition: godwt.cc:852
goSignal3D
Up to 3-dimensional (signal) data container.
Definition: gosignal3d.h:39
goSignal3DBase::getSizeY
goSize_t getSizeY() const
Definition: gosignal3dbase.cpp:2032
goDWT::haar
void haar(goSignal3D< T > &signal, goSignal3D< godwt_t > &targetSignal)
Definition: godwt.cc:760
goSignal3DBase::getSizeZ
goSize_t getSizeZ() const
Definition: gosignal3dbase.cpp:2039
goSignal3DBase::getSizeX
goSize_t getSizeX() const
Definition: gosignal3dbase.cpp:2025
goDWT
Definition: godwt.h:32
GO_SIGNAL3D_EACHELEMENT_2
#define GO_SIGNAL3D_EACHELEMENT_2(__dothis, __signal, __signal_target, __type, __type_target)
Definition: gosignalmacros.h:133
goSignal3D::destroy
virtual void destroy()
Definition: gosignal3d.cc:247