00001
00002
00003
00004
00005
00006
00007 #ifdef STORM_USEF
00008 #include "g1fwt2ds_.h"
00009 #include "dg1fwt2ds_.h"
00010 #include "g1fwt2dsws_.h"
00011 #include "dg1fwt2dsws_.h"
00012 #endif
00013
00014
00015 #include "stormdef.h"
00016 #define H00 STORMDEF_MATHCONST_GHB1H00
00017 #define H10 STORMDEF_MATHCONST_GHB1H10
00018 #define H11 STORMDEF_MATHCONST_GHB1H11
00019
00020
00021 int g1fwt2ds(
00022 const int& Sizef2d,
00023 const int& ns,
00024 const int& size,
00025 const float* sdata,
00026 float* wdata
00027 ) {
00028
00029 #ifdef STORM_USEF
00030
00031 int iflag;
00032 g1fwt2ds_( &Sizef2d, &ns, &size, sdata, wdata, &iflag );
00033 return iflag;
00034
00035 #else
00036
00037 int ii,l,size2;
00038 int size1 = size;
00039
00040 #ifdef STORM_FWT_CCHECKUSAGE
00041 if ( size1 < ns ) return 1;
00042 #endif
00043
00044 for( int i = 0; i < 2*size*size; i++ ) {
00045 wdata[i] = sdata[i];
00046 }
00047
00048 if ( size1 == ns ) return 0;
00049
00050 float *u = new float[2*Sizef2d];
00051 float *v = new float[2*Sizef2d];
00052
00053 while ( size1 > ns ) {
00054
00055 size2 = size1 / 2;
00056
00057 for( int j = 0; j < size1; j++ ) {
00058 for( int i = 0; i < size1; i++ ) {
00059 ii = i * size;
00060 u[2*i] = wdata[2*(ii+j)];
00061 u[2*i+1] = wdata[2*(ii+j)+1];
00062 }
00063 for( int i = 0; i < size2; i++ ) {
00064 l = 2 * i;
00065 v[2*i] = H00 * ( u[2*l] + u[2*l+2] );
00066 v[2*i+1] = H10 * ( u[2*l] - u[2*l+2] )
00067 + H11 * ( u[2*l+1] + u[2*l+3] );
00068 v[2*(size2+i)] = H11 * ( u[2*l] - u[2*l+2] )
00069 - H10 * ( u[2*l+1] + u[2*l+3] );
00070 v[2*(size2+i)+1] = H00 * ( u[2*l+1] - u[2*l+3] );
00071 }
00072 for( int i = 0; i < size1; i++ ) {
00073 ii = i * size;
00074 wdata[2*(ii+j)] = v[2*i];
00075 wdata[2*(ii+j)+1] = v[2*i+1];
00076 }
00077 }
00078
00079 for( int i = 0; i < size1; i++ ) {
00080 ii = i * size;
00081 for( int j = 0; j < size1; j++ ) {
00082 u[2*j] = wdata[2*(ii+j)];
00083 u[2*j+1] = wdata[2*(ii+j)+1];
00084 }
00085 for( int j = 0; j < size2; j++ ) {
00086 l = 2 * j;
00087 v[2*j] = H00 * ( u[2*l] + u[2*l+2] );
00088 v[2*j+1] = H10 * ( u[2*l] - u[2*l+2] )
00089 + H11 * ( u[2*l+1] + u[2*l+3] );
00090 v[2*(size2+j)] = H11 * ( u[2*l] - u[2*l+2] )
00091 - H10 * ( u[2*l+1] + u[2*l+3] );
00092 v[2*(size2+j)+1] = H00 * ( u[2*l+1] - u[2*l+3] );
00093 }
00094 for( int j = 0; j < size1; j++ ) {
00095 wdata[2*(ii+j)] = v[2*j];
00096 wdata[2*(ii+j)+1] = v[2*j+1];
00097 }
00098 }
00099
00100 size1 = size2;
00101
00102 }
00103 delete [] u;
00104 delete [] v;
00105
00106 #ifdef STORM_FWT_CCHECKUSAGE
00107 if (size1 < ns) return 2;
00108 #endif
00109
00110 return 0;
00111
00112 #endif
00113
00114 }
00115
00116
00117
00118 int g1fwt2ds(
00119 const int& Sizef2d,
00120 const int& ns,
00121 const int& size,
00122 const double* sdata,
00123 double* wdata
00124 ) {
00125
00126 #ifdef STORM_USEF
00127
00128 int iflag;
00129 dg1fwt2ds_( &Sizef2d, &ns, &size, sdata, wdata, &iflag );
00130 return iflag;
00131
00132 #else
00133
00134 int ii,l,size2;
00135 int size1 = size;
00136
00137 #ifdef STORM_FWT_CCHECKUSAGE
00138 if ( size1 < ns ) return 1;
00139 #endif
00140
00141 for( int i = 0; i < 2*size*size; i++ ) {
00142 wdata[i] = sdata[i];
00143 }
00144
00145 if ( size1 == ns ) return 0;
00146
00147 double *u = new double[2*Sizef2d];
00148 double *v = new double[2*Sizef2d];
00149
00150 while ( size1 > ns ) {
00151
00152 size2 = size1 / 2;
00153
00154 for( int j = 0; j < size1; j++ ) {
00155 for( int i = 0; i < size1; i++ ) {
00156 ii = i * size;
00157 u[2*i] = wdata[2*(ii+j)];
00158 u[2*i+1] = wdata[2*(ii+j)+1];
00159 }
00160 for( int i = 0; i < size2; i++ ) {
00161 l = 2 * i;
00162 v[2*i] = H00 * ( u[2*l] + u[2*l+2] );
00163 v[2*i+1] = H10 * ( u[2*l] - u[2*l+2] )
00164 + H11 * ( u[2*l+1] + u[2*l+3] );
00165 v[2*(size2+i)] = H11 * ( u[2*l] - u[2*l+2] )
00166 - H10 * ( u[2*l+1] + u[2*l+3] );
00167 v[2*(size2+i)+1] = H00 * ( u[2*l+1] - u[2*l+3] );
00168 }
00169 for( int i = 0; i < size1; i++ ) {
00170 ii = i * size;
00171 wdata[2*(ii+j)] = v[2*i];
00172 wdata[2*(ii+j)+1] = v[2*i+1];
00173 }
00174 }
00175
00176 for( int i = 0; i < size1; i++ ) {
00177 ii = i * size;
00178 for( int j = 0; j < size1; j++ ) {
00179 u[2*j] = wdata[2*(ii+j)];
00180 u[2*j+1] = wdata[2*(ii+j)+1];
00181 }
00182 for( int j = 0; j < size2; j++ ) {
00183 l = 2 * j;
00184 v[2*j] = H00 * ( u[2*l] + u[2*l+2] );
00185 v[2*j+1] = H10 * ( u[2*l] - u[2*l+2] )
00186 + H11 * ( u[2*l+1] + u[2*l+3] );
00187 v[2*(size2+j)] = H11 * ( u[2*l] - u[2*l+2] )
00188 - H10 * ( u[2*l+1] + u[2*l+3] );
00189 v[2*(size2+j)+1] = H00 * ( u[2*l+1] - u[2*l+3] );
00190 }
00191 for( int j = 0; j < size1; j++ ) {
00192 wdata[2*(ii+j)] = v[2*j];
00193 wdata[2*(ii+j)+1] = v[2*j+1];
00194 }
00195 }
00196
00197 size1 = size2;
00198
00199 }
00200 delete [] u;
00201 delete [] v;
00202
00203 #ifdef STORM_FWT_CCHECKUSAGE
00204 if (size1 < ns) return 2;
00205 #endif
00206
00207 return 0;
00208
00209 #endif
00210
00211 }
00212
00213
00214
00215 int g1fwt2ds(
00216 const int& Sizef2d,
00217 const int& ns,
00218 const int& size,
00219 const float* sdata,
00220 float* wdata,
00221 float* ws
00222 ) {
00223
00224 #ifdef STORM_USEF
00225
00226 int iflag;
00227 g1fwt2dsws_( &Sizef2d, &ns, &size, sdata, wdata, ws, &iflag );
00228 return iflag;
00229
00230 #else
00231
00232 int ii,l,size2;
00233 int size1 = size;
00234 float *u = ws;
00235 float *v = &ws[2*Sizef2d];
00236
00237 #ifdef STORM_FWT_CCHECKUSAGE
00238 if ( size1 < ns ) return 1;
00239 #endif
00240
00241 for( int i = 0; i < 2*size*size; i++ ) {
00242 wdata[i] = sdata[i];
00243 }
00244
00245 if ( size1 == ns ) return 0;
00246
00247 while ( size1 > ns ) {
00248
00249 size2 = size1 / 2;
00250
00251 for( int j = 0; j < size1; j++ ) {
00252 for( int i = 0; i < size1; i++ ) {
00253 ii = i * size;
00254 u[2*i] = wdata[2*(ii+j)];
00255 u[2*i+1] = wdata[2*(ii+j)+1];
00256 }
00257 for( int i = 0; i < size2; i++ ) {
00258 l = 2 * i;
00259 v[2*i] = H00 * ( u[2*l] + u[2*l+2] );
00260 v[2*i+1] = H10 * ( u[2*l] - u[2*l+2] )
00261 + H11 * ( u[2*l+1] + u[2*l+3] );
00262 v[2*(size2+i)] = H11 * ( u[2*l] - u[2*l+2] )
00263 - H10 * ( u[2*l+1] + u[2*l+3] );
00264 v[2*(size2+i)+1] = H00 * ( u[2*l+1] - u[2*l+3] );
00265 }
00266 for( int i = 0; i < size1; i++ ) {
00267 ii = i * size;
00268 wdata[2*(ii+j)] = v[2*i];
00269 wdata[2*(ii+j)+1] = v[2*i+1];
00270 }
00271 }
00272
00273 for( int i = 0; i < size1; i++ ) {
00274 ii = i * size;
00275 for( int j = 0; j < size1; j++ ) {
00276 u[2*j] = wdata[2*(ii+j)];
00277 u[2*j+1] = wdata[2*(ii+j)+1];
00278 }
00279 for( int j = 0; j < size2; j++ ) {
00280 l = 2 * j;
00281 v[2*j] = H00 * ( u[2*l] + u[2*l+2] );
00282 v[2*j+1] = H10 * ( u[2*l] - u[2*l+2] )
00283 + H11 * ( u[2*l+1] + u[2*l+3] );
00284 v[2*(size2+j)] = H11 * ( u[2*l] - u[2*l+2] )
00285 - H10 * ( u[2*l+1] + u[2*l+3] );
00286 v[2*(size2+j)+1] = H00 * ( u[2*l+1] - u[2*l+3] );
00287 }
00288 for( int j = 0; j < size1; j++ ) {
00289 wdata[2*(ii+j)] = v[2*j];
00290 wdata[2*(ii+j)+1] = v[2*j+1];
00291 }
00292 }
00293
00294 size1 = size2;
00295
00296 }
00297
00298 #ifdef STORM_FWT_CCHECKUSAGE
00299 if (size1 < ns) return 2;
00300 #endif
00301
00302 return 0;
00303
00304 #endif
00305
00306 }
00307
00308
00309
00310 int g1fwt2ds(
00311 const int& Sizef2d,
00312 const int& ns,
00313 const int& size,
00314 const double* sdata,
00315 double* wdata,
00316 double* ws
00317 ) {
00318
00319 #ifdef STORM_USEF
00320
00321 int iflag;
00322 dg1fwt2dsws_( &Sizef2d, &ns, &size, sdata, wdata, ws, &iflag );
00323 return iflag;
00324
00325 #else
00326
00327 int ii,l,size2;
00328 int size1 = size;
00329 double *u = ws;
00330 double *v = &ws[2*Sizef2d];
00331
00332 #ifdef STORM_FWT_CCHECKUSAGE
00333 if ( size1 < ns ) return 1;
00334 #endif
00335
00336 for( int i = 0; i < 2*size*size; i++ ) {
00337 wdata[i] = sdata[i];
00338 }
00339
00340 if ( size1 == ns ) return 0;
00341
00342 while ( size1 > ns ) {
00343
00344 size2 = size1 / 2;
00345
00346 for( int j = 0; j < size1; j++ ) {
00347 for( int i = 0; i < size1; i++ ) {
00348 ii = i * size;
00349 u[2*i] = wdata[2*(ii+j)];
00350 u[2*i+1] = wdata[2*(ii+j)+1];
00351 }
00352 for( int i = 0; i < size2; i++ ) {
00353 l = 2 * i;
00354 v[2*i] = H00 * ( u[2*l] + u[2*l+2] );
00355 v[2*i+1] = H10 * ( u[2*l] - u[2*l+2] )
00356 + H11 * ( u[2*l+1] + u[2*l+3] );
00357 v[2*(size2+i)] = H11 * ( u[2*l] - u[2*l+2] )
00358 - H10 * ( u[2*l+1] + u[2*l+3] );
00359 v[2*(size2+i)+1] = H00 * ( u[2*l+1] - u[2*l+3] );
00360 }
00361 for( int i = 0; i < size1; i++ ) {
00362 ii = i * size;
00363 wdata[2*(ii+j)] = v[2*i];
00364 wdata[2*(ii+j)+1] = v[2*i+1];
00365 }
00366 }
00367
00368 for( int i = 0; i < size1; i++ ) {
00369 ii = i * size;
00370 for( int j = 0; j < size1; j++ ) {
00371 u[2*j] = wdata[2*(ii+j)];
00372 u[2*j+1] = wdata[2*(ii+j)+1];
00373 }
00374 for( int j = 0; j < size2; j++ ) {
00375 l = 2 * j;
00376 v[2*j] = H00 * ( u[2*l] + u[2*l+2] );
00377 v[2*j+1] = H10 * ( u[2*l] - u[2*l+2] )
00378 + H11 * ( u[2*l+1] + u[2*l+3] );
00379 v[2*(size2+j)] = H11 * ( u[2*l] - u[2*l+2] )
00380 - H10 * ( u[2*l+1] + u[2*l+3] );
00381 v[2*(size2+j)+1] = H00 * ( u[2*l+1] - u[2*l+3] );
00382 }
00383 for( int j = 0; j < size1; j++ ) {
00384 wdata[2*(ii+j)] = v[2*j];
00385 wdata[2*(ii+j)+1] = v[2*j+1];
00386 }
00387 }
00388 size1 = size2;
00389
00390 }
00391
00392 #ifdef STORM_FWT_CCHECKUSAGE
00393 if (size1 < ns) return 2;
00394 #endif
00395
00396 return 0;
00397
00398 #endif
00399
00400 }
00401
00402
00403 #undef H00
00404 #undef H10
00405 #undef H11
00406