00001
00002
00003
00004
00005
00006
00007 #ifdef STORM_USEF
00008 #include "g1ifwt_.h"
00009 #include "dg1ifwt_.h"
00010 #include "g1ifwtws_.h"
00011 #include "dg1ifwtws_.h"
00012 #endif
00013
00014 #include "stormdef.h"
00015 #define H00 STORMDEF_MATHCONST_GHB1H00
00016 #define H10 STORMDEF_MATHCONST_GHB1H10
00017 #define H11 STORMDEF_MATHCONST_GHB1H11
00018
00019 int g1ifwt(
00020 const int& Sizef,
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 g1ifwt_( &Sizef, &ns, &size, wdata, sdata, &iflag );
00031 return iflag;
00032
00033 #else
00034
00035 int size2;
00036 int size1 = ns;
00037
00038 #ifdef STORM_FWT_CCHECKUSAGE
00039 if ( size < ns ) return 1;
00040 #endif
00041
00042 if ( size == ns ) {
00043 for( int i = 0; i < 2*size; i++ ) {
00044 sdata[i] = wdata[i];
00045 }
00046 return 0;
00047 }
00048 float *xx = new float[2*Sizef];
00049 for( int i = 0; i < 2*size; i++ ) {
00050 xx[i] = wdata[i];
00051 }
00052 while ( size1 < size ) {
00053 size2 = size1;
00054 size1 = 2 * size1;
00055 for( int i = 0; i < size2; i++ ) {
00056
00057 sdata[4*i] = H00 * xx[2*i]
00058 + H11 * xx[2*(size2+i)]
00059 + H10 * xx[2*i+1];
00060
00061 sdata[4*i+1] = - H10 * xx[2*(size2+i)]
00062 + H11 * xx[2*i+1]
00063 + H00 * xx[2*(size2+i)+1];
00064
00065 sdata[4*i+2] = H00 * xx[2*i]
00066 - H11 * xx[2*(size2+i)]
00067 - H10 * xx[2*i+1];
00068
00069 sdata[4*i+3] = - H10 * xx[2*(size2+i)]
00070 + H11 * xx[2*i+1]
00071 - H00 * xx[2*(size2+i)+1];
00072
00073 }
00074 for( int i = 0; i < 2*size1; i++ ) {
00075 xx[i] = sdata[i];
00076 }
00077 }
00078 delete [] xx;
00079
00080 #ifdef STORM_FWT_CCHECKUSAGE
00081 if ( size1 > size ) return 2;
00082 #endif
00083
00084 return 0;
00085
00086 #endif
00087
00088 }
00089
00090
00091
00092 int g1ifwt(
00093 const int& Sizef,
00094 const int& ns,
00095 const int& size,
00096 const double* wdata,
00097 double* sdata
00098 ) {
00099
00100 #ifdef STORM_USEF
00101
00102 int iflag;
00103 dg1ifwt_( &Sizef, &ns, &size, wdata, sdata, &iflag );
00104 return iflag;
00105
00106 #else
00107
00108 int size2;
00109 int size1 = ns;
00110
00111 #ifdef STORM_FWT_CCHECKUSAGE
00112 if ( size < ns ) return 1;
00113 #endif
00114
00115 if ( size == ns ) {
00116 for( int i = 0; i < 2*size; i++ ) {
00117 sdata[i] = wdata[i];
00118 }
00119 return 0;
00120 }
00121 double *xx = new double[2*Sizef];
00122 for( int i = 0; i < 2*size; i++ ) {
00123 xx[i] = wdata[i];
00124 }
00125 while ( size1 < size ) {
00126 size2 = size1;
00127 size1 = 2 * size1;
00128 for( int i = 0; i < size2; i++ ) {
00129
00130 sdata[4*i] = H00 * xx[2*i]
00131 + H11 * xx[2*(size2+i)]
00132 + H10 * xx[2*i+1];
00133
00134 sdata[4*i+1] = - H10 * xx[2*(size2+i)]
00135 + H11 * xx[2*i+1]
00136 + H00 * xx[2*(size2+i)+1];
00137
00138 sdata[4*i+2] = H00 * xx[2*i]
00139 - H11 * xx[2*(size2+i)]
00140 - H10 * xx[2*i+1];
00141
00142 sdata[4*i+3] = - H10 * xx[2*(size2+i)]
00143 + H11 * xx[2*i+1]
00144 - H00 * xx[2*(size2+i)+1];
00145
00146 }
00147 for( int i = 0; i < 2*size1; i++ ) {
00148 xx[i] = sdata[i];
00149 }
00150 }
00151 delete [] xx;
00152
00153 #ifdef STORM_FWT_CCHECKUSAGE
00154 if ( size1 > size ) return 2;
00155 #endif
00156
00157 return 0;
00158
00159 #endif
00160
00161 }
00162
00163
00164
00165 int g1ifwt(
00166 const int& Sizef,
00167 const int& ns,
00168 const int& size,
00169 const float* wdata,
00170 float* sdata,
00171 float* ws
00172 ) {
00173
00174 #ifdef STORM_USEF
00175
00176 int iflag;
00177 g1ifwtws_( &Sizef, &ns, &size, wdata, sdata, ws, &iflag );
00178 return iflag;
00179
00180 #else
00181
00182 int size2;
00183 int size1 = ns;
00184
00185 #ifdef STORM_FWT_CCHECKUSAGE
00186 if ( size < ns ) return 1;
00187 #endif
00188
00189 if ( size == ns ) {
00190 for( int i = 0; i < 2*size; i++ ) {
00191 sdata[i] = wdata[i];
00192 }
00193 return 0;
00194 }
00195 for( int i = 0; i < 2*size; i++ ) {
00196 ws[i] = wdata[i];
00197 }
00198 while ( size1 < size ) {
00199 size2 = size1;
00200 size1 = 2 * size1;
00201 for( int i = 0; i < size2; i++ ) {
00202
00203 sdata[4*i] = H00 * ws[2*i]
00204 + H11 * ws[2*(size2+i)]
00205 + H10 * ws[2*i+1];
00206
00207 sdata[4*i+1] = - H10 * ws[2*(size2+i)]
00208 + H11 * ws[2*i+1]
00209 + H00 * ws[2*(size2+i)+1];
00210
00211 sdata[4*i+2] = H00 * ws[2*i]
00212 - H11 * ws[2*(size2+i)]
00213 - H10 * ws[2*i+1];
00214
00215 sdata[4*i+3] = - H10 * ws[2*(size2+i)]
00216 + H11 * ws[2*i+1]
00217 - H00 * ws[2*(size2+i)+1];
00218
00219 }
00220 for( int i = 0; i < 2*size1; i++ ) {
00221 ws[i] = sdata[i];
00222 }
00223 }
00224
00225 #ifdef STORM_FWT_CCHECKUSAGE
00226 if ( size1 > size ) return 2;
00227 #endif
00228
00229 return 0;
00230
00231 #endif
00232
00233 }
00234
00235
00236
00237 int g1ifwt(
00238 const int& Sizef,
00239 const int& ns,
00240 const int& size,
00241 const double* wdata,
00242 double* sdata,
00243 double* ws
00244 ) {
00245
00246 #ifdef STORM_USEF
00247
00248 int iflag;
00249 dg1ifwtws_( &Sizef, &ns, &size, wdata, sdata, ws, &iflag );
00250 return iflag;
00251
00252 #else
00253
00254 int size2;
00255 int size1 = ns;
00256
00257 #ifdef STORM_FWT_CCHECKUSAGE
00258 if ( size < ns ) return 1;
00259 #endif
00260
00261 if ( size == ns ) {
00262 for( int i = 0; i < 2*size; i++ ) {
00263 sdata[i] = wdata[i];
00264 }
00265 return 0;
00266 }
00267 for( int i = 0; i < 2*size; i++ ) {
00268 ws[i] = wdata[i];
00269 }
00270 while ( size1 < size ) {
00271 size2 = size1;
00272 size1 = 2 * size1;
00273 for( int i = 0; i < size2; i++ ) {
00274
00275 sdata[4*i] = H00 * ws[2*i]
00276 + H11 * ws[2*(size2+i)]
00277 + H10 * ws[2*i+1];
00278
00279 sdata[4*i+1] = - H10 * ws[2*(size2+i)]
00280 + H11 * ws[2*i+1]
00281 + H00 * ws[2*(size2+i)+1];
00282
00283 sdata[4*i+2] = H00 * ws[2*i]
00284 - H11 * ws[2*(size2+i)]
00285 - H10 * ws[2*i+1];
00286
00287 sdata[4*i+3] = - H10 * ws[2*(size2+i)]
00288 + H11 * ws[2*i+1]
00289 - H00 * ws[2*(size2+i)+1];
00290
00291 }
00292 for( int i = 0; i < 2*size1; i++ ) {
00293 ws[i] = sdata[i];
00294 }
00295 }
00296
00297 #ifdef STORM_FWT_CCHECKUSAGE
00298 if ( size1 > size ) return 2;
00299 #endif
00300
00301 return 0;
00302
00303 #endif
00304
00305 }
00306
00307
00308 #undef H00
00309 #undef H10
00310 #undef H11
00311