36 template<
class DataType_t>
39 Wavelet(mH, mL, tree, border), pWWS(NULL), nWWS(0), nSTS(0)
42 template<
class DataType_t>
46 std::cout<<
" I am WaveDWT Clone: "<<endl;
49 template<
class DataType_t>
57 template<
class DataType_t>
63 template<
class DataType_t>
74 template<
class DataType_t>
81 if((ldeep == -1) || (levf > maxLevel)) levf = maxLevel;
84 for(
int level=levs; level<levf; level++)
88 for(
int layer=0; layer<layf; layer++)
105 template<
class DataType_t>
110 if((ldeep == -1) || (levf < 0)) levf = 0;
113 for(
int level=levs-1; level>=levf; level--)
117 for(
int layer=0; layer<layf; layer++)
128 template<
class DataType_t>
136 int layer =
int(
fabs(index)+0.001);
138 int maxlayer = (
BinaryTree()) ? (1<<level)-1 : level;
140 if(layer > maxlayer){
144 oss <<
"WaveDWT::getSlice(): " 145 <<
"argument "<<index<<
" is set to " << layer << endl;
147 std::invalid_argument exception(oss.str());
170 template<
class DataType_t>
174 std::invalid_argument(
"WaveDWT::getSlice(): data is not allocated");
178 size_t m =
nWWS>>level;
182 if(i+(m-1)*s+1 >
nWWS){
183 std::invalid_argument(
"WaveDWT::getSlice(): invalide arguments");
193 template<
class DataType_t>
201 template<
class DataType_t>
206 if(
pWWS == NULL && n>0 && p != NULL){
215 template<
class DataType_t>
218 return (
pWWS == NULL ||
nWWS == 0) ? false :
true;
222 template<
class DataType_t>
241 template<
class DataType_t>
247 int nS =
nWWS>>level;
248 int kL = -(
m_H/2-VM);
331 if(pLPF==NULL || pHPF==NULL)
return;
334 register double sumA, sumD, data;
335 register const double *p = pLPF;
336 register const double *q = pHPF;
337 register DataType_t *
pD;
338 register int stride = 1<<level;
343 double *temp =
new double[nS];
352 for(j=0; j<
m_H; j++) {
355 data = pData[k<<level];
370 pD = pData + (i<<level) - stride;
373 for(j=0; j<
m_H; j+=2) {
374 data = *(pD += stride);
377 data = *(pD += stride);
394 for(j=0; j<
m_H; j++) {
397 data = pData[k<<level];
410 for(i=nS-1; i>=0; i--) {pData[i<<level] = *(--temp);}
413 for(i=1; i<nS; i+=4) {pData[i<<level] *= -1;}
432 template<
class DataType_t>
437 if(pLPF==NULL || pHPF==NULL)
return;
440 int nS =
nWWS>>level;
441 int kL = -(
m_H/2-2+VM);
446 if(ODD) { kL -= 2-2*VM; }
534 register double sumA, sumD, data;
535 register const double *p = pLPF;
536 register const double *q = pHPF;
537 register DataType_t *
pD;
538 register int stride = 1<<level;
543 double *temp =
new double[nS];
546 for(i=1; i<nS; i+=4) {pData[i<<level] *= -1;}
557 for(j=0; j<
m_H; j++) {
560 *temp += *p++ * pData[k<<level];
568 sumA = 0.; sumD = 0.;
570 for(j=0; j<
m_H; j++) {
573 data = pData[k<<level];
588 pD = pData + (i<<level) - stride;
589 sumA = 0.; sumD = 0.;
591 for(j=0; j<
m_H; j+=2) {
592 data = *(pD += stride);
595 data = *(pD += stride);
610 sumA = 0.; sumD = 0.;
612 for(j=0; j<
m_H; j++) {
615 data = pData[k<<level];
631 for(j=0; j<
m_H; j++) {
634 *temp += *q++ * pData[k<<level];
640 for(i=nS-1; i>=0; i--)
641 pData[i<<level] = *(--temp);
650 template<
class DataType_t>
669 int nS =
nWWS>>level;
679 register double sum = 0.;
681 register const double *
h;
682 register const DataType_t *dataL;
683 register const DataType_t *dataR;
684 register const int stride = 1<<level;
686 double *pBorder=
new double[2*(m_H-nL)];
689 DataType_t *dataA, *dataD;
694 for(k=0; k<
m_H; k++) hsum += p_H[k];
700 for(k=0; k<(m_H-nL); k++){
702 pB[
k] = *(dataL + abs(j<<level));
706 data = *(dataL + ((j+nS)<<level));
715 for(i=nL; i<0; i++) {
719 for(k=0; k<m_H/2; k++)
720 sum += p_H[k] * (pB[k] + pB[m_H-1-k]);
727 sum = hsum*
Nevill(i+0.5-nL, m_H+2*i, pB, pB+m_H);
738 for(i=0; i<mM; i+=stride) {
744 do sum += *(h++) * (*dataL + *dataR);
745 while((dataL+=stride) < (dataR-=stride));
785 dataR = dataA + ((nS-1)<<level);
787 for(k=0; k<(m_H-nL+1); k++){
789 pB[
k] = *(dataR - abs(j<<level));
793 data = *(dataR - ((j+nS)<<level));
803 for(i=nM; i<nR; i++) {
808 for(k=0; k<m_H/2; k++)
809 sum += p_H[k] * (pB[k] + pB[m_H-1-k]);
814 sum = hsum*
Nevill((m_H-k-1)/2., m_H-k, pB+k, pBorder+m_H+1);
815 if(k == m_H) sum = *(pB+k-1) * hsum;
830 template<
class DataType_t>
849 int nS =
nWWS>>level;
859 register double sum = 0.;
861 register const double *
h;
862 register const DataType_t *dataL;
863 register const DataType_t *dataR;
864 register const int stride = 1<<level;
866 DataType_t *dataA, *dataD;
868 double *pBorder=
new double[2*(m_L-nL)];
874 for(k=0; k<
m_L; k++) hsum += p_L[k];
880 for(k=0; k<(m_L-nL); k++){
882 pB[
k] = *(dataL + abs(j<<level));
886 data = *(dataL + ((j+nS)<<level));
895 for(i=nL; i<0; i++) {
899 for(k=0; k<m_L/2; k++)
900 sum += p_L[k] * (pB[k] + pB[m_L-1-k]);
907 sum = hsum*
Nevill(i-0.5-nL, m_L+2*i, pB, pB+m_L);
918 for(i=0; i<mM; i+=stride) {
924 do sum += *(h++) * (*dataL + *dataR);
925 while((dataL+=stride) < (dataR-=stride));
965 dataR = dataD + ((nS-1)<<level);
967 for(k=0; k<(m_L-nL); k++){
969 pB[
k] = *(dataR - abs(j<<level));
973 data = *(dataR - ((j+nS)<<level));
983 for(i=nM; i<nR; i++) {
987 for(k=0; k<m_L/2; k++)
988 sum += p_L[k] * (pB[k] + pB[m_L-1-k]);
1004 template <
class DataType_t>
1009 if (R__b.IsReading()) {
1010 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
if (R__v) { }
1011 Wavelet::Streamer(R__b);
1018 Wavelet::Streamer(R__b);
1021 R__b.SetByteCount(R__c, kTRUE);
1028 #define CLASS_INSTANTIATION(class_) template class WaveDWT< class_ >; 1035 #undef CLASS_INSTANTIATION
WaveDWT(int mH=1, int mL=1, int tree=0, enum BORDER border=B_CYCLE)
virtual void inverse(int, int)
double Nevill(const double x0, int n, DataType_t *p, double *q)
virtual void inverseFWT(int, int, const double *, const double *)
virtual void forwardFWT(int, int, const double *, const double *)
virtual void forward(int, int)
virtual int convertF2L(int, int)
#define CLASS_INSTANTIATION(class_)
virtual void update(int, int, const double *)
virtual void predict(int, int, const double *)
unsigned long nWWS
pointer to wavelet work space
virtual std::slice getSlice(const double)
double fabs(const Complex &x)
virtual int getMaxLevel()
virtual int getOffset(int, int)
virtual int getMaxLevel(int)
virtual WaveDWT< DataType_t > * Clone() const
return: Wavelet* - duplicate of *this, allocated on heap