// $Id: WaveDWT.cc,v 0.1 2001/08/10 19:10:00 klimenko Exp $ #define WAVEDWT_CC #include #include #include "WaveDWT.hh" namespace datacondAPIwat { // constructors template WaveDWT:: WaveDWT(int mH=1,int mL=1,int tree=0, enum BORDER border=B_CYCLE) : Wavelet(mH, mL, tree, border), pWWS(NULL), nWWS(0) { } template WaveDWT::WaveDWT(const Wavelet &w) : Wavelet(w), pWWS(NULL), nWWS(0) { } template WaveDWT::WaveDWT(const WaveDWT &w) : Wavelet(w), pWWS(NULL), nWWS(0) { } // destructor template WaveDWT::~WaveDWT() { release(); } template WaveDWT* WaveDWT::Clone() const { return new WaveDWT(*this); } template void WaveDWT::decompose(int level, int layer) { } // - Virtual procedure for forward wavelet transform. // - Real code for decompose will appear in a derivative // classe, since it depends of the wavelet type. // - Only ldeep steps of decomposition will be done. // - By default ldeep=1, which means do one step. template void WaveDWT::t2w(int ldeep) { int maxLevel = getMaxLevel(); int levs = m_Level; int levf = m_Level+ldeep; if((ldeep == -1) || (levf > maxLevel)) levf = maxLevel; int layf; for(int level=levs; level void WaveDWT::reconstruct(int level, int layer) { } // - Virtual procedure for inverse wavelet transform. // - Real code for reconstruct will appear in a derivative // classe, since it depends of the type of wavelet. // - Only ldeep steps of reconstruction will be done. // - By default ldeep=1, which means do one step. template void WaveDWT::w2t(int ldeep) { int levs = m_Level; int levf = m_Level-ldeep; if((ldeep == -1) || (levf < 0)) levf = 0; int layf; for(int level=levs-1; level>=levf; level--) { layf = (m_TreeType==1) ? 1< slice WaveDWT::getSlice(const int index=0) { int level = m_Level; int layer = abs(index); int maxlayer = (BinaryTree()) ? (1< maxlayer){ layer = maxlayer; std::ostrstream oss; oss << "Wavelet::getSlice(): " << "argument 2 is set to " << layer << endl; std::invalid_argument exception(oss.str()); oss.freeze(0); throw exception; } if(BinaryTree()){ if(index>0) layer = convertF2L(level,layer); } else { if(layer) { // detail layers level -= layer-1; layer = 1; } else{ // approximation layer layer = 0; } } return getSlice(level,layer); } // convert (level,layer) to slice template slice WaveDWT::getSlice(const int level, const int layer) { if(!allocate()){ std::invalid_argument("WaveDWT::getSlice(): data is not allocated"); return slice(0,1,1); } size_t m = nWWS>>level; // number of elements size_t s = 1<=m){ std::invalid_argument("WaveDWT::getSlice(): invalide arguments"); return slice(0,1,1); } return slice(i,m,s); } // Calculate maximal level of wavelet decomposition, // which depends on the length of wavelet filters. template int WaveDWT::getMaxLevel() { int maxLevel = 0; if(!allocate()) return 0; int n = nWWS;; for(; (n>m_H) && (n>m_L); n=n>>1) maxLevel++; return maxLevel; } // allocate input data template bool WaveDWT:: allocate(unsigned int n, DataType_t *p) { bool allocate = false; if(pWWS == NULL && n>0){ allocate = true; pWWS = p; nWWS = n; } return allocate; } // check allocation status template bool WaveDWT::allocate() { return (pWWS == NULL || nWWS == 0) ? false : true; } // release input data template void WaveDWT::release() { pWWS = NULL; nWWS = 0; } // instantiations #define CLASS_INSTANTIATION(class_) template class WaveDWT< class_ >; CLASS_INSTANTIATION(float) CLASS_INSTANTIATION(double) //CLASS_INSTANTIATION(std::complex) //CLASS_INSTANTIATION(std::complex) #undef CLASS_INSTANTIATION template WaveDWT:: WaveDWT(const WaveDWT &); template WaveDWT:: WaveDWT(const WaveDWT &); template bool WaveDWT:: allocate(unsigned int, float *); template bool WaveDWT:: allocate(unsigned int, double *); } // namespace datacondAPIwat