Changeset 1365 for trunk/psLib/test/dataManip/tst_psVectorFFT.c
- Timestamp:
- Aug 2, 2004, 9:43:23 AM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/test/dataManip/tst_psVectorFFT.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/test/dataManip/tst_psVectorFFT.c
r1193 r1365 1 1 /** @file tst_psVectorFFT.c 2 *3 * @brief Contains the tests for psFFT.[ch]4 *5 *6 * @author Robert DeSonia, MHPCC7 *8 * @version $Revision: 1.3$ $Name: not supported by cvs2svn $9 * @date $Date: 2004-07-08 01:05:01$10 *11 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii12 */2 * 3 * @brief Contains the tests for psFFT.[ch] 4 * 5 * 6 * @author Robert DeSonia, MHPCC 7 * 8 * @version $Revision: 1.4 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2004-08-02 19:43:23 $ 10 * 11 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii 12 */ 13 13 14 14 #include <math.h> … … 21 21 img = psImageAlloc(c,r,PS_TYPE_##TYP); \ 22 22 for (unsigned int row=0;row<r;row++) { \ 23 ps##TYP* imgRow = img->data.TYP[row]; \24 for (unsigned int col=0;col<c;col++) { \25 imgRow[col] = (ps##TYP)(valueFcn); \26 } \27 }28 29 static int testVectorFFT( void);30 static int testVectorRealImaginary( void);31 static int testVectorComplex( void);32 static int testVectorConjugate( void);33 static int testVectorPowerSpectrum( void);23 ps##TYP* imgRow = img->data.TYP[row]; \ 24 for (unsigned int col=0;col<c;col++) { \ 25 imgRow[col] = (ps##TYP)(valueFcn); \ 26 } \ 27 } 28 29 static int testVectorFFT( void ); 30 static int testVectorRealImaginary( void ); 31 static int testVectorComplex( void ); 32 static int testVectorConjugate( void ); 33 static int testVectorPowerSpectrum( void ); 34 34 35 35 testDescription tests[] = { 36 {testVectorFFT,600,"psVectorFFT",0,false}, 37 {testVectorRealImaginary,601,"psVectorRealImaginary",0,false}, 38 {testVectorComplex,602,"psVectorComplex",0,false}, 39 {testVectorConjugate,603,"psVectorConjugate",0,false}, 40 {testVectorPowerSpectrum,604,"psVectorPowerSpectrum",0,false}, 41 {NULL} 36 { 37 testVectorFFT, 600, "psVectorFFT", 0, false 38 }, 39 { 40 testVectorRealImaginary, 601, "psVectorRealImaginary", 0, false 41 }, 42 { 43 testVectorComplex, 602, "psVectorComplex", 0, false 44 }, 45 { 46 testVectorConjugate, 603, "psVectorConjugate", 0, false 47 }, 48 { 49 testVectorPowerSpectrum, 604, "psVectorPowerSpectrum", 0, false 50 }, 51 { 52 NULL 53 } 42 54 }; 43 44 int main(int argc, char* argv[]) 45 { 46 psLogSetLevel(PS_LOG_INFO); 47 48 if (! runTestSuite(stderr,"psFFT",tests,argc,argv) ) { 49 psAbort(__FILE__,"One or more tests failed"); 50 } 51 return 0; 52 } 53 54 int testVectorFFT(void) 55 { 56 psVector* vec = NULL; 55 56 int main( int argc, char* argv[] ) 57 { 58 psLogSetLevel( PS_LOG_INFO ); 59 60 return ( ! runTestSuite( stderr, "psFFT", tests, argc, argv ) ); 61 } 62 63 int testVectorFFT( void ) 64 { 65 psVector * vec = NULL; 57 66 psVector* vec2 = NULL; 58 67 psVector* vec3 = NULL; 59 68 60 69 /* 61 70 1. assign a vector to a sinisoid … … 65 74 5. compare to original (should be equal to within a reasonable error) 66 75 */ 67 76 68 77 // 1. assign a vector to a sinisoid 69 vec =psVectorAlloc(100,PS_TYPE_F32);70 vec->n = vec->nalloc; 71 for ( unsigned int n = 0; n<100; n++) {72 vec->data.F32[n] = sinf((psF32)n / 50.0f * M_PI);73 }74 78 vec = psVectorAlloc( 100, PS_TYPE_F32 ); 79 vec->n = vec->nalloc; 80 for ( unsigned int n = 0; n < 100; n++ ) { 81 vec->data.F32[ n ] = sinf( ( psF32 ) n / 50.0f * M_PI ); 82 } 83 75 84 // 2. perform a forward transform 76 vec2 = psVectorFFT( NULL,vec,PS_FFT_FORWARD);77 if ( vec2->type.type != PS_TYPE_C32) {78 psError(__func__,"FFT didn't produce complex values?");79 return 1;80 }81 82 85 vec2 = psVectorFFT( NULL, vec, PS_FFT_FORWARD ); 86 if ( vec2->type.type != PS_TYPE_C32 ) { 87 psError( __func__, "FFT didn't produce complex values?" ); 88 return 1; 89 } 90 91 83 92 // 3. verify that the only significant component cooresponds to the freqency of the input in step 1. 84 for ( unsigned int n = 0; n<100; n++) {85 if (n==1 || n==99) {86 if (fabsf(cabsf(vec2->data.C32[n]) - 50.0f) > 0.1f) {87 psError(__func__,"FFT didn't work for vector (n=%d)",n);88 return 2;89 }90 } else {91 if (fabsf(cabsf(vec2->data.C32[n])) > 0.1f) {92 psError(__func__,"FFT didn't work for vector (n=%d)",n);93 return 3;94 }95 }96 }97 93 for ( unsigned int n = 0; n < 100; n++ ) { 94 if ( n == 1 || n == 99 ) { 95 if ( fabsf( cabsf( vec2->data.C32[ n ] ) - 50.0f ) > 0.1f ) { 96 psError( __func__, "FFT didn't work for vector (n=%d)", n ); 97 return 2; 98 } 99 } else { 100 if ( fabsf( cabsf( vec2->data.C32[ n ] ) ) > 0.1f ) { 101 psError( __func__, "FFT didn't work for vector (n=%d)", n ); 102 return 3; 103 } 104 } 105 } 106 98 107 // 4. perform a reverse transform 99 vec3 = psVectorFFT( NULL,vec2,PS_FFT_REVERSE);100 if ( vec3->type.type != PS_TYPE_C32) {101 psError(__func__,"FFT didn't produce complex values?");102 return 4;103 }104 for ( unsigned int n = 0; n<100; n++) {105 psF32 val =sinf((psF32)n / 50.0f * M_PI);106 psF32 vecVal = crealf(vec3->data.C32[n])/100;107 if (fabsf(vecVal - val) > 0.1f) {108 psError(__func__,"Reverse FFT didn't give me the original vector back (n=%d) (%.2f vs %.2f)",109 n,vecVal,val);110 return 5;111 }112 }113 114 psFree( vec);115 psFree( vec2);116 psFree( vec3);117 118 return 0; 119 } 120 121 int testVectorRealImaginary( void)122 { 123 psVector * vec = NULL;108 vec3 = psVectorFFT( NULL, vec2, PS_FFT_REVERSE ); 109 if ( vec3->type.type != PS_TYPE_C32 ) { 110 psError( __func__, "FFT didn't produce complex values?" ); 111 return 4; 112 } 113 for ( unsigned int n = 0; n < 100; n++ ) { 114 psF32 val = sinf( ( psF32 ) n / 50.0f * M_PI ); 115 psF32 vecVal = crealf( vec3->data.C32[ n ] ) / 100; 116 if ( fabsf( vecVal - val ) > 0.1f ) { 117 psError( __func__, "Reverse FFT didn't give me the original vector back (n=%d) (%.2f vs %.2f)", 118 n, vecVal, val ); 119 return 5; 120 } 121 } 122 123 psFree( vec ); 124 psFree( vec2 ); 125 psFree( vec3 ); 126 127 return 0; 128 } 129 130 int testVectorRealImaginary( void ) 131 { 132 psVector * vec = NULL; 124 133 psVector* vec2 = NULL; 125 134 psVector* vec3 = NULL; 126 135 127 136 /* 128 137 1. create a C32 complex vector with distinctly different real and imaginary parts. … … 130 139 3. compare results to the real/imaginary components of input 131 140 */ 132 141 133 142 // 1. create a C32 complex vector with distinctly different real and imaginary parts. 134 vec =psVectorAlloc(100,PS_TYPE_C32);135 vec->n = vec->nalloc; 136 for ( unsigned int n = 0; n<100; n++) {137 vec->data.C32[n] = n + I * (n*2);138 }139 143 vec = psVectorAlloc( 100, PS_TYPE_C32 ); 144 vec->n = vec->nalloc; 145 for ( unsigned int n = 0; n < 100; n++ ) { 146 vec->data.C32[ n ] = n + I * ( n * 2 ); 147 } 148 140 149 // 2. call psVectorReal and psVectorImaginary 141 vec2 = psVectorReal( vec2,vec);142 if ( vec2 == NULL) {143 psError(__func__,"psVectorReal returned a NULL?");144 return 1;145 }146 if ( vec2->type.type != PS_TYPE_F32) {147 psError(__func__,"psVectorReal returned a wrong type (%d)?",148 vec2->type.type);149 return 2;150 }151 152 vec3 = psVectorImaginary( vec3,vec);153 if ( vec3 == NULL) {154 psError(__func__,"psVectorImaginary returned a NULL?");155 return 3;156 }157 if ( vec3->type.type != PS_TYPE_F32) {158 psError(__func__,"psVectorImaginary returned a wrong type (%d)?",159 vec3->type.type);160 return 4;161 }162 150 vec2 = psVectorReal( vec2, vec ); 151 if ( vec2 == NULL ) { 152 psError( __func__, "psVectorReal returned a NULL?" ); 153 return 1; 154 } 155 if ( vec2->type.type != PS_TYPE_F32 ) { 156 psError( __func__, "psVectorReal returned a wrong type (%d)?", 157 vec2->type.type ); 158 return 2; 159 } 160 161 vec3 = psVectorImaginary( vec3, vec ); 162 if ( vec3 == NULL ) { 163 psError( __func__, "psVectorImaginary returned a NULL?" ); 164 return 3; 165 } 166 if ( vec3->type.type != PS_TYPE_F32 ) { 167 psError( __func__, "psVectorImaginary returned a wrong type (%d)?", 168 vec3->type.type ); 169 return 4; 170 } 171 163 172 // 3. compare results to the real/imaginary components of input 164 for ( unsigned int n = 0; n<100; n++) {165 psF32 r = n;166 psF32 i = (n*2);167 if (fabsf(vec2->data.F32[n] -r) > FLT_EPSILON) {168 psError(__func__,"psVectorReal didn't return the real portion at n=%d",169 n);170 return 5;171 }172 if (fabsf(vec3->data.F32[n] -i) > FLT_EPSILON) {173 psError(__func__,"psVectorImaginary didn't return the real portion at n=%d",174 n);175 return 6;176 }177 }178 179 psFree( vec);180 psFree( vec2);181 psFree( vec3);182 183 return 0; 184 } 185 186 int testVectorComplex( void)187 { 188 psVector * vec = NULL;173 for ( unsigned int n = 0; n < 100; n++ ) { 174 psF32 r = n; 175 psF32 i = ( n * 2 ); 176 if ( fabsf( vec2->data.F32[ n ] - r ) > FLT_EPSILON ) { 177 psError( __func__, "psVectorReal didn't return the real portion at n=%d", 178 n ); 179 return 5; 180 } 181 if ( fabsf( vec3->data.F32[ n ] - i ) > FLT_EPSILON ) { 182 psError( __func__, "psVectorImaginary didn't return the real portion at n=%d", 183 n ); 184 return 6; 185 } 186 } 187 188 psFree( vec ); 189 psFree( vec2 ); 190 psFree( vec3 ); 191 192 return 0; 193 } 194 195 int testVectorComplex( void ) 196 { 197 psVector * vec = NULL; 189 198 psVector* vec2 = NULL; 190 199 psVector* vec3 = NULL; 191 200 192 201 /* 193 202 1. create two unique psF32 vectors of the same size … … 196 205 4. call psVectorReal and psVectorImaginary on step 2 results 197 206 5. compare step 4 results to input. 198 207 199 208 6. create a psF32 and a psF64 vector of the same size 200 209 7. call psVectorComplex 201 210 8. verify that an appropriate error occurred. 202 211 203 212 9. create two psf32 vectors of different sizes 204 213 10. call psVectorComplex 205 214 11. verify thet an appropriate error occurred. 206 215 */ 207 216 208 217 // 1. create two unique psF32 vectors of the same size 209 vec =psVectorAlloc(100,PS_TYPE_F32);210 vec2 =psVectorAlloc(100,PS_TYPE_F32);218 vec = psVectorAlloc( 100, PS_TYPE_F32 ); 219 vec2 = psVectorAlloc( 100, PS_TYPE_F32 ); 211 220 vec->n = vec->nalloc; 212 221 vec2->n = vec2->nalloc; 213 for ( unsigned int n = 0; n<100; n++) {214 vec->data.F32[n] = n;215 vec2->data.F32[n] = (n*2);216 }217 222 for ( unsigned int n = 0; n < 100; n++ ) { 223 vec->data.F32[ n ] = n; 224 vec2->data.F32[ n ] = ( n * 2 ); 225 } 226 218 227 // 2. call psVectorComplex 219 vec3 = psVectorComplex( vec3,vec,vec2);220 228 vec3 = psVectorComplex( vec3, vec, vec2 ); 229 221 230 // 3. verify that the result is a psC32 222 if ( vec3->type.type != PS_TYPE_C32) {223 psError(__func__,"Vector Type from psVectorComplex is not complex? (%d)",224 vec3->type.type);225 return 1;226 }227 231 if ( vec3->type.type != PS_TYPE_C32 ) { 232 psError( __func__, "Vector Type from psVectorComplex is not complex? (%d)", 233 vec3->type.type ); 234 return 1; 235 } 236 228 237 // 4. call psVectorReal and psVectorImaginary on step 2 results (not needed, just use crealf/cimagf) 229 238 // 5. compare step 4 results to input. 230 for ( unsigned int n = 0; n<100; n++) {231 if (fabsf(crealf(vec3->data.C32[n]) - n) > FLT_EPSILON ||232 fabsf(cimagf(vec3->data.C32[n]) - (n*2)) > FLT_EPSILON) {233 psError(__func__,"psVectorComplex result is invalid (n=%d, %.2f+%.2fi)",234 n,crealf(vec3->data.C32[n]),cimagf(vec3->data.C32[n]));235 return 2;236 };237 }238 239 239 for ( unsigned int n = 0; n < 100; n++ ) { 240 if ( fabsf( crealf( vec3->data.C32[ n ] ) - n ) > FLT_EPSILON || 241 fabsf( cimagf( vec3->data.C32[ n ] ) - ( n * 2 ) ) > FLT_EPSILON ) { 242 psError( __func__, "psVectorComplex result is invalid (n=%d, %.2f+%.2fi)", 243 n, crealf( vec3->data.C32[ n ] ), cimagf( vec3->data.C32[ n ] ) ); 244 return 2; 245 }; 246 } 247 248 240 249 // 6. create a psF32 and a psF64 vector of the same size 241 vec2 = psVectorRecycle( vec2,PS_TYPE_F64, 100);242 250 vec2 = psVectorRecycle( vec2, PS_TYPE_F64, 100 ); 251 243 252 // 7. call psVectorComplex 244 psLogMsg( __func__,PS_LOG_INFO, "Following should be an error (type mismatch).");245 vec3 = psVectorComplex( vec3,vec,vec2);253 psLogMsg( __func__, PS_LOG_INFO, "Following should be an error (type mismatch)." ); 254 vec3 = psVectorComplex( vec3, vec, vec2 ); 246 255 // 8. verify that an appropriate error occurred. (this partially has to be done via inspection) 247 if ( vec3 != NULL) {248 psError(__func__,"psVectorComplex returned a vector though input types mismatched.");249 return 3;250 }251 256 if ( vec3 != NULL ) { 257 psError( __func__, "psVectorComplex returned a vector though input types mismatched." ); 258 return 3; 259 } 260 252 261 // 9. create two psf32 vectors of different sizes 253 vec2 = psVectorRecycle( vec2,PS_TYPE_F32,200);254 262 vec2 = psVectorRecycle( vec2, PS_TYPE_F32, 200 ); 263 255 264 // 10. call psVectorComplex 256 vec3 = psVectorComplex( vec3,vec,vec2);257 265 vec3 = psVectorComplex( vec3, vec, vec2 ); 266 258 267 // 11. verify thet an appropriate error occurred. (actually, it isn't an error...) 259 if ( vec3->n != 100) {260 psError(__func__,"psVectorComplex returned a vector though input sizes mismatched.");261 return 4;262 }263 264 psFree( vec);265 psFree( vec2);266 psFree( vec3);267 268 return 0; 269 } 270 271 int testVectorConjugate( void)272 { 273 psVector * vec = NULL;274 psVector* vec2 = NULL; 275 268 if ( vec3->n != 100 ) { 269 psError( __func__, "psVectorComplex returned a larger vector than the input supported (%d).", vec3->n ); 270 return 4; 271 } 272 273 psFree( vec ); 274 psFree( vec2 ); 275 psFree( vec3 ); 276 277 return 0; 278 } 279 280 int testVectorConjugate( void ) 281 { 282 psVector * vec = NULL; 283 psVector* vec2 = NULL; 284 276 285 /* 277 286 1. create a psC32 with unique real and imaginary values. … … 280 289 4. verify each value is conjugate of input (a+bi -> a-bi) 281 290 */ 282 291 283 292 // 1. create a psC32 with unique real and imaginary values. 284 vec =psVectorAlloc(100,PS_TYPE_C32);285 vec->n = vec->nalloc; 286 for ( unsigned int n = 0; n<100; n++) {287 vec->data.C32[n] = n + I * (n*2);288 }289 293 vec = psVectorAlloc( 100, PS_TYPE_C32 ); 294 vec->n = vec->nalloc; 295 for ( unsigned int n = 0; n < 100; n++ ) { 296 vec->data.C32[ n ] = n + I * ( n * 2 ); 297 } 298 290 299 // 2. call psVectorConjugate 291 vec2 = psVectorConjugate( vec2,vec);292 300 vec2 = psVectorConjugate( vec2, vec ); 301 293 302 // 3. verify result is psC32 294 if ( vec2->type.type != PS_TYPE_C32) {295 psError(__func__,"the psVectorConjugate didn't return a C32 vector");296 return 1;297 }298 303 if ( vec2->type.type != PS_TYPE_C32 ) { 304 psError( __func__, "the psVectorConjugate didn't return a C32 vector" ); 305 return 1; 306 } 307 299 308 // 4. verify each value is conjugate of input (a+bi -> a-bi) 300 for ( unsigned int n = 0; n<100; n++) {301 if (fabsf(crealf(vec->data.C32[n]) - crealf(vec2->data.C32[n])) > FLT_EPSILON ||302 fabsf(cimagf(vec->data.C32[n]) + cimagf(vec2->data.C32[n])) > FLT_EPSILON) {303 psError(__func__,"psVectorComplex result is invalid (n=%d, %.2f+%.2fi)",304 n,crealf(vec2->data.C32[n]),cimagf(vec2->data.C32[n]));305 return 2;306 };307 }308 309 psFree( vec);310 psFree( vec2);311 312 return 0; 313 } 314 315 int testVectorPowerSpectrum( void)316 { 317 psVector * vec = NULL;309 for ( unsigned int n = 0; n < 100; n++ ) { 310 if ( fabsf( crealf( vec->data.C32[ n ] ) - crealf( vec2->data.C32[ n ] ) ) > FLT_EPSILON || 311 fabsf( cimagf( vec->data.C32[ n ] ) + cimagf( vec2->data.C32[ n ] ) ) > FLT_EPSILON ) { 312 psError( __func__, "psVectorComplex result is invalid (n=%d, %.2f+%.2fi)", 313 n, crealf( vec2->data.C32[ n ] ), cimagf( vec2->data.C32[ n ] ) ); 314 return 2; 315 }; 316 } 317 318 psFree( vec ); 319 psFree( vec2 ); 320 321 return 0; 322 } 323 324 int testVectorPowerSpectrum( void ) 325 { 326 psVector * vec = NULL; 318 327 psVector* vec2 = NULL; 319 328 psF32 val; 320 329 321 330 /* 322 331 1. create a psC32 vector with unique real and imaginary components … … 325 334 4. verify the values are the square of the absolute values of the original 326 335 */ 327 336 328 337 // 1. create a psC32 vector with unique real and imaginary components 329 vec =psVectorAlloc(100,PS_TYPE_C32);330 vec->n = vec->nalloc; 331 for ( unsigned int n = 0; n<100; n++) {332 vec->data.C32[n] = n + I * sinf(((psF32)n) / 50.f * M_PI);333 }334 338 vec = psVectorAlloc( 100, PS_TYPE_C32 ); 339 vec->n = vec->nalloc; 340 for ( unsigned int n = 0; n < 100; n++ ) { 341 vec->data.C32[ n ] = n + I * sinf( ( ( psF32 ) n ) / 50.f * M_PI ); 342 } 343 335 344 // 2. call psVectorPowerSpectrum 336 vec2 = psVectorPowerSpectrum( vec2,vec);337 345 vec2 = psVectorPowerSpectrum( vec2, vec ); 346 338 347 // 3. verify result is psF32 339 if ( vec2->type.type != PS_TYPE_F32) {340 psError(__func__,"the type was not PS_TYPE_F32.");341 return 1;342 }343 348 if ( vec2->type.type != PS_TYPE_F32 ) { 349 psError( __func__, "the type was not PS_TYPE_F32." ); 350 return 1; 351 } 352 344 353 // 4. verify the values are the square of the absolute values of the original 345 354 // (ADD specifies something else) … … 348 357 // P_N/2 = |C_N/2|^2/N^2 349 358 // where j = 1,2,...,(N/2-1) 350 351 val = cabsf(vec->data.C32[0])*cabsf(vec->data.C32[0])/100/100; 352 if (fabsf(vec2->data.F32[0] - val) > FLT_EPSILON) { 353 psError(__func__,"psVectorPowerSpectrum result is invalid (n=0, %.2f %.2f)", 354 vec2->data.F32[0],val); 355 return 2; 356 }; 357 358 for (unsigned int n = 1; n<50; n++) { 359 val = ( cabsf(vec->data.C32[n])*cabsf(vec->data.C32[n])+ 360 cabsf(vec->data.C32[100-n])*cabsf(vec->data.C32[100-n]) ) /100/100; 361 362 if (fabsf(val - vec2->data.F32[n]) > FLT_EPSILON) { 363 psError(__func__,"psVectorPowerSpectrum result is invalid (n=%d, %.2f %.2f)", 364 n,vec2->data.F32[n],val); 359 360 val = cabsf( vec->data.C32[ 0 ] ) * cabsf( vec->data.C32[ 0 ] ) / 100 / 100; 361 if ( fabsf( vec2->data.F32[ 0 ] - val ) > FLT_EPSILON ) { 362 psError( __func__, "psVectorPowerSpectrum result is invalid (n=0, %.2f %.2f)", 363 vec2->data.F32[ 0 ], val ); 365 364 return 2; 366 365 }; 367 } 368 369 val = cabsf(vec->data.C32[50])*cabsf(vec->data.C32[50])/100/100; 370 if (fabsf(vec2->data.F32[50] - val) > FLT_EPSILON) { 371 psError(__func__,"psVectorPowerSpectrum result is invalid (n=50, %.2f %.2f)", 372 vec2->data.F32[0],val); 373 return 2; 374 }; 375 376 psFree(vec); 377 psFree(vec2); 378 379 return 0; 380 } 366 367 for ( unsigned int n = 1; n < 50; n++ ) { 368 val = ( cabsf( vec->data.C32[ n ] ) * cabsf( vec->data.C32[ n ] ) + 369 cabsf( vec->data.C32[ 100 - n ] ) * cabsf( vec->data.C32[ 100 - n ] ) ) / 100 / 100; 370 371 if ( fabsf( val - vec2->data.F32[ n ] ) > FLT_EPSILON ) { 372 psError( __func__, "psVectorPowerSpectrum result is invalid (n=%d, %.2f %.2f)", 373 n, vec2->data.F32[ n ], val ); 374 return 2; 375 }; 376 } 377 378 val = cabsf( vec->data.C32[ 50 ] ) * cabsf( vec->data.C32[ 50 ] ) / 100 / 100; 379 if ( fabsf( vec2->data.F32[ 50 ] - val ) > FLT_EPSILON ) { 380 psError( __func__, "psVectorPowerSpectrum result is invalid (n=50, %.2f %.2f)", 381 vec2->data.F32[ 0 ], val ); 382 return 2; 383 }; 384 385 psFree( vec ); 386 psFree( vec2 ); 387 388 return 0; 389 }
Note:
See TracChangeset
for help on using the changeset viewer.
