diff options
author | torset | 2008-12-23 10:49:32 +0000 |
---|---|---|
committer | torset | 2008-12-23 10:49:32 +0000 |
commit | 94dc3f0bd7746fe9d1a4455cc49e0acdf1a2aa9f (patch) | |
tree | 41cc42a2c8b68c326d446acc0a04813e1bdd150f /src/signalProcessing/fft | |
parent | 01f7cdd8d395cab490f682f37ccdffa7b09e7972 (diff) | |
download | scilab2c-94dc3f0bd7746fe9d1a4455cc49e0acdf1a2aa9f.tar.gz scilab2c-94dc3f0bd7746fe9d1a4455cc49e0acdf1a2aa9f.tar.bz2 scilab2c-94dc3f0bd7746fe9d1a4455cc49e0acdf1a2aa9f.zip |
redebug fft
Diffstat (limited to 'src/signalProcessing/fft')
-rw-r--r-- | src/signalProcessing/fft/dfft2.c | 2 | ||||
-rw-r--r-- | src/signalProcessing/fft/dfftmx.c | 78 | ||||
-rw-r--r-- | src/signalProcessing/fft/fft_internal.h | 27 | ||||
-rw-r--r-- | src/signalProcessing/fft/testMatFft.c | 48 | ||||
-rw-r--r-- | src/signalProcessing/fft/zfftma.c | 42 |
5 files changed, 108 insertions, 89 deletions
diff --git a/src/signalProcessing/fft/dfft2.c b/src/signalProcessing/fft/dfft2.c index 23ab74e0..aff76b29 100644 --- a/src/signalProcessing/fft/dfft2.c +++ b/src/signalProcessing/fft/dfft2.c @@ -12,7 +12,7 @@ #include "fft_internal.h" #include <stdlib.h> - +#include <stdio.h> void dfft2 ( double* a , double* b , int nseg , int n , int nspn , int isn , int ierr ) { diff --git a/src/signalProcessing/fft/dfftmx.c b/src/signalProcessing/fft/dfftmx.c index bc8faa3c..3c104ec7 100644 --- a/src/signalProcessing/fft/dfftmx.c +++ b/src/signalProcessing/fft/dfftmx.c @@ -88,7 +88,32 @@ static int i ; static int j ; static int jj; - +/* Prototypes */ + +static void preliminaryWork (void); +static void permute_stage1 (void); +static void permute_stage2 (void); +static void f4t_150 (void); +static void factorOf3Transform (void) ; +static void factorOf5Transform (void) ; +static void preFOtherTransform (void); +static void factorOfOtherTransform (void); +static void pre_sqFactor2NormlOrder (void); +static void nonSqFactor2NormOrder (void) ; +static void detPermutCycles (void); +static void reorderMatrix (void ) ; + +static int f4t_170 (void); +static int factorTransform (void); +static int pre_fOf2Trans (void); +static int factorOf2Transform (void); +static int factorOf4Transform (void); +static int mulByRotationFactor (void ); +static int post_sqFactor2NormlOrder (void); +static void single_sqFactor2NormlOrder (void); +static int multi_sqFactor2NormlOrder (void); + +/* End Prototypes */ /*note on this code all numbers alone in comment is a reference to the corresponding goto in the original fotran code */ @@ -117,14 +142,14 @@ int dfftmx ( double* _pdblA , double* _pdblB , int _iNtot, int _iN, int _iNspan, inc = abs ( isn ) ; nt = inc*ntot ; ks = inc*nspan; - rad = atan ( 1 ); + rad = atan(1); c72 = cos (rad/0.6250); s72 = sin (rad/0.6250); s120= sqrt(0.750); - preliminaryWork () ; + preliminaryWork() ; while ( retVal == 0 ) retVal = factorTransform ( ) ; @@ -149,8 +174,8 @@ Sous-Fonctions /* this function only set the value of variable */ -void preliminaryWork (void) -{ +static void preliminaryWork (void) +{ s72 = -s72 ; s120= -s120; rad = -rad ; @@ -178,7 +203,7 @@ void preliminaryWork (void) factor are stored in nfac */ -int factorTransform (void) +static int factorTransform (void) { int retVal = 42; @@ -203,7 +228,7 @@ switch ( nfac[i-1] ) break ; case 4 : - /*transform for factor of 4 */ + kspnn = kspan ; kspan = kspan >> 2 ; /*kspan /= 4 */ @@ -254,7 +279,7 @@ switch ( nfac[i-1] ) } /* permutation for square factor of n */ -void permute_stage1 (void) +static void permute_stage1 (void) { int retVal = 1 ; @@ -274,7 +299,7 @@ void permute_stage1 (void) } -void permute_stage2 (void) +static void permute_stage2 (void) { kspnn = np[kt] ; @@ -305,7 +330,7 @@ Sous-Sous-Fonctions -int pre_fOf2Trans (void) +static int pre_fOf2Trans (void) { kspan /= 2; k1 = kspan + 2 ; @@ -337,7 +362,7 @@ int pre_fOf2Trans (void) -int factorOf2Transform (void) +static int factorOf2Transform (void) { do /*60*/ {/*while ( kk <= jc*2 )*/ c1 = 1 - cd ; @@ -404,7 +429,7 @@ int factorOf2Transform (void) /* this one is just an optimisation of the factor of 2 transform , we compute more things each turn */ -int factorOf4Transform (void) +static int factorOf4Transform (void) { int return_value = 0 ; @@ -438,7 +463,7 @@ int factorOf4Transform (void) /*this function and the following are just here for conveniance , they just do fourier transformation for factor of 4 but as the code was a bit long in factorof4transform , we've created two sub-functions */ -void f4t_150 (void) +static void f4t_150 (void) { do{ @@ -499,7 +524,7 @@ void f4t_150 (void) } -int f4t_170 (void) +static int f4t_170 (void) { kk += ( jc - nt ) ; @@ -555,7 +580,7 @@ int f4t_170 (void) -void factorOf3Transform (void) +static void factorOf3Transform (void) { do{ do{ @@ -590,7 +615,7 @@ void factorOf3Transform (void) } -void factorOf5Transform (void) +static void factorOf5Transform (void) { c2 = c72*c72 - s72 *s72 ; s2 = 2 * c72*s72; @@ -656,9 +681,8 @@ void factorOf5Transform (void) special case of this one */ -void preFOtherTransform (void) +static void preFOtherTransform (void) { -printf("0.k=%d \n",k); jf = k ; s1 = (rad*8)/k ; @@ -684,7 +708,7 @@ printf("0.k=%d \n",k); } -void factorOfOtherTransform (void) +static void factorOfOtherTransform (void) { int ktemp = 0 ; @@ -780,7 +804,7 @@ do -int mulByRotationFactor (void ) +static int mulByRotationFactor (void ) { int ktemp = 0 ; @@ -877,7 +901,7 @@ int mulByRotationFactor (void ) -void pre_sqFactor2NormlOrder (void) +static void pre_sqFactor2NormlOrder (void) { k = kt + kt + 1 ; @@ -906,7 +930,7 @@ void pre_sqFactor2NormlOrder (void) } -int post_sqFactor2NormlOrder (void) +static int post_sqFactor2NormlOrder (void) { do @@ -946,7 +970,7 @@ int post_sqFactor2NormlOrder (void) /* appeler cetter fonction dans un do while valeur_retour != 1)*/ -void single_sqFactor2NormlOrder (void) +static void single_sqFactor2NormlOrder (void) { @@ -969,7 +993,7 @@ void single_sqFactor2NormlOrder (void) } /*idem que single_ */ -int multi_sqFactor2NormlOrder (void) +static int multi_sqFactor2NormlOrder (void) { @@ -1015,7 +1039,7 @@ int multi_sqFactor2NormlOrder (void) -void nonSqFactor2NormOrder (void) +static void nonSqFactor2NormOrder (void) { j = m - kt ; @@ -1076,7 +1100,7 @@ void nonSqFactor2NormOrder (void) } /* here we determine how many permutation cycles we need to do */ -void detPermutCycles (void) +static void detPermutCycles (void) { do @@ -1109,7 +1133,7 @@ void detPermutCycles (void) return ; } -void reorderMatrix (void) +static void reorderMatrix (void) { do { diff --git a/src/signalProcessing/fft/fft_internal.h b/src/signalProcessing/fft/fft_internal.h index 2bd5a597..70377bf4 100644 --- a/src/signalProcessing/fft/fft_internal.h +++ b/src/signalProcessing/fft/fft_internal.h @@ -39,31 +39,4 @@ int dfftmx ( double* _pdblA , double* _pdblB , int _iNtot, int _iN, int _iNspan, int _iIsn, int _iM, int _iKt, double* _pdblWt, double* _pdblCk, double* _pdblBt, double* _pdblSk, int* _piNp, int* _piNfac); -/* under functions used by dfftmx */ - void preliminaryWork (void); - void preliminaryWork (void); - void permute_stage1 (void); - void permute_stage2 (void); - void f4t_150 (void); - void factorOf3Transform (void) ; - void factorOf5Transform (void) ; - void preFOtherTransform (void); - void factorOfOtherTransform (void); - void pre_sqFactor2NormlOrder (void); - void nonSqFactor2NormOrder (void) ; - void detPermutCycles (void); - void reorderMatrix (void ) ; - - int f4t_170 (void); - int factorTransform (void); - int pre_fOf2Trans (void); - int factorOf2Transform (void); - int factorOf4Transform (void); - int mulByRotationFactor (void ); - int post_sqFactor2NormlOrder (void); - void single_sqFactor2NormlOrder (void); - int preF2transform (void) ; - int multi_sqFactor2NormlOrder (void); -/* int end (void) ;*/ - #endif /* !__FFT_INTERNAL_H__ */ diff --git a/src/signalProcessing/fft/testMatFft.c b/src/signalProcessing/fft/testMatFft.c index 728074b5..d199c042 100644 --- a/src/signalProcessing/fft/testMatFft.c +++ b/src/signalProcessing/fft/testMatFft.c @@ -151,55 +151,60 @@ static int testFft(void){ in9[i]=DoubleComplex(inR9[i],0); } - - zfftma(in1, 1, 12, out1); - zfftma(in2, 2, 6, out2); - zfftma(in3, 3, 4, out3); - zfftma(in4, 4, 3, out4); - zfftma(in6, 6, 2, out6); - zfftma(in9, 3, 3, out9); - /* !!!!!!!!!!!!!!!!!!!!!!! for the imaginary part, the assert is out + res instead of out - res cause I export the transposate of the result matrix and the transposate change the sign of the imaginary part. And instead of change all the define, I only change the sign of the assert.*/ + printf(" >>> Matrice 1*12 <<< \n"); + zfftma(in1, 1, 12, out1); for (i=0;i<12;i++){ - if (zreals(out1[i])>1e-16) assert( (fabs(zreals(out1[i])-resR1[i]) / fabs(zreals(out1[i]))) < 1e-14 ); + if (zreals(out1[i])>1e-14) assert( (fabs(zreals(out1[i])-resR1[i]) / fabs(zreals(out1[i]))) < 1e-14 ); else assert(1); - if (zimags(out1[i])>1e-16) assert( (fabs(zimags(out1[i])+resI1[i]) / fabs(zimags(out1[i]))) < 1e-14 ); + if (zimags(out1[i])>1e-14) assert( (fabs(zimags(out1[i])+resI1[i]) / fabs(zimags(out1[i]))) < 1e-14 ); else assert(1); } - + + printf(" >>> Matrice 2*6 <<< \n"); + zfftma(in2, 2, 6, out2); for (i=0;i<12;i++){ - if (zreals(out2[i])>1e-16) assert( (fabs(zreals(out2[i])-resR2[i]) / fabs(zreals(out2[i]))) < 1e-14 ); + if (zreals(out2[i])>1e-14) assert( (fabs(zreals(out2[i])-resR2[i]) / fabs(zreals(out2[i]))) < 1e-14 ); else assert(1); - if (zimags(out2[i])>1e-16) assert( (fabs(zimags(out2[i])+resI2[i]) / fabs(zimags(out2[i]))) < 1e-14 ); + if (zimags(out2[i])>1e-14) assert( (fabs(zimags(out2[i])+resI2[i]) / fabs(zimags(out2[i]))) < 1e-13 ); else assert(1); } + + printf(" >>> Matrice 3*4 <<< \n"); + zfftma(in3, 3, 4, out3); for (i=0;i<12;i++){ - if (zreals(out3[i])>1e-16) assert( (fabs(zreals(out3[i])-resR3[i]) / fabs(zreals(out3[i]))) < 1e-14 ); + if (zreals(out3[i])>1e-14) assert( (fabs(zreals(out3[i])-resR3[i]) / fabs(zreals(out3[i]))) < 1e-14 ); else assert(1); - if (zimags(out3[i])>1e-16) assert( (fabs(zimags(out3[i])+resI3[i]) / fabs(zimags(out3[i]))) < 1e-14 ); + if (zimags(out3[i])>1e-14) assert( (fabs(zimags(out3[i])+resI3[i]) / fabs(zimags(out3[i]))) < 1e-14 ); else assert(1); } - + + printf(" >>> Matrice 4*3 <<< \n"); + zfftma(in4, 4, 3, out4); for (i=0;i<12;i++){ - if (zreals(out4[i])>1e-16) assert( (fabs(zreals(out4[i])-resR4[i]) / fabs(zreals(out4[i]))) < 1e-14 ); + if (zreals(out4[i])>1e-14) assert( (fabs(zreals(out4[i])-resR4[i]) / fabs(zreals(out4[i]))) < 1e-14 ); else assert(1); - if (zimags(out4[i])>1e-16) assert( (fabs(zimags(out4[i])+resI4[i]) / fabs(zimags(out4[i]))) < 1e-14 ); + if (zimags(out4[i])>1e-14) assert( (fabs(zimags(out4[i])+resI4[i]) / fabs(zimags(out4[i]))) < 1e-14 ); else assert(1); } - + + printf(" >>> Matrice 6*2 <<< \n"); + zfftma(in6, 6, 2, out6); for (i=0;i<12;i++){ if (zreals(out6[i])>1e-16) assert( (fabs(zreals(out6[i])-resR6[i]) / fabs(zreals(out6[i]))) < 1e-14 ); else assert(1); if (zimags(out6[i])>1e-16) assert( (fabs(zimags(out6[i])+resI6[i]) / fabs(zimags(out6[i]))) < 1e-14 ); else assert(1); } - + + printf(" >>> Matrice 3*3 <<< \n"); + zfftma(in9, 3, 3, out9); for (i=0;i<9;i++){ if (zreals(out9[i])>1e-16) assert( (fabs(zreals(out9[i])-resR9[i]) / fabs(zreals(out9[i]))) < 1e-16 ); else assert(1); @@ -207,12 +212,13 @@ static int testFft(void){ if (zimags(out9[i])>1e-15) assert( (fabs(zimags(out9[i])-resI9[i]) / fabs(zimags(out9[i]))) < 1e-15 ); else assert(1); } + return 0; } int main(void) { - printf(">>> Fft Matrices Double Tests <<<"); + printf(">>> Fft Matrices Double Tests <<<\n"); assert(testFft() == 0); return 0; } diff --git a/src/signalProcessing/fft/zfftma.c b/src/signalProcessing/fft/zfftma.c index 66573455..ee7f638f 100644 --- a/src/signalProcessing/fft/zfftma.c +++ b/src/signalProcessing/fft/zfftma.c @@ -1,7 +1,7 @@ /* * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab * Copyright (C) 2008 - INRIA - Allan SIMON - * + * * This file must be used under the terms of the CeCILL. * This source file is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -17,7 +17,7 @@ #include "fft.h" #include "lapack.h" #include "fft_internal.h" - +#include <stdio.h> void zfftma ( doubleComplex* in , int rows, int cols, doubleComplex* out) { @@ -32,16 +32,19 @@ void zfftma ( doubleComplex* in , int rows, int cols, doubleComplex* out) int ierr = 0 ; int isn = -1; int i = 0; + + int increment=1; double* realIn = (double*) malloc ( sizeof (double) * (unsigned int) size ); double* imagIn = (double*) malloc ( sizeof (double) * (unsigned int) size ); - + doubleComplex* inCopy = (doubleComplex*) malloc ( sizeof (doubleComplex) * (unsigned int) size); doubleComplex* inTemp = (doubleComplex*) malloc ( sizeof (doubleComplex) * (unsigned int) size ); zimaga ( in , size , imagIn) ; zreala ( in , size , realIn) ; + for(i=0;i<size;i++) inCopy[i]=in[i]; if ( rows == 1 || cols == 1 ) { @@ -50,7 +53,7 @@ void zfftma ( doubleComplex* in , int rows, int cols, doubleComplex* out) { if ( size <= pow ( 2 , 15 )) { - fft842 ( in , size , 0 ); + fft842 ( inCopy , size , 0 ); choosenAlgo = FFT842 ; } else @@ -65,26 +68,39 @@ void zfftma ( doubleComplex* in , int rows, int cols, doubleComplex* out) } else { - rowsTemp = (int) pow ( 2 ,(int ) log( rows + 0.5) /log ( 2 )) ; - colsTemp = (int) pow ( 2 ,(int ) log( cols + 0.5) /log ( 2 )) ; + rowsTemp = (int) pow ( 2 ,(int ) (log( rows + 0.5) /log ( 2 ))) ; + colsTemp = (int) pow ( 2 ,(int ) (log( cols + 0.5) /log ( 2 ))) ; + if ( rows == rowsTemp) { if ( rows <= pow ( 2 , 15 )) { for ( i = 0 ; i < cols ; i++ ) { - fft842 ( &in[ rows*i] , rows , 0); - choosenAlgo = FFT842 ; + fft842 ( &inCopy[ rows*i] , rows , 0); + /* stock new inCopy in realIn and imagIn + if the second call don't call fft842 + ex : matrix 2*3 */ + zimaga ( inCopy , size , imagIn) ; + zreala ( inCopy , size , realIn) ; } } else { dfft2 ( realIn, imagIn ,cols , rows , 1 , isn , ierr); - } + /* stock new realIn and imagIn in inCopy + if the second call call fft842 + ex : matrix 3*2 */ + inCopy=DoubleComplexMatrix(realIn,imagIn,size); + } } else { dfft2 ( realIn, imagIn ,cols , rows , 1 , isn , ierr); + /* stock new realIn and imagIn in inCopy + if the second call call fft842 + ex : matrix 3*2 */ + inCopy=DoubleComplexMatrix(realIn,imagIn,size); } /*second call*/ if ( colsTemp == cols ) @@ -94,11 +110,11 @@ void zfftma ( doubleComplex* in , int rows, int cols, doubleComplex* out) /*compute the fft on each line of the matrix */ for (i = 0 ; i < rows ; i++ ) { - C2F(zcopy) ( cols, in + i, rows, inTemp , 1 ); + C2F(zcopy) ( &cols, inCopy + i, &rows, inTemp , &increment ); fft842( inTemp , cols , 0); choosenAlgo = FFT842 ; - C2F(zcopy) ( cols, inTemp , 1, in + i, rows ); + C2F(zcopy) ( &cols, inTemp , &increment, inCopy + i, &rows ); } } @@ -106,7 +122,7 @@ void zfftma ( doubleComplex* in , int rows, int cols, doubleComplex* out) { dfft2 ( realIn, imagIn, 1, cols, rows, isn, ierr); } - } + } else { dfft2 ( realIn, imagIn, 1, cols, rows, isn, ierr); @@ -120,7 +136,7 @@ void zfftma ( doubleComplex* in , int rows, int cols, doubleComplex* out) { for ( i = 0 ; i < size ; i++) { - out[i] = DoubleComplex ( zreals(in[i]) , zimags(in[i]) ); + out[i] = DoubleComplex ( zreals(inCopy[i]) , zimags(inCopy[i]) ); } } else |