Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals

Rtrsmra_Data_t_scalar.h

Go to the documentation of this file.
00001 // Rtrsmra_Data_t_scalar.h
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 2000-2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
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 // partial specialization Rtrsmra<Data_t,scalar>
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; } //DEBUG
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
00242       scalcoef = _mracoef[ 2*m ]; 
00243 //   } else { 
00244 //      scalcoef = 1.0/0; 
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
00262       scalcoefrs = _mracoefrs[ 2*m ]; 
00263 //   } else { 
00264 //      scalcoefrs = 1.0/0; 
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
00282       wavcoef = _mracoef[ 2*m + 1 ]; 
00283 //   } else { 
00284 //      wavcoef = 1.0/0; 
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
00302       wavcoefrs = _mracoefrs[ 2*m +1 ]; 
00303 //   } else { 
00304 //      wavcoefrs = 1.0/0; 
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
00322       scala = _mracoef[ 2*m ] * pow(INVSQRT2,m); 
00323 //   } else { 
00324 //      scala = 1.0/0;  
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) {
00342       scalars = _mracoefrs[ 2*m ] * pow(INVSQRT2,m);
00343 //   } else { 
00344 //      scalars = 1.0/0; 
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
00362       wavd = _mracoef[ 2*m +1 ] * pow(INVSQRT2,m); 
00363 //   } else { 
00364 //      wavd = 1.0/0;
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) {
00381       wavdrs = _mracoefrs[ 2*m +1 ] * pow(INVSQRT2,m);
00382 //   } else {
00383 //      wavdrs = 1.0/0;
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 

Generated on Mon May 31 21:38:53 2004 for SR2k4 Assembler by doxygen 1.3.6