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