// Wavelet Analysis Tool //-------------------------------------------------------------------- // Implementation of // Bi-othogonal wavelet transforms using lifting scheme // References: // A.Cohen, I.Daubechies, J.Feauveau Bases of compactly supported wavelets // Comm. Pure. Appl. Math. 45, 485-560, 1992 // W. Sweldens - Building your own wavelets at home //-------------------------------------------------------------------- //$Id: Biorthogonal.hh,v 0.2 2001/08/06 19:37:00 klimenko Exp $ #define BIORTHOGONAL_CC #include "Biorthogonal.hh" namespace datacondAPIwat { // constructors template Biorthogonal:: Biorthogonal(const Wavelet &w) : WaveDWT(w) { setFilter(); } template Biorthogonal:: Biorthogonal(const Biorthogonal &w) : WaveDWT(w) { setFilter(); } template Biorthogonal:: Biorthogonal(int m=4, int tree=0, enum BORDER border=B_CYCLE) : WaveDWT(m,m,tree,border) { setFilter(); } // destructor template Biorthogonal::~Biorthogonal() { if(hp) delete [] hp; if(hu) delete [] hu; } // clone template Biorthogonal* Biorthogonal::Clone() const { return new Biorthogonal(*this); } // set filter and wavelet type template void Biorthogonal::setFilter() { int n = m_H; n = (n>>1)<<1; if(n < 2) n=4; if(n > 30) n=20; // limit is due to the unrolled code length hp=new double[n]; hu=new double[n]; for(int i=0; i input parameter is the level to be transformed // input parameter is the layer to be transformed. template void Biorthogonal::decompose(int level,int layer) { level++; // increment level (next level now) //------------------ border handling----------------------- // sample index 0.......nL............nR....nS-1 // detail samples: L L L L M M ..... M M R R R R // approx samples: L L L L M M ..... M M R R R R // L,R - samples affected by borders // M - not affected samples //--------------------------------------------------------- int nS = nWWS>>level; // nS - number of samples in the layer int nL = m_H/2; // nL - left border index (beginning of M samples) int nR = nS-m_H/2; // nR - right border index (beginning of R samples) int nM = (nS - m_H)<= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; P0: *dataD -= sum; dataD += stride; } // right border if (m_Border==B_POLYNOM) { for(i=0; i=nS){ switch (m_Border) { case B_PAD_ZERO : // pad zero data = 0.; break; case B_MIRROR : // mirror data data = *(dataA + ((2*nS-k-2)<= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; U0: *dataA += sum; dataA += stride; } // right border if (m_Border==B_POLYNOM) { for(i=0; i=nS){ switch (m_Border) { case B_PAD_ZERO : // pad zero data = 0.; break; case B_MIRROR : // mirror data data = *(dataD + ((2*nS-k-2)< input parameter is the level to be reconstructed // input parameter is the layer to be reconstructed. template void Biorthogonal::reconstruct(int level,int layer) { level++; // current level //------------------ border handling----------------------- // sample index 0.......nL............nR....nS-1 // detail samples: L L L L M M ..... M M R R R R // approx samples: L L L L M M ..... M M R R R R // L,R - samples affected by borders // M - not affected samples //--------------------------------------------------------- int nS = nWWS>>level; // nS - number of samples in the layer int nL = m_H/2; // nL - left border index (beginning of M samples) int nR = nS-m_H/2; // nR - right border index (beginning of R samples) int nM = (nS - m_H)<= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto U0; U0: *dataA -= sum; dataA += stride; } // right border if (m_Border==B_POLYNOM) { for(i=0; i=nS){ switch (m_Border) { case B_PAD_ZERO : // pad zero data = 0.; break; case B_MIRROR : // mirror data data = *(dataD + ((2*nS-k-2)<= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; sum += *(h++) * (*dataL + *dataR); if ((dataL+=stride) >= (dataR-=stride)) goto P0; P0: *dataD += sum; dataD += stride; } // right border if (m_Border==B_POLYNOM) { for(i=0; i=nS){ switch (m_Border) { case B_PAD_ZERO : // pad zero data = 0.; break; case B_MIRROR : // mirror data data = *(dataA + ((2*nS-k-2)<; CLASS_INSTANTIATION(float) CLASS_INSTANTIATION(double) //CLASS_INSTANTIATION(std::complex) //CLASS_INSTANTIATION(std::complex) #undef CLASS_INSTANTIATION template Biorthogonal:: Biorthogonal(const Biorthogonal &); template Biorthogonal:: Biorthogonal(const Biorthogonal &); } // end namespace datacondAPIwat