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

hfwt2ds.cpp

Go to the documentation of this file.
00001 // hfwt2ds.cpp
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 1994-2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
00005 //////////////////////////////////////////////////////////////////////
00006 
00007 #ifdef STORM_USEF
00008 #include "hfwt2ds_.h"
00009 #include "dhfwt2ds_.h"
00010 #include "ihfwt2ds_.h"
00011 #include "hfwt2dsws_.h"
00012 #include "dhfwt2dsws_.h"
00013 #include "ihfwt2dsws_.h"
00014 #endif
00015 
00016 #include "stormdef.h"
00017 #define INVSQRT2 STORMDEF_MATHCONST_INVSQRT2
00018 
00019 int hfwt2ds( 
00020           const int& Sizef2d,
00021           const int& ns,
00022           const int& size,
00023           const float* sdata,
00024                 float* wdata
00025 ) { 
00026 
00027 #ifdef STORM_USEF
00028 
00029    int iflag;
00030    hfwt2ds_( &Sizef2d, &ns, &size, sdata, wdata, &iflag );
00031    return iflag;
00032 
00033 #else
00034 
00035    int ii,l,size2;
00036    int size1 = size;
00037    float *u = new float[Sizef2d];
00038    float *v = new float[Sizef2d];
00039 
00040 #ifdef STORM_FWT_CCHECKUSAGE
00041    if ( size1 < ns ) return 1;
00042 #endif
00043 
00044    for( int i = 0; i < size1; i++ ) {
00045       ii = i * size;
00046       for( int j = 0; j < size1; j++ ) {
00047          wdata[ii+j] = sdata[ii+j];
00048       }
00049    }
00050 
00051    if ( size1 == ns ) return 0;
00052 
00053    while ( size1 > ns ) {
00054 
00055       size2 = size1 / 2;
00056 
00057       for( int j = 0; j < size1; j++ ) {        // index 1
00058          for( int i = 0; i < size1; i++ ) {
00059             ii = i * size;
00060             u[i] = wdata[ii+j];
00061          }
00062          for( int i = 0; i < size2; i++ ) {
00063             l = 2 * i;
00064             v[i] = ( u[l] + u[l+1] ) * INVSQRT2;
00065             v[size2+i] = ( u[l] - u[l+1] ) * INVSQRT2;
00066          }
00067          for( int i = 0; i < size1; i++ ) {
00068             ii = i * size;
00069             wdata[ii+j] = v[i];
00070          }
00071       }
00072 
00073       for( int i = 0; i < size1; i++ ) {        // index 2
00074          ii = i * size;
00075          for( int j = 0; j < size1; j++ ) {
00076             u[j] = wdata[ii+j];
00077          }
00078          for( int j = 0; j < size2; j++ ) {
00079             l = 2 * j;
00080             v[j] = ( u[l] + u[l+1] ) * INVSQRT2;
00081             v[size2+j] = ( u[l] - u[l+1] ) * INVSQRT2;
00082          }
00083          for( int j = 0; j < size1; j++ ) {
00084             wdata[ii+j] = v[j];
00085          }
00086       }
00087 
00088       size1 = size2;
00089 
00090    }
00091 
00092    delete [] u;
00093    delete [] v;
00094 
00095 #ifdef STORM_FWT_CCHECKUSAGE
00096    if (size1 != ns) return 2;
00097 #endif
00098 
00099    return 0;
00100 
00101 #endif
00102 } 
00103 
00104 
00105 int hfwt2ds( 
00106           const int& Sizef2d,
00107           const int& ns,
00108           const int& size,
00109           const double* sdata,
00110                 double* wdata
00111 ) { 
00112 
00113 #ifdef STORM_USEF
00114 
00115    int iflag;
00116    dhfwt2ds_( &Sizef2d, &ns, &size, sdata, wdata, &iflag );
00117    return iflag;
00118 
00119 #else
00120 
00121    int ii,jj,l,size2;
00122    int size1 = size;
00123    double *u = new double[Sizef2d];
00124    double *v = new double[Sizef2d];
00125 
00126 #ifdef STORM_FWT_CCHECKUSAGE
00127    if ( size1 < ns ) return 1; 
00128 #endif
00129 
00130    for( int i = 0; i < size1; i++ ) {
00131       ii = i * size;
00132       for( int j = 0; j < size1; j++ ) {
00133          wdata[ii+j] = sdata[ii+j];
00134       }
00135    }
00136 
00137    if ( size1 == ns ) return 0;
00138 
00139    while ( size1 > ns ) {
00140 
00141       size2 = size1 / 2;
00142 
00143       for( int j = 0; j < size1; j++ ) {        // index 1
00144          for( int i = 0; i < size1; i++ ) {
00145             ii = i * size;
00146             u[i] = wdata[ii+j];
00147          }
00148          for( int i = 0; i < size2; i++ ) {
00149             l = 2 * i;
00150             v[i] = ( u[l] + u[l+1] ) * INVSQRT2;
00151             v[size2+i] = ( u[l] - u[l+1] ) * INVSQRT2;
00152          }
00153          for( int i = 0; i < size1; i++ ) {
00154             ii = i * size;
00155             wdata[ii+j] = v[i];
00156          }
00157       }
00158 
00159       for( int i = 0; i < size1; i++ ) {        // index 2
00160          ii = i * size;
00161          for( int j = 0; j < size1; j++ ) {
00162             u[j] = wdata[ii+j];
00163          }
00164          for( int j = 0; j < size2; j++ ) {
00165             l = 2 * j;
00166             v[j] = ( u[l] + u[l+1] ) * INVSQRT2;
00167             v[size2+j] = ( u[l] - u[l+1] ) * INVSQRT2;
00168          }
00169          for( int j = 0; j < size1; j++ ) {
00170             jj = j * size;
00171             wdata[ii+j] = v[j];
00172          }
00173       }
00174 
00175       size1 = size2;
00176 
00177    }
00178 
00179    delete [] u;
00180    delete [] v;
00181 
00182 #ifdef STORM_FWT_CCHECKUSAGE
00183    if (size1 != ns) return 2;
00184 #endif
00185 
00186    return 0;
00187 
00188 #endif
00189 } 
00190 
00191 
00192 int hfwt2ds( 
00193           const int& Sizef2d,
00194           const int& ns,
00195           const int& size,
00196           const int* sdata,
00197                 int* wdata
00198 ) { 
00199 
00200 #ifdef STORM_USEF
00201 
00202    int iflag;
00203    ihfwt2ds_( &Sizef2d, &ns, &size, sdata, wdata, &iflag );
00204    return iflag;
00205 
00206 #else
00207 
00208    int ii,l,size2;
00209    int size1 = size;
00210    int *u = new int[Sizef2d];
00211    int *v = new int[Sizef2d];
00212 
00213 #ifdef STORM_FWT_CCHECKUSAGE
00214    if ( size1 < ns ) return 1;
00215 #endif
00216 
00217    for( int i = 0; i < size1; i++ ) {
00218       ii = i * size;
00219       for( int j = 0; j < size1; j++ ) {
00220          wdata[ii+j] = sdata[ii+j];
00221       }
00222    }
00223 
00224    if ( size1 == ns ) return 0;
00225 
00226    while ( size1 > ns ) {
00227 
00228       size2 = size1 / 2;
00229 
00230       for( int j = 0; j < size1; j++ ) {        // index 1
00231          for( int i = 0; i < size1; i++ ) {
00232             ii = i * size;
00233             u[i] = wdata[ii+j];
00234          }
00235          for( int i = 0; i < size2; i++ ) {
00236             l = 2 * i;
00237             v[i] = ( u[l] + u[l+1] ) / 2;
00238             v[size2+i] = u[l] - u[l+1];
00239          }
00240          for( int i = 0; i < size1; i++ ) {
00241             ii = i * size;
00242             wdata[ii+j] = v[i];
00243          }
00244       }
00245 
00246       for( int i = 0; i < size1; i++ ) {        // index 2
00247          ii = i * size;
00248          for( int j = 0; j < size1; j++ ) {
00249             u[j] = wdata[ii+j];
00250          }
00251          for( int j = 0; j < size2; j++ ) {
00252             l = 2 * j;
00253             v[j] = ( u[l] + u[l+1] ) / 2;
00254             v[size2+j] = u[l] - u[l+1];
00255          }
00256          for( int j = 0; j < size1; j++ ) {
00257             wdata[ii+j] = v[j];
00258          }
00259       }
00260 
00261       size1 = size2;
00262 
00263    }
00264 
00265    delete [] u;
00266    delete [] v;
00267 
00268 #ifdef STORM_FWT_CCHECKUSAGE
00269    if (size1 != ns) return 2;
00270 #endif
00271 
00272    return 0;
00273 
00274 #endif
00275 } 
00276 
00277 
00278 int hfwt2ds( 
00279           const int& Sizef2d,
00280           const int& ns,
00281           const int& size,
00282           const float* sdata,
00283                 float* wdata,
00284                 float* ws
00285 ) { 
00286 
00287 #ifdef STORM_USEF
00288 
00289    int iflag;
00290    hfwt2dsws_( &Sizef2d, &ns, &size, sdata, wdata, ws, &iflag );
00291    return iflag;
00292 
00293 #else
00294 
00295    int ii,l,size2;
00296    int size1 = size;
00297    float *u = ws;
00298    float *v = &ws[Sizef2d];
00299 
00300 #ifdef STORM_FWT_CCHECKUSAGE
00301    if ( size1 < ns ) return 1;
00302 #endif
00303 
00304    for( int i = 0; i < size1; i++ ) {
00305       ii = i * size;
00306       for( int j = 0; j < size1; j++ ) {
00307          wdata[ii+j] = sdata[ii+j];
00308       }
00309    }
00310 
00311    if ( size1 == ns ) return 0;
00312 
00313    while ( size1 > ns ) {
00314 
00315       size2 = size1 / 2;
00316 
00317       for( int j = 0; j < size1; j++ ) {        // index 1
00318          for( int i = 0; i < size1; i++ ) {
00319             ii = i * size;
00320             u[i] = wdata[ii+j];
00321          }
00322          for( int i = 0; i < size2; i++ ) {
00323                l = 2 * i;
00324                v[i] = ( u[l] + u[l+1] ) * INVSQRT2;
00325                v[size2+i] = ( u[l] - u[l+1] ) * INVSQRT2;
00326          }
00327          for( int i = 0; i < size1; i++ ) {
00328             ii = i * size;
00329             wdata[ii+j] = v[i];
00330          }  
00331       }
00332 
00333       for( int i = 0; i < size1; i++ ) {        // index 2
00334          ii = i * size;
00335          for( int j = 0; j < size1; j++ ) {
00336             u[j] = wdata[ii+j];
00337          }
00338          for( int j = 0; j < size2; j++ ) {
00339             l = 2 * j;
00340             v[j] = ( u[l] + u[l+1] ) * INVSQRT2;
00341             v[size2+j] = ( u[l] - u[l+1] ) * INVSQRT2;
00342          }
00343          for( int j = 0; j < size1; j++ ) {
00344             wdata[ii+j] = v[j];
00345          }
00346       }
00347 
00348       size1 = size2;
00349 
00350    }
00351 
00352 #ifdef STORM_FWT_CCHECKUSAGE
00353    if (size1 != ns) return 2;
00354 #endif
00355 
00356    return 0;
00357 
00358 #endif
00359 } 
00360 
00361 
00362 int hfwt2ds( 
00363           const int& Sizef2d,
00364           const int& ns,
00365           const int& size,
00366           const double* sdata,
00367                 double* wdata,
00368                 double* ws
00369 ) { 
00370 
00371 #ifdef STORM_USEF
00372 
00373    int iflag;
00374    dhfwt2dsws_( &Sizef2d, &ns, &size, sdata, wdata, ws, &iflag );
00375    return iflag;
00376 
00377 #else
00378 
00379    int ii,l,size2;
00380    int size1 = size;
00381    double* u = ws;
00382    double* v = &ws[Sizef2d];
00383 
00384 #ifdef STORM_FWT_CCHECKUSAGE
00385    if ( size1 < ns ) return 1;
00386 #endif
00387 
00388    for( int i = 0; i < size1; i++ ) {
00389       ii = i * size;
00390       for( int j = 0; j < size1; j++ ) {
00391          wdata[ii+j] = sdata[ii+j];
00392       }
00393    }
00394 
00395    if ( size1 == ns ) return 0;
00396 
00397    while ( size1 > ns ) {
00398 
00399       size2 = size1 / 2;
00400 
00401       for( int j = 0; j < size1; j++ ) {        // index 1
00402          for( int i = 0; i < size1; i++ ) {
00403             ii = i * size;
00404             u[i] = wdata[ii+j];
00405          }
00406          for( int i = 0; i < size2; i++ ) {
00407             l = 2 * i;
00408             v[i] = ( u[l] + u[l+1] ) * INVSQRT2;
00409             v[size2+i] = ( u[l] - u[l+1] ) * INVSQRT2;
00410          }
00411          for( int i = 0; i < size1; i++ ) {
00412             ii = i * size;
00413             wdata[ii+j] = v[i];
00414          }
00415       }
00416 
00417       for( int i = 0; i < size1; i++ ) {        // index 2
00418          ii = i * size;
00419          for( int j = 0; j < size1; j++ ) {
00420             u[j] = wdata[ii+j];
00421          }
00422          for( int j = 0; j < size2; j++ ) {
00423             l = 2 * j;
00424             v[j] = ( u[l] + u[l+1] ) * INVSQRT2;
00425             v[size2+j] = ( u[l] - u[l+1] ) * INVSQRT2;
00426          }
00427          for( int j = 0; j < size1; j++ ) {
00428             wdata[ii+j] = v[j];
00429          }
00430       }
00431 
00432       size1 = size2;
00433 
00434    }
00435 
00436 #ifdef STORM_FWT_CCHECKUSAGE
00437    if (size1 != ns) return 2;
00438 #endif
00439 
00440    return 0;
00441 
00442 #endif
00443 } 
00444 
00445 
00446 int hfwt2ds( 
00447           const int& Sizef2d,
00448           const int& ns,
00449           const int& size,
00450           const int* sdata,
00451                 int* wdata,
00452                 int* ws
00453 ) { 
00454 
00455 #ifdef STORM_USEF
00456 
00457    int iflag;
00458    ihfwt2dsws_( &Sizef2d, &ns, &size, sdata, wdata, ws, &iflag );
00459    return iflag;
00460 
00461 #else
00462 
00463    int ii,l,size2;
00464    int size1 = size;
00465    int *u = ws;
00466    int *v = &ws[Sizef2d];
00467 
00468 #ifdef STORM_FWT_CCHECKUSAGE
00469    if ( size1 < ns ) return 1;
00470 #endif
00471 
00472    for( int i = 0; i < size1; i++ ) {
00473       ii = i * size;
00474       for( int j = 0; j < size1; j++ ) {
00475          wdata[ii+j] = sdata[ii+j];
00476       }
00477    }
00478 
00479    if ( size1 == ns ) return 0;
00480 
00481    while ( size1 > ns ) {
00482 
00483       size2 = size1 / 2;
00484 
00485       for( int j = 0; j < size1; j++ ) {        // index 1
00486          for( int i = 0; i < size1; i++ ) {
00487             ii = i * size;
00488             u[i] = wdata[ii+j];
00489          }
00490          for( int i = 0; i < size2; i++ ) {
00491                l = 2 * i;
00492                v[i] = ( u[l] + u[l+1] ) / 2;
00493                v[size2+i] = u[l] - u[l+1];
00494          }
00495          for( int i = 0; i < size1; i++ ) {
00496             ii = i * size;
00497             wdata[ii+j] = v[i];
00498          }  
00499       }
00500 
00501       for( int i = 0; i < size1; i++ ) {        // index 2
00502          ii = i * size;
00503          for( int j = 0; j < size1; j++ ) {
00504             u[j] = wdata[ii+j];
00505          }
00506          for( int j = 0; j < size2; j++ ) {
00507             l = 2 * j;
00508             v[j] = ( u[l] + u[l+1] ) / 2;
00509             v[size2+j] = u[l] - u[l+1];
00510          }
00511          for( int j = 0; j < size1; j++ ) {
00512             wdata[ii+j] = v[j];
00513          }
00514       }
00515 
00516       size1 = size2;
00517 
00518    }
00519 
00520 #ifdef STORM_FWT_CCHECKUSAGE
00521    if (size1 != ns) return 2;
00522 #endif
00523 
00524    return 0;
00525 
00526 #endif
00527 } 
00528 
00529 #undef INVSQRT2
00530 

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