summaryrefslogtreecommitdiff
path: root/src/signalProcessing/fft
diff options
context:
space:
mode:
authortorset2008-12-23 10:49:32 +0000
committertorset2008-12-23 10:49:32 +0000
commit94dc3f0bd7746fe9d1a4455cc49e0acdf1a2aa9f (patch)
tree41cc42a2c8b68c326d446acc0a04813e1bdd150f /src/signalProcessing/fft
parent01f7cdd8d395cab490f682f37ccdffa7b09e7972 (diff)
downloadscilab2c-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.c2
-rw-r--r--src/signalProcessing/fft/dfftmx.c78
-rw-r--r--src/signalProcessing/fft/fft_internal.h27
-rw-r--r--src/signalProcessing/fft/testMatFft.c48
-rw-r--r--src/signalProcessing/fft/zfftma.c42
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