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

hifwt3ds.cpp

Go to the documentation of this file.
00001 // hifwt3ds.cpp
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 1994-2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
00005 //////////////////////////////////////////////////////////////////////
00006 
00007 #ifdef STORM_USEF
00008 #include "hifwt3ds_.h"
00009 #include "dhifwt3ds_.h"
00010 #include "ihifwt3ds_.h"
00011 #include "hifwt3dsws_.h"
00012 #include "dhifwt3dsws_.h"
00013 #include "ihifwt3dsws_.h"
00014 #endif
00015 
00016 #include "stormdef.h"
00017 #define INVSQRT2 STORMDEF_MATHCONST_INVSQRT2
00018 
00019 int hifwt3ds( 
00020           const int& Sizef3d,
00021           const int& ns,
00022           const int& size,
00023           const float* wdata,
00024                 float* sdata
00025 ) { 
00026 
00027 #ifdef STORM_USEF
00028 
00029    int iflag;
00030    hifwt3ds_( &Sizef3d, &ns, &size, wdata, sdata, &iflag );
00031    return iflag;
00032 
00033 #else
00034 
00035    int ii,jj,size2;
00036    int size1 = ns;
00037    float *u = new float[Sizef3d];
00038    float *v = new float[Sizef3d];
00039 
00040 #ifdef STORM_FWT_CCHECKUSAGE
00041    if ( size1 < ns ) return 1;
00042 #endif
00043 
00044    for( int i = 0; i < size; i++ ) {
00045       ii=i*size*size;
00046       for( int j = 0; j < size; j++ ) {
00047          jj=j*size;
00048          for( int k = 0; k < size; k++ ) {
00049             sdata[ii+jj+k] = wdata[ii+jj+k];
00050          }
00051       }
00052    }
00053 
00054    if ( size == ns ) return 0;
00055 
00056    while ( size1 < size ) {
00057 
00058       size2 = size1;
00059       size1 = 2 * size1;
00060 
00061       for( int j = 0; j < size1; j++ ) {        // index 1
00062          jj = j * size;
00063          for( int k = 0; k < size1; k++ ) {
00064             for( int i = 0; i < size1; i++ ) {
00065                ii = i * size * size;
00066                u[i] = sdata[ii+jj+k];
00067             }
00068             for( int i = 0; i < size2; i++ ) {
00069                v[2*i] = ( u[i] + u[size2+i] ) * INVSQRT2;
00070                v[2*i+1] = ( u[i] - u[size2+i] ) * INVSQRT2;
00071             }
00072             for( int i = 0; i < size1; i++ ) {
00073                ii = i * size * size;
00074                sdata[ii+jj+k] = v[i];
00075             }
00076          }  
00077       }
00078 
00079       for( int i = 0; i < size1; i++ ) {        // index 2
00080          ii = i * size * size;
00081          for( int k = 0; k < size1; k++ ) {
00082             for( int j = 0; j < size1; j++ ) {
00083                jj = j * size;
00084                u[j] = sdata[ii+jj+k];
00085             }
00086             for( int j = 0; j < size2; j++ ) {
00087                v[2*j] = ( u[j] + u[size2+j] ) * INVSQRT2;
00088                v[2*j+1] = ( u[j] - u[size2+j] ) * INVSQRT2;
00089             }
00090             for( int j = 0; j < size1; j++ ) {
00091                jj = j * size;
00092                sdata[ii+jj+k] = v[j];
00093             }
00094          }
00095       }
00096 
00097       for( int i = 0; i < size1; i++ ) {        // index 3
00098          ii = i * size * size;
00099          for( int j = 0; j < size1; j++ ) {
00100             jj = j * size;
00101 
00102             for( int k = 0; k < size1; k++ ) {
00103                u[k] = sdata[ii+jj+k];
00104             }
00105 
00106             for( int k = 0; k < size2; k++ ) {
00107                v[2*k] = ( u[k] + u[size2+k] ) * INVSQRT2;
00108                v[2*k+1] = ( u[k] - u[size2+k] ) * INVSQRT2;
00109             }
00110 
00111             for( int k = 0; k < size1; k++ ) {
00112                sdata[ii+jj+k] = v[k];
00113             }
00114          }
00115       }
00116 
00117    }
00118    
00119    delete [] u;
00120    delete [] v;
00121 
00122 #ifdef STORM_FWT_CCHECKUSAGE
00123    if ( size1 > size ) return 2;
00124 #endif
00125 
00126    return 0;
00127 
00128 #endif
00129 } 
00130 
00131 
00132 int hifwt3ds( 
00133           const int& Sizef3d,
00134           const int& ns,
00135           const int& size,
00136           const double* wdata,
00137                 double* sdata
00138 ) { 
00139 
00140 #ifdef STORM_USEF
00141 
00142    int iflag;
00143    dhifwt3ds_( &Sizef3d, &ns, &size, wdata, sdata, &iflag );
00144    return iflag;
00145 
00146 #else
00147 
00148    int ii,jj,size2;
00149    int size1 = ns;
00150    double *u = new double[Sizef3d];
00151    double *v = new double[Sizef3d];
00152 
00153 #ifdef STORM_FWT_CCHECKUSAGE
00154    if ( size1 < ns ) return 1;
00155 #endif
00156 
00157    for( int i = 0; i < size; i++ ) {
00158       ii=i*size*size;
00159       for( int j = 0; j < size; j++ ) {
00160          jj=j*size;
00161          for( int k = 0; k < size; k++ ) {
00162             sdata[ii+jj+k] = wdata[ii+jj+k];
00163          }
00164       }
00165    }
00166 
00167    if ( size == ns ) return 0;
00168 
00169    while ( size1 < size ) {
00170 
00171       size2 = size1;
00172       size1 = 2 * size1;
00173 
00174       for( int j = 0; j < size1; j++ ) {        // index 1
00175          jj = j * size;
00176          for( int k = 0; k < size1; k++ ) {
00177             for( int i = 0; i < size1; i++ ) {
00178                ii = i * size * size;
00179                u[i] = sdata[ii+jj+k];
00180             }
00181             for( int i = 0; i < size2; i++ ) {
00182                v[2*i] = ( u[i] + u[size2+i] ) * INVSQRT2;
00183                v[2*i+1] = ( u[i] - u[size2+i] ) * INVSQRT2;
00184             }
00185             for( int i = 0; i < size1; i++ ) {
00186                ii = i * size * size;
00187                sdata[ii+jj+k] = v[i];
00188             }
00189          }  
00190       }
00191 
00192       for( int i = 0; i < size1; i++ ) {        // index 2
00193          ii = i * size * size;
00194          for( int k = 0; k < size1; k++ ) {
00195             for( int j = 0; j < size1; j++ ) {
00196                jj = j * size;
00197                u[j] = sdata[ii+jj+k];
00198             }
00199             for( int j = 0; j < size2; j++ ) {
00200                v[2*j] = ( u[j] + u[size2+j] ) * INVSQRT2;
00201                v[2*j+1] = ( u[j] - u[size2+j] ) * INVSQRT2;
00202             }
00203             for( int j = 0; j < size1; j++ ) {
00204                jj = j * size;
00205                sdata[ii+jj+k] = v[j];
00206             }
00207          }
00208       }
00209 
00210       for( int i = 0; i < size1; i++ ) {        // index 3
00211          ii = i * size * size;
00212          for( int j = 0; j < size1; j++ ) {
00213             jj = j * size;
00214 
00215             for( int k = 0; k < size1; k++ ) {
00216                u[k] = sdata[ii+jj+k];
00217             }
00218 
00219             for( int k = 0; k < size2; k++ ) {
00220                v[2*k] = ( u[k] + u[size2+k] ) * INVSQRT2;
00221                v[2*k+1] = ( u[k] - u[size2+k] ) * INVSQRT2;
00222             }
00223 
00224             for( int k = 0; k < size1; k++ ) {
00225                sdata[ii+jj+k] = v[k];
00226             }
00227          }
00228       }
00229 
00230    }
00231 
00232    delete [] u;
00233    delete [] v;
00234 
00235 
00236 #ifdef STORM_FWT_CCHECKUSAGE
00237    if ( size1 > size ) return 2;
00238 #endif
00239 
00240    return 0;
00241 
00242 #endif
00243 } 
00244 
00245 
00246 int hifwt3ds( 
00247           const int& Sizef3d,
00248           const int& ns,
00249           const int& size,
00250           const int* wdata,
00251                 int* sdata
00252 ) { 
00253 
00254 #ifdef STORM_USEF
00255 
00256    int iflag;
00257    ihifwt3ds_( &Sizef3d, &ns, &size, wdata, sdata, &iflag );
00258    return iflag;
00259 
00260 #else
00261 
00262    int ii,jj,size2;
00263    int size1 = ns;
00264    int* u = new int[Sizef3d];
00265    int* v = new int[Sizef3d];
00266 
00267 #ifdef STORM_FWT_CCHECKUSAGE
00268    if ( size1 < ns ) return 1;
00269 #endif
00270 
00271    for( int i = 0; i < size; i++ ) {
00272       ii=i*size*size;
00273       for( int j = 0; j < size; j++ ) {
00274          jj=j*size;
00275          for( int k = 0; k < size; k++ ) {
00276             sdata[ii+jj+k] = wdata[ii+jj+k];
00277          }
00278       }
00279    }
00280 
00281    if ( size == ns ) return 0;
00282 
00283    while ( size1 < size ) {
00284 
00285       size2 = size1;
00286       size1 = 2 * size1;
00287 
00288       for( int j = 0; j < size1; j++ ) {        // index 1
00289          jj = j * size;
00290          for( int k = 0; k < size1; k++ ) {
00291             for( int i = 0; i < size1; i++ ) {
00292                ii = i * size * size;
00293                u[i] = sdata[ii+jj+k];
00294             }
00295             for( int i = 0; i < size2; i++ ) {
00296                v[2*i] = ( u[i] + u[size2+i] ) / 2;
00297                v[2*i+1] = ( u[i] - u[size2+i] );
00298             }
00299             for( int i = 0; i < size1; i++ ) {
00300                ii = i * size * size;
00301                sdata[ii+jj+k] = v[i];
00302             }
00303          }  
00304       }
00305 
00306       for( int i = 0; i < size1; i++ ) {        // index 2
00307          ii = i * size * size;
00308          for( int k = 0; k < size1; k++ ) {
00309             for( int j = 0; j < size1; j++ ) {
00310                jj = j * size;
00311                u[j] = sdata[ii+jj+k];
00312             }
00313             for( int j = 0; j < size2; j++ ) {
00314                v[2*j] = ( u[j] + u[size2+j] ) / 2;
00315                v[2*j+1] = ( u[j] - u[size2+j] );
00316             }
00317             for( int j = 0; j < size1; j++ ) {
00318                jj = j * size;
00319                sdata[ii+jj+k] = v[j];
00320             }
00321          }
00322       }
00323 
00324       for( int i = 0; i < size1; i++ ) {        // index 3
00325          ii = i * size * size;
00326          for( int j = 0; j < size1; j++ ) {
00327             jj = j * size;
00328 
00329             for( int k = 0; k < size1; k++ ) {
00330                u[k] = sdata[ii+jj+k];
00331             }
00332 
00333             for( int k = 0; k < size2; k++ ) {
00334                v[2*k] = ( u[k] + u[size2+k] ) / 2;
00335                v[2*k+1] = ( u[k] - u[size2+k] );
00336             }
00337 
00338             for( int k = 0; k < size1; k++ ) {
00339                sdata[ii+jj+k] = v[k];
00340             }
00341          }
00342       }
00343 
00344    }
00345    
00346    delete [] u;
00347    delete [] v;
00348 
00349 #ifdef STORM_FWT_CCHECKUSAGE
00350    if ( size1 > size ) return 2;
00351 #endif
00352 
00353    return 0;
00354 
00355 #endif
00356 } 
00357 
00358 
00359 int hifwt3ds( 
00360           const int& Sizef3d,
00361           const int& ns,
00362           const int& size,
00363           const float* wdata,
00364                 float* sdata,
00365                 float* ws
00366 ) { 
00367 
00368 #ifdef STORM_USEF
00369 
00370    int iflag;
00371    hifwt3dsws_( &Sizef3d, &ns, &size, wdata, sdata, ws, &iflag );
00372    return iflag;
00373 
00374 #else
00375 
00376    int ii,jj,size2;
00377    int size1 = ns;
00378    float *u = ws;
00379    float *v = &ws[Sizef3d];
00380 
00381 #ifdef STORM_FWT_CCHECKUSAGE
00382    if ( size1 < ns ) return 1;
00383 #endif
00384 
00385    for( int i = 0; i < size; i++ ) {
00386       ii=i*size*size;
00387       for( int j = 0; j < size; j++ ) {
00388          jj=j*size;
00389          for( int k = 0; k < size; k++ ) {
00390             sdata[ii+jj+k] = wdata[ii+jj+k];
00391          }
00392       }
00393    }
00394 
00395    if ( size == ns ) return 0;
00396 
00397    while ( size1 < size ) {
00398 
00399       size2 = size1;
00400       size1 = 2 * size1;
00401 
00402       for( int j = 0; j < size1; j++ ) {        // index 1
00403          jj = j * size;
00404          for( int k = 0; k < size1; k++ ) {
00405             for( int i = 0; i < size1; i++ ) {
00406                ii = i * size * size;
00407                u[i] = sdata[ii+jj+k];
00408             }
00409             for( int i = 0; i < size2; i++ ) {
00410                v[2*i] = ( u[i] + u[size2+i] ) * INVSQRT2;
00411                v[2*i+1] = ( u[i] - u[size2+i] ) * INVSQRT2;
00412             }
00413             for( int i = 0; i < size1; i++ ) {
00414                ii = i * size * size;
00415                sdata[ii+jj+k] = v[i];
00416             }
00417          }  
00418       }
00419 
00420       for( int i = 0; i < size1; i++ ) {        // index 2
00421          ii = i * size * size;
00422          for( int k = 0; k < size1; k++ ) {
00423             for( int j = 0; j < size1; j++ ) {
00424                jj = j * size;
00425                u[j] = sdata[ii+jj+k];
00426             }
00427             for( int j = 0; j < size2; j++ ) {
00428                v[2*j] = ( u[j] + u[size2+j] ) * INVSQRT2;
00429                v[2*j+1] = ( u[j] - u[size2+j] ) * INVSQRT2;
00430             }
00431             for( int j = 0; j < size1; j++ ) {
00432                jj = j * size;
00433                sdata[ii+jj+k] = v[j];
00434             }
00435          }
00436       }
00437 
00438       for( int i = 0; i < size1; i++ ) {        // index 3
00439          ii = i * size * size;
00440          for( int j = 0; j < size1; j++ ) {
00441             jj = j * size;
00442 
00443             for( int k = 0; k < size1; k++ ) {
00444                u[k] = sdata[ii+jj+k];
00445             }
00446 
00447             for( int k = 0; k < size2; k++ ) {
00448                v[2*k] = ( u[k] + u[size2+k] ) * INVSQRT2;
00449                v[2*k+1] = ( u[k] - u[size2+k] ) * INVSQRT2;
00450             }
00451 
00452             for( int k = 0; k < size1; k++ ) {
00453                sdata[ii+jj+k] = v[k];
00454             }
00455          }
00456       }
00457 
00458    }
00459    
00460 #ifdef STORM_FWT_CCHECKUSAGE
00461    if ( size1 > size ) return 2;
00462 #endif
00463 
00464    return 0;
00465 
00466 #endif
00467 } 
00468 
00469 
00470 int hifwt3ds( 
00471           const int& Sizef3d,
00472           const int& ns,
00473           const int& size,
00474           const double* wdata,
00475                 double* sdata,
00476                 double* ws
00477 ) { 
00478 
00479 #ifdef STORM_USEF
00480 
00481    int iflag;
00482    dhifwt3dsws_( &Sizef3d, &ns, &size, wdata, sdata, ws, &iflag );
00483    return iflag;
00484 
00485 #else
00486 
00487    int ii,jj,size2;
00488    int size1 = ns;
00489    double *u = ws;
00490    double *v = &ws[Sizef3d];
00491 
00492 #ifdef STORM_FWT_CCHECKUSAGE
00493    if ( size1 < ns ) return 1;
00494 #endif
00495 
00496    for( int i = 0; i < size; i++ ) {
00497       ii=i*size*size;
00498       for( int j = 0; j < size; j++ ) {
00499          jj=j*size;
00500          for( int k = 0; k < size; k++ ) {
00501             sdata[ii+jj+k] = wdata[ii+jj+k];
00502          }
00503       }
00504    }
00505 
00506    if ( size == ns ) return 0;
00507 
00508    while ( size1 < size ) {
00509 
00510       size2 = size1;
00511       size1 = 2 * size1;
00512 
00513       for( int j = 0; j < size1; j++ ) {        // index 1
00514          jj = j * size;
00515          for( int k = 0; k < size1; k++ ) {
00516             for( int i = 0; i < size1; i++ ) {
00517                ii = i * size * size;
00518                u[i] = sdata[ii+jj+k];
00519             }
00520             for( int i = 0; i < size2; i++ ) {
00521                v[2*i] = ( u[i] + u[size2+i] ) * INVSQRT2;
00522                v[2*i+1] = ( u[i] - u[size2+i] ) * INVSQRT2;
00523             }
00524             for( int i = 0; i < size1; i++ ) {
00525                ii = i * size * size;
00526                sdata[ii+jj+k] = v[i];
00527             }
00528          }  
00529       }
00530 
00531       for( int i = 0; i < size1; i++ ) {        // index 2
00532          ii = i * size * size;
00533          for( int k = 0; k < size1; k++ ) {
00534             for( int j = 0; j < size1; j++ ) {
00535                jj = j * size;
00536                u[j] = sdata[ii+jj+k];
00537             }
00538             for( int j = 0; j < size2; j++ ) {
00539                v[2*j] = ( u[j] + u[size2+j] ) * INVSQRT2;
00540                v[2*j+1] = ( u[j] - u[size2+j] ) * INVSQRT2;
00541             }
00542             for( int j = 0; j < size1; j++ ) {
00543                jj = j * size;
00544                sdata[ii+jj+k] = v[j];
00545             }
00546          }
00547       }
00548 
00549       for( int i = 0; i < size1; i++ ) {        // index 3
00550          ii = i * size * size;
00551          for( int j = 0; j < size1; j++ ) {
00552             jj = j * size;
00553 
00554             for( int k = 0; k < size1; k++ ) {
00555                u[k] = sdata[ii+jj+k];
00556             }
00557 
00558             for( int k = 0; k < size2; k++ ) {
00559                v[2*k] = ( u[k] + u[size2+k] ) * INVSQRT2;
00560                v[2*k+1] = ( u[k] - u[size2+k] ) * INVSQRT2;
00561             }
00562 
00563             for( int k = 0; k < size1; k++ ) {
00564                sdata[ii+jj+k] = v[k];
00565             }
00566          }
00567       }
00568 
00569    }
00570 
00571 #ifdef STORM_FWT_CCHECKUSAGE
00572    if ( size1 > size ) return 2;
00573 #endif
00574 
00575    return 0;
00576 
00577 #endif
00578 } 
00579 
00580 
00581 int hifwt3ds( 
00582           const int& Sizef3d,
00583           const int& ns,
00584           const int& size,
00585           const int* wdata,
00586                 int* sdata,
00587                 int* ws
00588 ) { 
00589 
00590 #ifdef STORM_USEF
00591 
00592    int iflag;
00593    ihifwt3dsws_( &Sizef3d, &ns, &size, wdata, sdata, ws, &iflag );
00594    return iflag;
00595 
00596 #else
00597 
00598    int ii,jj,size2;
00599    int size1 = ns;
00600    int *u = ws;
00601    int *v = &ws[Sizef3d];
00602 
00603 #ifdef STORM_FWT_CCHECKUSAGE
00604    if ( size1 < ns ) return 1;
00605 #endif
00606 
00607    for( int i = 0; i < size; i++ ) {
00608       ii=i*size*size;
00609       for( int j = 0; j < size; j++ ) {
00610          jj=j*size;
00611          for( int k = 0; k < size; k++ ) {
00612             sdata[ii+jj+k] = wdata[ii+jj+k];
00613          }
00614       }
00615    }
00616 
00617    if ( size == ns ) return 0;
00618 
00619    while ( size1 < size ) {
00620 
00621       size2 = size1;
00622       size1 = 2 * size1;
00623 
00624       for( int j = 0; j < size1; j++ ) {        // index 1
00625          jj = j * size;
00626          for( int k = 0; k < size1; k++ ) {
00627             for( int i = 0; i < size1; i++ ) {
00628                ii = i * size * size;
00629                u[i] = sdata[ii+jj+k];
00630             }
00631             for( int i = 0; i < size2; i++ ) {
00632                v[2*i] = ( u[i] + u[size2+i] ) / 2;
00633                v[2*i+1] = u[i] - u[size2+i];
00634             }
00635             for( int i = 0; i < size1; i++ ) {
00636                ii = i * size * size;
00637                sdata[ii+jj+k] = v[i];
00638             }
00639          }  
00640       }
00641 
00642       for( int i = 0; i < size1; i++ ) {        // index 2
00643          ii = i * size * size;
00644          for( int k = 0; k < size1; k++ ) {
00645             for( int j = 0; j < size1; j++ ) {
00646                jj = j * size;
00647                u[j] = sdata[ii+jj+k];
00648             }
00649             for( int j = 0; j < size2; j++ ) {
00650                v[2*j] = ( u[j] + u[size2+j] ) / 2;
00651                v[2*j+1] = u[j] - u[size2+j];
00652             }
00653             for( int j = 0; j < size1; j++ ) {
00654                jj = j * size;
00655                sdata[ii+jj+k] = v[j];
00656             }
00657          }
00658       }
00659 
00660       for( int i = 0; i < size1; i++ ) {        // index 3
00661          ii = i * size * size;
00662          for( int j = 0; j < size1; j++ ) {
00663             jj = j * size;
00664 
00665             for( int k = 0; k < size1; k++ ) {
00666                u[k] = sdata[ii+jj+k];
00667             }
00668 
00669             for( int k = 0; k < size2; k++ ) {
00670                v[2*k] = ( u[k] + u[size2+k] ) / 2;
00671                v[2*k+1] = u[k] - u[size2+k];
00672             }
00673 
00674             for( int k = 0; k < size1; k++ ) {
00675                sdata[ii+jj+k] = v[k];
00676             }
00677          }
00678       }
00679 
00680    }
00681    
00682 #ifdef STORM_FWT_CCHECKUSAGE
00683    if ( size1 > size ) return 2;
00684 #endif
00685 
00686    return 0;
00687 
00688 #endif
00689 } 
00690 
00691 #undef INVSQRT2
00692 

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