00001
00002
00003
00004
00005
00006
00007 #ifndef _RTRSMRA_DATA_T_ARRAY_H
00008 #define _RTRSMRA_DATA_T_ARRAY_H
00009
00010 #ifdef USE_STD
00011 #include <cmath>
00012 using namespace std;
00013 #else
00014 #include <math.h>
00015 #endif
00016
00017 #include "stormdef.h"
00018 #define INVSQRT2 STORMDEF_MATHCONST_INVSQRT2
00019
00020
00021 template <typename Data_t>
00022 class Rtrsmra<Data_t,array> {
00023
00024 public:
00025
00026 typedef Data_t DataType;
00027 static const int ArrayDim = 1;
00028
00029 Rtrsmra( const int asize = 1, const int msize = 8 );
00030 Rtrsmra( const Rtrsmra &rhs );
00031 virtual ~Rtrsmra();
00032 virtual void remalloc( const int asize = 1, const int msize = 8 );
00033 virtual void clear();
00034 void assign( const Data_t data );
00035 void assign( const Data_t* data );
00036 void assign( const int a0, const int a1, const Data_t* data);
00037 void zero();
00038 Data_t& operator[]( const int a ) { return _data[a]; }
00039 virtual void rtwt();
00040 virtual void rtiwt() {}
00041 int operator ++() { rtwt(); return 0; }
00042 int operator ++(int) { rtwt(); return 0; }
00043 int operator --() { rtiwt(); return 0; }
00044 int operator --(int) { rtiwt(); return 0; }
00045 int amax() { return _amax; }
00046 int mmax() { return _mmax; }
00047 int mrastep() { return _mrastep; }
00048 int mrastep( const int mrastep ) { _mrastep = mrastep; }
00049 virtual int mcycle() { return mcycle0(); }
00050 virtual int mcycle0();
00051 virtual int mcyclers() { return mcycle1(); }
00052 virtual int mcycle1();
00053 bool isvalid0(const int m) { return ( m < mcycle0() ) ; }
00054 bool isvalid(const int m) { return ( m < mcycle() ) ; }
00055 bool isvalid1(const int m) { return ( m < mcycle1() ) ; }
00056 bool isvalidrs(const int m) { return ( m < mcyclers() ) ; }
00057 virtual Data_t scal( const int a, const int m ) { return scal0(a,m); }
00058 virtual Data_t scal0( const int a, const int m );
00059 virtual Data_t wav( const int a, const int m ) { return wav0(a,m); }
00060 virtual Data_t wav0( const int a, const int m );
00061 virtual Data_t ave( const int a, const int m ) { return ave0(a,m); }
00062 virtual Data_t ave0( const int a, const int m );
00063 virtual Data_t chg( const int a, const int m ) { return chg0(a,m); }
00064 virtual Data_t chg0( const int a, const int m );
00065 virtual Data_t scalrs( const int a, const int m ) { return scal1(a,m); }
00066 virtual Data_t scal1( const int a, const int m );
00067 virtual Data_t wavrs( const int a, const int m ) { return wav1(a,m); }
00068 virtual Data_t wav1( const int a, const int m );
00069 virtual Data_t avers( const int a, const int m ) { return ave1(a,m); }
00070 virtual Data_t ave1( const int a, const int m );
00071 virtual Data_t chgrs( const int a, const int m ) { return chg1(a,m); }
00072 virtual Data_t chg1( const int a, const int m );
00073 virtual int imcycle() { return 0; }
00074 virtual void scal( const int a, const int m, Data_t tmp ) {}
00075 virtual void wav( const int a, const int m, Data_t tmp ) {}
00076 virtual void detectlt( const Data_t* thresh, int* hit );
00077 virtual void detectle( const Data_t* thresh, int* hit );
00078 virtual void detectgt( const Data_t* thresh, int* hit );
00079 virtual void detectge( const Data_t* thresh, int* hit );
00080
00081 protected:
00082
00083 int _Asize;
00084 int _Msize;
00085 int _amax;
00086 int _mmax;
00087 int _mrastep;
00088 Data_t* _mracoef;
00089 Data_t* _mracoefrs;
00090 Data_t* _data;
00091
00092 };
00093
00094 template <typename Data_t>
00095 inline Rtrsmra<Data_t,array>::Rtrsmra( const int asize, const int msize )
00096 : _Asize(asize), _Msize(msize), _amax(asize-1), _mmax(msize-1), _mrastep(-1)
00097 {
00098 _mracoef = new Data_t[ _Asize* _Msize*2 ];
00099 for( int i = 0; i < _Asize*_Msize*2; i++ ) { _mracoef[i] = 0; }
00100
00101 _mracoefrs = new Data_t[ _Asize*_Msize*2 ];
00102 for( int i = 0; i < _Asize*_Msize*2; i++ ) { _mracoefrs[i] = 0; }
00103
00104 _data = new Data_t[ _Asize ];
00105 for( int i = 0; i< _Asize; i++ ) { _data[i] = 0; }
00106 }
00107
00108 template <typename Data_t>
00109 inline Rtrsmra<Data_t,array>::Rtrsmra( const Rtrsmra<Data_t,array> &rhs )
00110 : _Asize( rhs._Asize ), _Msize( rhs._Msize ),
00111 _amax( rhs._amax ), _mmax( rhs._mmax ),
00112 _mrastep( rhs._mrastep )
00113 {
00114 _mracoef = new Data_t[ _Asize* _Msize*2 ];
00115 for( int i = 0; i < _Asize*_Msize*2; i++ ) {
00116 _mracoef[i] = rhs._mracoef[i];
00117 }
00118
00119 _mracoefrs = new Data_t[ _Asize*_Msize*2 ];
00120 for(int i = 0; i < _Asize*_Msize*2; i++) {
00121 _mracoefrs[i] = rhs._mracoefrs[i];
00122 }
00123
00124 _data = new Data_t[ _Asize ];
00125 for( int i = 0; i< _Asize; i++ ) { _data[i] = rhs._data[i]; }
00126 }
00127
00128 template <typename Data_t>
00129 inline Rtrsmra<Data_t,array>::~Rtrsmra()
00130 {
00131 if ( _data != 0 ) { delete [] _data; _data = 0; }
00132 if ( _mracoefrs != 0 ) { delete [] _mracoefrs; _mracoefrs = 0; }
00133 if ( _mracoef != 0 ) { delete [] _mracoef; _mracoef = 0; }
00134 }
00135
00136 template <typename Data_t>
00137 inline void Rtrsmra<Data_t,array>::remalloc( const int asize, const int msize )
00138 {
00139 _Asize = asize;
00140 _Msize = msize;
00141 _amax = asize-1;
00142 _mmax = msize-1;
00143 _mrastep = -1;
00144 if (_mracoef) delete [] _mracoef; _mracoef = 0;
00145 _mracoef = new Data_t[ _Asize*_Msize*2 ];
00146 for( int i = 0; i < _Asize*_Msize*2; i++ ) { _mracoef[i] = 0; }
00147
00148 if (_mracoefrs) delete [] _mracoefrs; _mracoefrs = 0;
00149 _mracoefrs = new Data_t[ _Asize*_Msize*2 ];
00150 for( int i = 0; i < _Asize*_Msize*2; i++ ) { _mracoefrs[i] = 0; }
00151
00152 if (_data) delete [] _data; _data = 0;
00153 _data = new Data_t[ _Asize ];
00154 for( int i = 0; i < _Asize; i++ ) { _data[i] = 0; }
00155 }
00156
00157 template <typename Data_t>
00158 inline void Rtrsmra<Data_t,array>::clear()
00159 {
00160 _mrastep = -1;
00161 for( int i = 0; i < _Asize*_Msize*2; i++ ) { _mracoef[i] = 0; }
00162 for( int i = 0; i < _Asize*_Msize*2; i++ ) { _mracoefrs[i] = 0; }
00163 for( int i = 0; i < _Asize; i++ ) { _data[i] = 0; }
00164 }
00165
00166 template <typename Data_t>
00167 inline void Rtrsmra<Data_t,array>::assign( const Data_t data )
00168 {
00169 for( int a = 0; a <= _amax; a++ ) {
00170 _data[a] = data;
00171 }
00172 }
00173
00174 template <typename Data_t>
00175 inline void Rtrsmra<Data_t,array>::assign( const Data_t *data )
00176 {
00177 for( int a = 0; a <= _amax; a++ ) {
00178 _data[a] = *data[a];
00179 }
00180 }
00181
00182 template <typename Data_t>
00183 inline void Rtrsmra<Data_t,array>::assign( const int a0, const int a1,
00184 const Data_t* data
00185 )
00186 {
00187 if ( ( a0 <= a1 ) && ( a0 >= 0 ) && ( a0 <= _amax )
00188 && ( a1 >= 0 ) && ( a1 <= _amax ) ) {
00189 for( int a = a0; a <= a1; a++) { _data[a] = data[a]; }
00190 }
00191 }
00192
00193 template <typename Data_t>
00194 inline void Rtrsmra<Data_t,array>::zero()
00195 {
00196 for( int a = 0; a <= _amax; a++ ) {
00197 _data[a] = 0;
00198 }
00199 }
00200
00201 template <typename Data_t>
00202 inline void Rtrsmra<Data_t,array>::rtwt()
00203 {
00204 #ifdef STORM_USEC
00205 rtrsmrartrswt(
00206 _Asize, _Msize,
00207 _amax, _mmax, _mrastep,
00208 _mracoef, _mracoefrs,
00209 _data
00210 );
00211 #else
00212 _mrastep++;
00213 int mcycle = 0;
00214 while ( ( _mrastep & (1<<mcycle) ) && ( mcycle < _mmax ) ) { mcycle++; }
00215 int mcyclers = mcycle + 1;
00216 if ( ( _mrastep < (1<<mcyclers) ) || ( mcyclers > _mmax ) ) { mcyclers = 0; }
00217 for( int a=0; a <= _amax; a++ ) {
00218 Data_t tmp = _data[a];
00219 int m = 1;
00220 Data_t tmpold,tmps,tmpw;
00221 while ( m <= mcycle ) {
00222 tmpold = _mracoef[ _Msize*2*a + 2*(m-1) ];
00223 tmps = (tmpold+tmp) * INVSQRT2;
00224 tmpw = (tmpold-tmp) * INVSQRT2;
00225 _mracoef[ _Msize*2*a + 2*(m-1) ] = tmp;
00226 _mracoef[ _Msize*2*a + 2*m + 1 ] = tmpw;
00227 tmp = tmps;
00228 m++;
00229 }
00230 if ( m == mcyclers ) {
00231 tmpold = _mracoef[ _Msize*2*a + 2*(m-1) ];
00232 tmps = (tmpold+tmp) * INVSQRT2;
00233 tmpw = (tmpold-tmp) * INVSQRT2;
00234 _mracoefrs[ _Msize*2*a + 2*m ] = tmps;
00235 _mracoefrs[ _Msize*2*a + 2*m + 1 ] = tmpw;
00236 }
00237 _mracoef[ _Msize*2*a + 2*(m-1) ] = tmp;
00238 }
00239 #endif
00240 }
00241
00242 template <typename Data_t>
00243 inline int Rtrsmra<Data_t,array>::mcycle0()
00244 {
00245 int mcycle;
00246 #ifdef STORM_USEC
00247 rtrsmramcycle( _Msize, _mmax, _mrastep, mcycle);
00248 #else
00249 while ( ( _mrastep & (1<<mcycle) ) && ( mcycle < _mmax ) ) { mcycle++; }
00250 #endif
00251 return mcycle;
00252 }
00253
00254 template <typename Data_t>
00255 inline int Rtrsmra<Data_t,array>::mcycle1()
00256 {
00257 int mcyclers;
00258 #ifdef STORM_USEC
00259 rtrsmramcyclers( _Msize, _mmax, _mrastep, mcyclers );
00260 #else
00261 while ( ( _mrastep & (1<<mcyclers) ) && ( mcyclers < _mmax ) ) {
00262 mcyclers++;
00263 }
00264 mcyclers++;
00265 if ( ( _mrastep < (1<<mcyclers) ) || ( mcyclers > _mmax ) ) { mcyclers = 0; }
00266 #endif
00267 return mcyclers;
00268 }
00269
00270 template <typename Data_t>
00271 inline Data_t Rtrsmra<Data_t,array>::scal0( const int a, const int m )
00272 {
00273 Data_t scalcoef;
00274 #ifdef STORM_USEC
00275 rtrsmrascalcoef(
00276 _Asize, _Msize,
00277 _amax, _mmax, _mrastep,
00278 _mracoef, _mracoefrs,
00279 a, m, scalcoef
00280 );
00281 #else
00282
00283 scalcoef = _mracoef[ _Msize*2*a + 2 *m ];
00284
00285
00286
00287 #endif
00288 return scalcoef;
00289 }
00290
00291 template <typename Data_t>
00292 inline Data_t Rtrsmra<Data_t,array>::wav0( const int a, const int m )
00293 {
00294 Data_t wavcoef;
00295 #ifdef STORM_USEC
00296 rtrsmrawavcoef(
00297 _Asize, _Msize,
00298 _amax, _mmax, _mrastep,
00299 _mracoef, _mracoefrs,
00300 a, m, wavcoef
00301 );
00302 #else
00303
00304 wavcoef = _mracoef[ _Msize*2*a + 2*m + 1 ];
00305
00306
00307
00308 #endif
00309 return wavcoef;
00310 }
00311
00312 template <typename Data_t>
00313 inline Data_t Rtrsmra<Data_t,array>::ave0( const int a, const int m )
00314 {
00315 Data_t scala;
00316 #ifdef STORM_USEC
00317 rtrsmrascala(
00318 _Asize, _Msize,
00319 _amax, _mmax, _mrastep,
00320 _mracoef, _mracoefrs,
00321 a, m, scala
00322 );
00323 #else
00324
00325 scala = _mracoef[ _Msize*2*a + 2*m ] * pow(INVSQRT2,m);
00326
00327
00328
00329 #endif
00330 return scala;
00331 }
00332
00333 template <typename Data_t>
00334 inline Data_t Rtrsmra<Data_t,array>::chg0( const int a, const int m )
00335 {
00336 Data_t wavd;
00337 #ifdef STORM_USEC
00338 rtrsmrawavd(
00339 _Asize, _Msize,
00340 _amax, _mmax, _mrastep,
00341 _mracoef, _mracoefrs,
00342 a, m, wavd
00343 );
00344 #else
00345
00346 wavd = _mracoef[ _Msize*2*a + 2*m + 1 ] * pow(INVSQRT2,m);
00347
00348
00349
00350 #endif
00351 return wavd;
00352 }
00353
00354 template <typename Data_t>
00355 inline Data_t Rtrsmra<Data_t,array>::scal1( const int a, const int m )
00356 {
00357 Data_t scalcoefrs;
00358 #ifdef STORM_USEC
00359 rtrsmrascalcoefrs(
00360 _Asize, _Msize,
00361 _amax, _mmax, _mrastep,
00362 _mracoef, _mracoefrs,
00363 a, m, scalcoefrs
00364 );
00365 #else
00366
00367 scalcoefrs = _mracoefrs[ _Msize*2*a + 2*m ];
00368
00369
00370
00371 #endif
00372 return scalcoefrs;
00373 }
00374
00375 template <typename Data_t>
00376 inline Data_t Rtrsmra<Data_t,array>::wav1( const int a, const int m )
00377 {
00378 Data_t wavcoefrs;
00379 #ifdef STORM_USEC
00380 rtrsmrawavcoefrs(
00381 _Asize, _Msize,
00382 _amax, _mmax, _mrastep,
00383 _mracoef, _mracoefrs,
00384 a, m, wavcoefrs
00385 );
00386 #else
00387
00388 wavcoefrs = _mracoefrs[ _Msize*2*a + 2*m + 1 ];
00389
00390
00391
00392 #endif
00393 return wavcoefrs;
00394 }
00395
00396 template <typename Data_t>
00397 inline Data_t Rtrsmra<Data_t,array>::ave1( const int a, const int m )
00398 {
00399 Data_t scalars;
00400 #ifdef STORM_USEC
00401 rtrsmrascalars( _Asize, _Msize,
00402 _amax, _mmax, _mrastep,
00403 _mracoef, _mracoefrs,
00404 a, m, scalars
00405 );
00406 #else
00407
00408 scalars = _mracoefrs[ _Msize*2*a + 2*m ] * pow(INVSQRT2,m);
00409
00410
00411
00412 #endif
00413 return scalars;
00414 }
00415
00416 template <typename Data_t>
00417 inline Data_t Rtrsmra<Data_t,array>::chg1( const int a, const int m )
00418 {
00419 Data_t wavdrs;
00420 #ifdef STORM_USEC
00421 rtrsmrawavdrs( _Asize, _Msize,
00422 _amax, _mmax, _mrastep,
00423 _mracoef, _mracoefrs,
00424 a, m, wavdrs
00425 );
00426 #else
00427
00428 wavdrs = _mracoefrs[ _Msize*2*a + 2*m + 1 ] * pow(INVSQRT2,m);
00429
00430
00431
00432 #endif
00433 return wavdrs;
00434 }
00435
00436 template <typename Data_t>
00437 inline void Rtrsmra<Data_t,array>::detectlt( const Data_t* thresh, int* hit )
00438 {
00439 #ifdef STORM_USEC
00440 rtrsdetectlt( _Asize, _Msize,
00441 _amax, _mmax, _mrastep,
00442 _mracoef, _mracoefrs,
00443 thresh, hit
00444 );
00445 #else
00446 for( int m = 0; m <= _mmax; m++ ) {
00447 hit[m] = 0;
00448 for( int a=0; a <= _amax; a++ ) {
00449 if ( abs( _mracoef[ _Msize*2*a + 2*m + 1 ]
00450 + _mracoefrs[ _Msize*2*a + 2*m + 1 ] ) < thresh[m] ) { hit[m]++; }
00451 }
00452 }
00453 #endif
00454 }
00455
00456 template <typename Data_t>
00457 inline void Rtrsmra<Data_t,array>::detectle( const Data_t* thresh, int* hit )
00458 {
00459 #ifdef STORM_USEC
00460 rtrsdetectle( _Asize, _Msize,
00461 _amax, _mmax, _mrastep,
00462 _mracoef, _mracoefrs,
00463 thresh, hit
00464 );
00465 #else
00466 for(int m=0; m <= _mmax; m++) {
00467 hit[m]=0;
00468 for(int a=0; a <= _amax; a++) {
00469 if (abs(_mracoef[ _Msize*2*a + 2*m + 1 ]
00470 +_mracoefrs[_Msize*2*a + 2*m + 1 ] ) <= thresh[m] ) { hit[m]++; }
00471 }
00472 }
00473 #endif
00474 }
00475
00476 template <typename Data_t>
00477 inline void Rtrsmra<Data_t,array>::detectgt( const Data_t* thresh, int* hit )
00478 {
00479 #ifdef STORM_USEC
00480 rtrsdetectgt(
00481 _Asize, _Msize,
00482 _amax, _mmax, _mrastep,
00483 _mracoef, _mracoefrs,
00484 thresh, hit
00485 );
00486 #else
00487 for( int m = 0; m <= _mmax; m++ ) {
00488 hit[m] = 0;
00489 for( int a = 0; a <= _amax; a++ ) {
00490 if ( abs( _mracoef[ _Msize*2*a + 2*m + 1 ]
00491 + _mracoefrs[_Msize*2*a + 2*m + 1 ] ) > thresh[m] ) { hit[m]++; }
00492 }
00493 }
00494 #endif
00495 }
00496
00497 template <typename Data_t>
00498 inline void Rtrsmra<Data_t,array>::detectge( const Data_t* thresh, int* hit )
00499 {
00500 #ifdef STORM_USEC
00501 rtrsdetectge(
00502 _Asize, _Msize,
00503 _amax, _mmax, _mrastep,
00504 _mracoef, _mracoefrs,
00505 thresh, hit
00506 );
00507 #else
00508 for( int m = 0; m <= _mmax; m++ ) {
00509 hit[m] = 0;
00510 for( int a = 0; a <= _amax; a++ ) {
00511 if ( abs( _mracoef[ _Msize*2*a + 2*m + 1 ]
00512 + _mracoefrs[_Msize*2*a + 2*m + 1 ] ) >= thresh[m] ) { hit[m]++; }
00513 }
00514 }
00515 #endif
00516 }
00517
00518 #endif // _RTRSMRA_DATA_T_ARRAY_H
00519