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

Rtrsmra_Data_t_array.h

Go to the documentation of this file.
00001 //Rtrsmra_Data_t_array.h
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 2001-2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
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 // partial specialization Rtrsmra<Data_t,array>
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; } //DEBUG
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 //   if ( ( a >= 0 ) && ( a <= _amax ) && ( m >= 0 ) && ( m <= _mmax ) ) {
00283       scalcoef = _mracoef[ _Msize*2*a + 2 *m ];
00284 //   } else {
00285 //      scalcoef = 1.0/0;
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 //   if ( ( a >= 0 ) && ( a <= _amax ) && ( m >= 0 ) && ( m <= _mmax ) ) {
00304       wavcoef = _mracoef[ _Msize*2*a + 2*m + 1 ];
00305 //   } else {
00306 //      wavcoef = 1.0/0;
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 //   if ( ( a >= 0 ) && ( a <= _amax ) && ( m >= 0 ) && ( m <= _mmax ) ) {
00325       scala = _mracoef[ _Msize*2*a + 2*m ] * pow(INVSQRT2,m);
00326 //   } else {
00327 //      scala = 1.0/0;
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 //   if ( ( a >= 0 ) && ( a <= _amax ) && ( m >= 0 ) && ( m <= _mmax ) ) {
00346       wavd = _mracoef[ _Msize*2*a + 2*m + 1 ] * pow(INVSQRT2,m);
00347 //   } else {
00348 //      wavd = 1.0/0;
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 //   if ( ( a >= 0 ) && ( a <= _amax ) && ( m >= 0 ) && ( m <= _mmax ) ) {
00367       scalcoefrs = _mracoefrs[ _Msize*2*a + 2*m ];
00368 //   } else {
00369 //      scalcoefrs = 1.0/0.0;
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 //   if ( ( a >= 0 ) && ( a <= _amax ) && (m >=0 ) && ( m <= _mmax ) ) {
00388       wavcoefrs = _mracoefrs[ _Msize*2*a + 2*m + 1 ];
00389 //   } else {
00390 //      wavcoefrs = 1.0/0;
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 //   if ( ( a >= 0 ) && ( a <= _amax ) && ( m >= 0 ) && ( m <= _mmax ) ) {
00408       scalars = _mracoefrs[ _Msize*2*a + 2*m ] * pow(INVSQRT2,m);
00409 //   } else {
00410 //      scalars = 1.0/0;
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 //   if ( ( a >= 0 ) && ( a <= _amax ) && ( m >= 0 ) && ( m <= _mmax ) ) {
00428       wavdrs = _mracoefrs[ _Msize*2*a + 2*m + 1 ] * pow(INVSQRT2,m);
00429 //   } else {
00430 //      wavdrs = 1.0/0;
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 

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