Changeset 1404 for trunk/psLib/test/dataManip/tst_psVectorFFT.c
- Timestamp:
- Aug 6, 2004, 11:50:14 AM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/test/dataManip/tst_psVectorFFT.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/test/dataManip/tst_psVectorFFT.c
r1365 r1404 6 6 * @author Robert DeSonia, MHPCC 7 7 * 8 * @version $Revision: 1. 4$ $Name: not supported by cvs2svn $9 * @date $Date: 2004-08-0 2 19:43:23 $8 * @version $Revision: 1.5 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2004-08-06 21:50:13 $ 10 10 * 11 11 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 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 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 29 static int testVectorFFT( void ); 30 30 static int testVectorRealImaginary( void ); … … 53 53 } 54 54 }; 55 55 56 56 int main( int argc, char* argv[] ) 57 57 { 58 58 psLogSetLevel( PS_LOG_INFO ); 59 59 60 60 return ( ! runTestSuite( stderr, "psFFT", tests, argc, argv ) ); 61 61 } … … 66 66 psVector* vec2 = NULL; 67 67 psVector* vec3 = NULL; 68 68 69 69 /* 70 70 1. assign a vector to a sinisoid … … 74 74 5. compare to original (should be equal to within a reasonable error) 75 75 */ 76 76 77 77 // 1. assign a vector to a sinisoid 78 78 vec = psVectorAlloc( 100, PS_TYPE_F32 ); 79 79 vec->n = vec->nalloc; 80 80 for ( unsigned int n = 0; n < 100; n++ ) { 81 vec->data.F32[ n ] = sinf( ( psF32 ) n / 50.0f * M_PI );82 }83 81 vec->data.F32[ n ] = sinf( ( psF32 ) n / 50.0f * M_PI ); 82 } 83 84 84 // 2. perform a forward transform 85 85 vec2 = psVectorFFT( NULL, vec, PS_FFT_FORWARD ); 86 86 if ( vec2->type.type != PS_TYPE_C32 ) { 87 psError( __func__, "FFT didn't produce complex values?" ); 88 return 1; 87 psError( __func__, "FFT didn't produce complex values?" ); 88 return 1; 89 } 90 91 92 // 3. verify that the only significant component cooresponds to the freqency of the input in step 1. 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 } 89 104 } 90 91 92 // 3. verify that the only significant component cooresponds to the freqency of the input in step 1. 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 105 } 106 107 107 // 4. perform a reverse transform 108 108 vec3 = psVectorFFT( NULL, vec2, PS_FFT_REVERSE ); 109 109 if ( vec3->type.type != PS_TYPE_C32 ) { 110 psError( __func__, "FFT didn't produce complex values?" ); 111 return 4; 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; 112 120 } 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 121 } 122 123 123 psFree( vec ); 124 124 psFree( vec2 ); 125 125 psFree( vec3 ); 126 126 127 127 return 0; 128 128 } … … 133 133 psVector* vec2 = NULL; 134 134 psVector* vec3 = NULL; 135 135 136 136 /* 137 137 1. create a C32 complex vector with distinctly different real and imaginary parts. … … 139 139 3. compare results to the real/imaginary components of input 140 140 */ 141 141 142 142 // 1. create a C32 complex vector with distinctly different real and imaginary parts. 143 143 vec = psVectorAlloc( 100, PS_TYPE_C32 ); 144 144 vec->n = vec->nalloc; 145 145 for ( unsigned int n = 0; n < 100; n++ ) { 146 vec->data.C32[ n ] = n + I * ( n * 2 );147 }148 146 vec->data.C32[ n ] = n + I * ( n * 2 ); 147 } 148 149 149 // 2. call psVectorReal and psVectorImaginary 150 150 vec2 = psVectorReal( vec2, vec ); 151 151 if ( vec2 == NULL ) { 152 psError( __func__, "psVectorReal returned a NULL?" );153 return 1;154 }152 psError( __func__, "psVectorReal returned a NULL?" ); 153 return 1; 154 } 155 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 156 psError( __func__, "psVectorReal returned a wrong type (%d)?", 157 vec2->type.type ); 158 return 2; 159 } 160 161 161 vec3 = psVectorImaginary( vec3, vec ); 162 162 if ( vec3 == NULL ) { 163 psError( __func__, "psVectorImaginary returned a NULL?" ); 164 return 3; 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 172 // 3. compare results to the real/imaginary components of input 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; 165 180 } 166 if ( vec3->type.type != PS_TYPE_F32) {167 psError( __func__, "psVectorImaginary returned a wrong type (%d)?",168 vec3->type.type);169 return 4;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; 170 185 } 171 172 // 3. compare results to the real/imaginary components of input 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 186 } 187 188 188 psFree( vec ); 189 189 psFree( vec2 ); 190 190 psFree( vec3 ); 191 191 192 192 return 0; 193 193 } … … 198 198 psVector* vec2 = NULL; 199 199 psVector* vec3 = NULL; 200 200 201 201 /* 202 202 1. create two unique psF32 vectors of the same size … … 205 205 4. call psVectorReal and psVectorImaginary on step 2 results 206 206 5. compare step 4 results to input. 207 207 208 208 6. create a psF32 and a psF64 vector of the same size 209 209 7. call psVectorComplex 210 210 8. verify that an appropriate error occurred. 211 211 212 212 9. create two psf32 vectors of different sizes 213 213 10. call psVectorComplex 214 214 11. verify thet an appropriate error occurred. 215 215 */ 216 216 217 217 // 1. create two unique psF32 vectors of the same size 218 218 vec = psVectorAlloc( 100, PS_TYPE_F32 ); … … 221 221 vec2->n = vec2->nalloc; 222 222 for ( unsigned int n = 0; n < 100; n++ ) { 223 vec->data.F32[ n ] = n;224 vec2->data.F32[ n ] = ( n * 2 );225 }226 223 vec->data.F32[ n ] = n; 224 vec2->data.F32[ n ] = ( n * 2 ); 225 } 226 227 227 // 2. call psVectorComplex 228 228 vec3 = psVectorComplex( vec3, vec, vec2 ); 229 229 230 230 // 3. verify that the result is a psC32 231 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 232 psError( __func__, "Vector Type from psVectorComplex is not complex? (%d)", 233 vec3->type.type ); 234 return 1; 235 } 236 237 237 // 4. call psVectorReal and psVectorImaginary on step 2 results (not needed, just use crealf/cimagf) 238 238 // 5. compare step 4 results to input. 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 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 249 249 // 6. create a psF32 and a psF64 vector of the same size 250 vec2 = psVectorRecycle( vec2, PS_TYPE_F64, 100);251 250 vec2 = psVectorRecycle( vec2, 100, PS_TYPE_F64 ); 251 252 252 // 7. call psVectorComplex 253 253 psLogMsg( __func__, PS_LOG_INFO, "Following should be an error (type mismatch)." ); … … 255 255 // 8. verify that an appropriate error occurred. (this partially has to be done via inspection) 256 256 if ( vec3 != NULL ) { 257 psError( __func__, "psVectorComplex returned a vector though input types mismatched." );258 return 3;259 }260 257 psError( __func__, "psVectorComplex returned a vector though input types mismatched." ); 258 return 3; 259 } 260 261 261 // 9. create two psf32 vectors of different sizes 262 vec2 = psVectorRecycle( vec2, PS_TYPE_F32, 200);263 262 vec2 = psVectorRecycle( vec2, 200, PS_TYPE_F32 ); 263 264 264 // 10. call psVectorComplex 265 265 vec3 = psVectorComplex( vec3, vec, vec2 ); 266 266 267 267 // 11. verify thet an appropriate error occurred. (actually, it isn't an error...) 268 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 269 psError( __func__, "psVectorComplex returned a larger vector than the input supported (%d).", vec3->n ); 270 return 4; 271 } 272 273 273 psFree( vec ); 274 274 psFree( vec2 ); 275 275 psFree( vec3 ); 276 276 277 277 return 0; 278 278 } … … 282 282 psVector * vec = NULL; 283 283 psVector* vec2 = NULL; 284 284 285 285 /* 286 286 1. create a psC32 with unique real and imaginary values. … … 289 289 4. verify each value is conjugate of input (a+bi -> a-bi) 290 290 */ 291 291 292 292 // 1. create a psC32 with unique real and imaginary values. 293 293 vec = psVectorAlloc( 100, PS_TYPE_C32 ); 294 294 vec->n = vec->nalloc; 295 295 for ( unsigned int n = 0; n < 100; n++ ) { 296 vec->data.C32[ n ] = n + I * ( n * 2 );297 }298 296 vec->data.C32[ n ] = n + I * ( n * 2 ); 297 } 298 299 299 // 2. call psVectorConjugate 300 300 vec2 = psVectorConjugate( vec2, vec ); 301 301 302 302 // 3. verify result is psC32 303 303 if ( vec2->type.type != PS_TYPE_C32 ) { 304 psError( __func__, "the psVectorConjugate didn't return a C32 vector" );305 return 1;306 }307 304 psError( __func__, "the psVectorConjugate didn't return a C32 vector" ); 305 return 1; 306 } 307 308 308 // 4. verify each value is conjugate of input (a+bi -> a-bi) 309 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 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 321 return 0; 322 322 } … … 327 327 psVector* vec2 = NULL; 328 328 psF32 val; 329 329 330 330 /* 331 331 1. create a psC32 vector with unique real and imaginary components … … 334 334 4. verify the values are the square of the absolute values of the original 335 335 */ 336 336 337 337 // 1. create a psC32 vector with unique real and imaginary components 338 338 vec = psVectorAlloc( 100, PS_TYPE_C32 ); 339 339 vec->n = vec->nalloc; 340 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 341 vec->data.C32[ n ] = n + I * sinf( ( ( psF32 ) n ) / 50.f * M_PI ); 342 } 343 344 344 // 2. call psVectorPowerSpectrum 345 345 vec2 = psVectorPowerSpectrum( vec2, vec ); 346 346 347 347 // 3. verify result is psF32 348 348 if ( vec2->type.type != PS_TYPE_F32 ) { 349 psError( __func__, "the type was not PS_TYPE_F32." );350 return 1;351 }352 349 psError( __func__, "the type was not PS_TYPE_F32." ); 350 return 1; 351 } 352 353 353 // 4. verify the values are the square of the absolute values of the original 354 354 // (ADD specifies something else) … … 357 357 // P_N/2 = |C_N/2|^2/N^2 358 358 // where j = 1,2,...,(N/2-1) 359 359 360 360 val = cabsf( vec->data.C32[ 0 ] ) * cabsf( vec->data.C32[ 0 ] ) / 100 / 100; 361 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 ); 362 psError( __func__, "psVectorPowerSpectrum result is invalid (n=0, %.2f %.2f)", 363 vec2->data.F32[ 0 ], val ); 364 return 2; 365 }; 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 ); 364 374 return 2; 365 375 }; 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 376 } 377 378 378 val = cabsf( vec->data.C32[ 50 ] ) * cabsf( vec->data.C32[ 50 ] ) / 100 / 100; 379 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 } 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.
