18 template<class DataType_t>
21 Wavelet(mH, mL, tree, border), pWWS(NULL), nWWS(0), nSTS(0)
24 template<
class DataType_t>
26 Wavelet(w), pWWS(NULL), nWWS(0), nSTS(0)
28 std::cout<<
" I am WaveDWT Clone: "<<endl;
31 template<
class DataType_t>
39 template<
class DataType_t>
45 template<
class DataType_t>
56 template<
class DataType_t>
59 int maxLevel = getMaxLevel();
62 int levf = m_Level+ldeep;
63 if((ldeep == -1) || (levf > maxLevel)) levf = maxLevel;
66 for(
int level=levs; level<levf; level++)
68 layf = (m_TreeType) ? 1<<level : 1;
70 for(
int layer=0; layer<layf; layer++)
78 m_Layer = (m_TreeType) ? (1<<m_Level)-1 : m_Level;
87 template<
class DataType_t>
91 int levf = m_Level-ldeep;
92 if((ldeep == -1) || (levf < 0)) levf = 0;
95 for(
int level=levs-1; level>=levf; level--)
97 layf = (m_TreeType) ? 1<<level : 1;
99 for(
int layer=0; layer<layf; layer++)
100 inverse(level,layer);
110 template<
class DataType_t>
118 int layer =
int(
fabs(index)+0.001);
120 int maxlayer = (BinaryTree()) ? (1<<level)-1 : level;
122 if(layer > maxlayer){
126 oss <<
"WaveDWT::getSlice(): "
127 <<
"argument "<<index<<
" is set to " << layer << endl;
129 std::invalid_argument exception(oss.str());
135 layer = convertF2L(level,layer);
148 return getSlice(level,layer);
152 template<
class DataType_t>
156 std::invalid_argument(
"WaveDWT::getSlice(): data is not allocated");
160 size_t m = nWWS>>level;
162 size_t i = getOffset(level,layer);
164 if(i+(m-1)*s+1 > nWWS){
165 std::invalid_argument(
"WaveDWT::getSlice(): invalide arguments");
175 template<
class DataType_t>
178 if(!allocate())
return 0;
183 template<
class DataType_t>
187 bool allocate =
false;
188 if(pWWS == NULL && n>0 && p != NULL){
197 template<
class DataType_t>
200 return (pWWS == NULL || nWWS == 0) ?
false :
true;
204 template<
class DataType_t>
223 template<
class DataType_t>
229 int nS = nWWS>>level;
230 int kL = -(m_H/2-VM);
235 if(m_Parity) kL -= VM ? 1 : -1;
313 if(pLPF==NULL || pHPF==NULL)
return;
316 register double sumA, sumD, data;
317 register const double *p = pLPF;
318 register const double *q = pHPF;
319 register DataType_t *
pD;
320 register int stride = 1<<level;
323 DataType_t *pData = pWWS+getOffset(level,layer);
325 double *temp =
new double[nS];
334 for(j=0; j<m_H; j++) {
337 data = pData[k<<level];
352 pD = pData + (i<<level) - stride;
355 for(j=0; j<m_H; j+=2) {
356 data = *(pD += stride);
359 data = *(pD += stride);
376 for(j=0; j<m_H; j++) {
379 data = pData[k<<level];
392 for(i=nS-1; i>=0; i--) {pData[i<<level] = *(--temp);}
395 for(i=1; i<nS; i+=4) {pData[i<<level] *= -1;}
414 template<
class DataType_t>
419 if(pLPF==NULL || pHPF==NULL)
return;
422 int nS = nWWS>>level;
423 int kL = -(m_H/2-2+VM);
428 if(ODD) { kL -= 2-2*VM; }
516 register double sumA, sumD, data;
517 register const double *p = pLPF;
518 register const double *q = pHPF;
519 register DataType_t *
pD;
520 register int stride = 1<<level;
523 DataType_t *pData = pWWS+getOffset(level,layer);
525 double *temp =
new double[nS];
528 for(i=1; i<nS; i+=4) {pData[i<<level] *= -1;}
539 for(j=0; j<m_H; j++) {
542 *temp += *p++ * pData[k<<level];
550 sumA = 0.; sumD = 0.;
552 for(j=0; j<m_H; j++) {
555 data = pData[k<<level];
570 pD = pData + (i<<level) - stride;
571 sumA = 0.; sumD = 0.;
573 for(j=0; j<m_H; j+=2) {
574 data = *(pD += stride);
577 data = *(pD += stride);
592 sumA = 0.; sumD = 0.;
594 for(j=0; j<m_H; j++) {
597 data = pData[k<<level];
613 for(j=0; j<m_H; j++) {
616 *temp += *q++ * pData[k<<level];
622 for(i=nS-1; i>=0; i--)
623 pData[i<<level] = *(--temp);
632 template<
class DataType_t>
651 int nS = nWWS>>level;
661 register double sum = 0.;
663 register const double *
h;
664 register const DataType_t *dataL;
665 register const DataType_t *dataR;
666 register const int stride = 1<<level;
668 double *pBorder=
new double[2*(m_H-nL)];
671 DataType_t *dataA, *dataD;
673 dataA=pWWS+getOffset(level,layer<<1);
674 dataD=pWWS+getOffset(level,(layer<<1)+1);
676 for(k=0; k<m_H; k++) hsum += p_H[k];
682 for(k=0; k<(m_H-nL); k++){
684 pB[
k] = *(dataL + abs(j<<level));
688 data = *(dataL + ((j+nS)<<level));
697 for(i=nL; i<0; i++) {
701 for(k=0; k<m_H/2; k++)
702 sum += p_H[k] * (pB[k] + pB[m_H-1-k]);
709 sum = hsum*
Nevill(i+0.5-nL, m_H+2*i, pB, pB+m_H);
720 for(i=0; i<mM; i+=stride) {
726 do sum += *(h++) * (*dataL + *dataR);
727 while((dataL+=stride) < (dataR-=stride));
767 dataR = dataA + ((nS-1)<<level);
769 for(k=0; k<(m_H-nL+1); k++){
771 pB[
k] = *(dataR - abs(j<<level));
775 data = *(dataR - ((j+nS)<<level));
785 for(i=nM; i<nR; i++) {
790 for(k=0; k<m_H/2; k++)
791 sum += p_H[k] * (pB[k] + pB[m_H-1-k]);
796 sum = hsum*
Nevill((m_H-k-1)/2., m_H-k, pB+k, pBorder+m_H+1);
797 if(k == m_H) sum = *(pB+k-1) * hsum;
812 template<
class DataType_t>
831 int nS = nWWS>>level;
841 register double sum = 0.;
843 register const double *
h;
844 register const DataType_t *dataL;
845 register const DataType_t *dataR;
846 register const int stride = 1<<level;
848 DataType_t *dataA, *dataD;
850 double *pBorder=
new double[2*(m_L-nL)];
853 dataA=pWWS+getOffset(level,layer<<1);
854 dataD=pWWS+getOffset(level,(layer<<1)+1);
856 for(k=0; k<m_L; k++) hsum += p_L[k];
862 for(k=0; k<(m_L-nL); k++){
864 pB[
k] = *(dataL + abs(j<<level));
868 data = *(dataL + ((j+nS)<<level));
877 for(i=nL; i<0; i++) {
881 for(k=0; k<m_L/2; k++)
882 sum += p_L[k] * (pB[k] + pB[m_L-1-k]);
889 sum = hsum*
Nevill(i-0.5-nL, m_L+2*i, pB, pB+m_L);
900 for(i=0; i<mM; i+=stride) {
906 do sum += *(h++) * (*dataL + *dataR);
907 while((dataL+=stride) < (dataR-=stride));
947 dataR = dataD + ((nS-1)<<level);
949 for(k=0; k<(m_L-nL); k++){
951 pB[
k] = *(dataR - abs(j<<level));
955 data = *(dataR - ((j+nS)<<level));
965 for(i=nM; i<nR; i++) {
969 for(k=0; k<m_L/2; k++)
970 sum += p_L[k] * (pB[k] + pB[m_L-1-k]);
976 sum = hsum*
Nevill((m_H-k-1)/2., m_H-k, pB+k, pBorder+m_H+1);
986 template <
class DataType_t>
991 if (R__b.IsReading()) {
992 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
if (R__v) { }
993 Wavelet::Streamer(R__b);
1000 Wavelet::Streamer(R__b);
1003 R__b.SetByteCount(R__c, kTRUE);
1010 #define CLASS_INSTANTIATION(class_) template class WaveDWT< class_ >;
1017 #undef CLASS_INSTANTIATION
WaveDWT(int mH=1, int mL=1, int tree=0, enum BORDER border=B_CYCLE)
double Nevill(const double x0, int n, DataType_t *p, double *q)
virtual void inverseFWT(int, int, const double *, const double *)
virtual WaveDWT< DataType_t > * Clone() const
return: Wavelet* - duplicate of *this, allocated on heap
virtual void forwardFWT(int, int, const double *, const double *)
#define CLASS_INSTANTIATION(class_)
virtual void update(int, int, const double *)
virtual void predict(int, int, const double *)
virtual std::slice getSlice(const double)
double fabs(const Complex &x)
virtual int getMaxLevel()
virtual int getMaxLevel(int)