00001
00002
00003
00004
00005
00006
00007 #ifdef STORM_USEF
00008 #include "pd4fwt_.h"
00009 #include "dpd4fwt_.h"
00010 #include "pd4fwtws_.h"
00011 #include "dpd4fwtws_.h"
00012 #endif
00013
00014 #include "stormdef.h"
00015 #define H0 STORMDEF_MATHCONST_D4H0
00016 #define H1 STORMDEF_MATHCONST_D4H1
00017 #define H2 STORMDEF_MATHCONST_D4H2
00018 #define H3 STORMDEF_MATHCONST_D4H3
00019
00020 int pd4fwt(
00021 const int& Sizef,
00022 const int& ns,
00023 const int& ks,
00024 const int& size,
00025 const float* sdata,
00026 float* wdata
00027 ) {
00028
00029 #ifdef STORM_USEF
00030
00031 int iflag;
00032 pd4fwt_( &Sizef, &ns, &ks, &size, sdata, wdata, &iflag );
00033 return iflag;
00034
00035 #else
00036
00037 int j;
00038 int j1,j2,j3;
00039 int size2;
00040 int size1 = size;
00041 float *xx = new float[Sizef];
00042
00043 #ifdef STORM_FWT_CCHECKUSAGE
00044 if ( size1 < ns ) return 1;
00045 #endif
00046
00047 for( int i = 0; i < size1; i++ ) { wdata[i] = sdata[i]; }
00048 if ( size1 == ns ) return 0;
00049 while ( size1 > ns ) {
00050 size2 = size1 / 2;
00051 for( int i = 0; i < size2; i++ ) {
00052 j = 2 * i;
00053 j1 = (j+1)%size1;
00054 j2 = (j+2)%size1;
00055 j3 = (j+3)%size1;
00056 xx[i] = H0*wdata[j] + H1*wdata[j+1]
00057 + H2*wdata[j2] + H3*wdata[j3];
00058 xx[size2+i] = H3*wdata[j] - H2*wdata[j1]
00059 + H1*wdata[j2] + H0*wdata[j3];
00060 }
00061 for( int i = 0; i < size1; i++ ) { wdata[i] = xx[i]; }
00062 size1 = size2;
00063 }
00064 delete [] xx;
00065
00066 #ifdef STORM_FWT_CCHECKUSAGE
00067 if ( size1 != ns ) return 2;
00068 #endif
00069
00070 return 0;
00071
00072 #endif
00073
00074 }
00075
00076
00077
00078 int pd4fwt(
00079 const int& Sizef,
00080 const int& ns,
00081 const int& ks,
00082 const int& size,
00083 const double* sdata,
00084 double* wdata
00085 ) {
00086
00087 #ifdef STORM_USEF
00088
00089 int iflag;
00090 dpd4fwt_( &Sizef, &ns, &ks, &size, sdata, wdata, &iflag );
00091 return iflag;
00092
00093 #else
00094
00095 int j;
00096 int j1,j2,j3;
00097 int size2;
00098 int size1 = size;
00099 double *xx = new double[Sizef];
00100
00101 #ifdef STORM_FWT_CCHECKUSAGE
00102 if ( size1 < ns ) return 1;
00103 #endif
00104
00105 for( int i = 0; i < size1; i++ ) { wdata[i] = sdata[i]; }
00106 if ( size1 == ns ) return 0;
00107 while ( size1 > ns ) {
00108 size2 = size1 / 2;
00109 for( int i = 0; i < size2; i++ ) {
00110 j = 2 * i;
00111 j1 = (j+1)%size1;
00112 j2 = (j+2)%size1;
00113 j3 = (j+3)%size1;
00114 xx[i] = H0*wdata[j] + H1*wdata[j+1]
00115 + H2*wdata[j2] + H3*wdata[j3];
00116 xx[size2+i] = H3*wdata[j] - H2*wdata[j1]
00117 + H1*wdata[j2] + H0*wdata[j3];
00118 }
00119 for( int i = 0; i < size1; i++ ) { wdata[i] = xx[i]; }
00120 size1 = size2;
00121 }
00122 delete [] xx;
00123
00124 #ifdef STORM_FWT_CCHECKUSAGE
00125 if ( size1 != ns ) return 2;
00126 #endif
00127
00128 return 0;
00129
00130 #endif
00131
00132 }
00133
00134
00135
00136 int pd4fwt(
00137 const int& Sizef,
00138 const int& ns,
00139 const int& ks,
00140 const int& size,
00141 const float* sdata,
00142 float* wdata,
00143 float* ws
00144 ) {
00145
00146 #ifdef STORM_USEF
00147
00148 int iflag;
00149 pd4fwtws_( &Sizef, &ns, &ks, &size, sdata, wdata, ws, &iflag );
00150 return iflag;
00151
00152 #else
00153
00154 int j;
00155 int j1,j2,j3;
00156 int size2;
00157 int size1 = size;
00158 if ( size1 < ns ) return 1;
00159 for( int i = 0; i < size1; i++ ) { wdata[i] = sdata[i]; }
00160
00161 #ifdef STORM_FWT_CCHECKUSAGE
00162 if ( size1 == ns ) return 0;
00163 #endif
00164
00165 while ( size1 > ns ) {
00166 size2 = size1 / 2;
00167 for( int i = 0; i < size2; i++ ) {
00168 j = 2 * i;
00169 j1 = (j+1)%size1;
00170 j2 = (j+2)%size1;
00171 j3 = (j+3)%size1;
00172 ws[i] = H0*wdata[j] + H1*wdata[j+1]
00173 + H2*wdata[j2] + H3*wdata[j3];
00174 ws[size2+i] = H3*wdata[j] - H2*wdata[j1]
00175 + H1*wdata[j2] + H0*wdata[j3];
00176 }
00177 for( int i = 0; i < size1; i++ ) { wdata[i] = ws[i]; }
00178 size1 = size2;
00179 }
00180
00181 #ifdef STORM_FWT_CCHECKUSAGE
00182 if ( size1 != ns ) return 2;
00183 #endif
00184
00185 return 0;
00186
00187 #endif
00188
00189 }
00190
00191
00192
00193 int pd4fwt(
00194 const int& Sizef,
00195 const int& ns,
00196 const int& ks,
00197 const int& size,
00198 const double* sdata,
00199 double* wdata,
00200 double* ws
00201 ) {
00202
00203 #ifdef STORM_USEF
00204
00205 int iflag;
00206 dpd4fwtws_( &Sizef, &ns, &ks, &size, sdata, wdata, ws, &iflag );
00207 return iflag;
00208
00209 #else
00210
00211 int j;
00212 int j1,j2,j3;
00213 int size2;
00214 int size1 = size;
00215
00216 #ifdef STORM_FWT_CCHECKUSAGE
00217 if ( size1 < ns ) return 1;
00218 #endif
00219
00220 for( int i = 0; i < size1; i++ ) { wdata[i] = sdata[i]; }
00221 if ( size1 == ns ) return 0;
00222 while ( size1 > ns ) {
00223 size2 = size1 / 2;
00224 for( int i = 0; i < size2; i++ ) {
00225 j = 2 * i;
00226 j1 = (j+1)%size1;
00227 j2 = (j+2)%size1;
00228 j3 = (j+3)%size1;
00229 ws[i] = H0*wdata[j] + H1*wdata[j+1]
00230 + H2*wdata[j2] + H3*wdata[j3];
00231 ws[size2+i] = H3*wdata[j] - H2*wdata[j1]
00232 + H1*wdata[j2] + H0*wdata[j3];
00233 }
00234 for( int i = 0; i < size1; i++ ) { wdata[i] = ws[i]; }
00235 size1 = size2;
00236 }
00237
00238 #ifdef STORM_FWT_CCHECKUSAGE
00239 if ( size1 != ns ) return 2;
00240 #endif
00241
00242 return 0;
00243
00244 #endif
00245
00246 }
00247
00248 #undef H0
00249 #undef H1
00250 #undef H2
00251 #undef H3
00252