diff options
Diffstat (limited to 'src/signalProcessing/fft/r8tx.c')
-rw-r--r-- | src/signalProcessing/fft/r8tx.c | 438 |
1 files changed, 278 insertions, 160 deletions
diff --git a/src/signalProcessing/fft/r8tx.c b/src/signalProcessing/fft/r8tx.c index 1d109de3..dd693134 100644 --- a/src/signalProcessing/fft/r8tx.c +++ b/src/signalProcessing/fft/r8tx.c @@ -1,3 +1,6 @@ + + + /* * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab * Copyright (C) 2008 - INRIA - Allan SIMON @@ -12,169 +15,284 @@ #include "fft_internal.h" #include <math.h> +#include <stdio.h> + + +/* +** radix 8 iteration subroutine +*/ +void r8tx ( int nxtlt,int nthpo,int lengt, + doubleComplex* cc0,doubleComplex* cc1,doubleComplex* cc2,doubleComplex* cc3, + doubleComplex* cc4,doubleComplex* cc5,doubleComplex* cc6,doubleComplex* cc7) -void r8tx ( int _iTempDimen , int _iDimen , int _iLengt , double* _pdblReal, double* _pdblImag ) { - int j = 0 ; - int i = 0 ; - int k = 0 ; - - - double* pdblReal0 = _pdblReal + ( 0*_iTempDimen ); - double* pdblReal1 = _pdblReal + ( 1*_iTempDimen ); - double* pdblReal2 = _pdblReal + ( 2*_iTempDimen ); - double* pdblReal3 = _pdblReal + ( 3*_iTempDimen ); - double* pdblReal4 = _pdblReal + ( 4*_iTempDimen ); - double* pdblReal5 = _pdblReal + ( 5*_iTempDimen ); - double* pdblReal6 = _pdblReal + ( 6*_iTempDimen ); - double* pdblReal7 = _pdblReal + ( 7*_iTempDimen ); - - double* pdblImag0 = _pdblImag + ( 0*_iTempDimen ); - double* pdblImag1 = _pdblImag + ( 1*_iTempDimen ); - double* pdblImag2 = _pdblImag + ( 2*_iTempDimen ); - double* pdblImag3 = _pdblImag + ( 3*_iTempDimen ); - double* pdblImag4 = _pdblImag + ( 4*_iTempDimen ); - double* pdblImag5 = _pdblImag + ( 5*_iTempDimen ); - double* pdblImag6 = _pdblImag + ( 6*_iTempDimen ); - double* pdblImag7 = _pdblImag + ( 7*_iTempDimen ); - - double arg,c1,s1,c2,s2,c3,s3,c4,s4,c5,s5,c6,s6,c7,s7 ; - double dblAReal0, dblAReal1, dblAReal2, dblAReal3, dblAReal4, dblAReal5, dblAReal6, dblAReal7; - double dblAImag0, dblAImag1, dblAImag2, dblAImag3, dblAImag4, dblAImag5, dblAImag6, dblAImag7 ; - - double dblBReal0, dblBReal1, dblBReal2, dblBReal3, dblBReal4, dblBReal5, dblBReal6, dblBReal7; - double dblBImag0, dblBImag1, dblBImag2, dblBImag3, dblBImag4, dblBImag5, dblBImag6, dblBImag7 ; - - double dblTReal , dblTImag ; - - double dblPi2 = 8 * atan (1); - double dblP7 = 1 / sqrt (2) ; - double scale = dblPi2 /_iLengt ; - - - - for ( j = 0 ; j < _iTempDimen ; i++) - { - arg=j*scale; - - c1= cos(arg); - s1= sin(arg); - - c2= c1*c1 - s1*s1 ; - s2= c1*s1 + c1*s1; - - c3= c1*c2 - s1*s2; - s3= c2*s1 + s2*c1; - - c4= c2*c2 - s2*s2 ; - s4= c2*s2 + c2*s2; - - c5= c2*c3 - s2*s3; - s5= c3*s2 + s3*c2; - - c6= c3*c3 - s3*s3 ; - s6= c3*s3 + c3*s3; - - c7= c3*c4 - s3*s4; - s7= c4*s3 + s4*c3; - - for ( k = j ; k < _iDimen ; k += _iLengt ) - { - dblAReal0 = pdblReal0[k] + pdblReal4[k]; - dblAReal1 = pdblReal1[k] + pdblReal5[k]; - dblAReal2 = pdblReal2[k] + pdblReal6[k]; - dblAReal3 = pdblReal3[k] + pdblReal7[k]; - dblAReal4 = pdblReal0[k] - pdblReal4[k]; - dblAReal5 = pdblReal1[k] - pdblReal5[k]; - dblAReal6 = pdblReal2[k] - pdblReal6[k]; - dblAReal7 = pdblReal3[k] - pdblReal7[k]; - - dblAImag0 = pdblImag0[k] + pdblImag4[k]; - dblAImag1 = pdblImag1[k] + pdblImag5[k]; - dblAImag2 = pdblImag2[k] + pdblImag6[k]; - dblAImag3 = pdblImag3[k] + pdblImag7[k]; - dblAImag4 = pdblImag0[k] - pdblImag4[k]; - dblAImag5 = pdblImag1[k] - pdblImag5[k]; - dblAImag6 = pdblImag2[k] - pdblImag6[k]; - dblAImag7 = pdblImag3[k] - pdblImag7[k]; - - dblBReal0 = dblAReal0 + dblAReal2; - dblBReal1 = dblAReal1 + dblAReal3; - dblBReal2 = dblAReal0 - dblAReal2; - dblBReal3 = dblAReal1 - dblAReal3; - dblBReal4 = dblAReal4 - dblAImag6; - dblBReal5 = dblAReal5 - dblAImag7; - dblBReal6 = dblAReal4 + dblAImag6; - dblBReal7 = dblAReal5 + dblAImag7; - - dblBImag0 = dblAImag0 + dblAImag2; - dblBImag1 = dblAImag1 + dblAImag3; - dblBImag2 = dblAImag0 - dblAImag2; - dblBImag3 = dblAImag1 - dblAImag3; - dblBImag4 = dblAImag4 + dblAReal6; - dblBImag5 = dblAImag5 + dblAReal7; - dblBImag6 = dblAImag4 - dblAReal6; - dblBImag7 = dblAImag5 - dblAReal7; - - pdblReal0[k] = dblBReal0 + dblBReal1; - pdblImag0[k] = dblBImag0 + dblBImag1; - - if ( j > 1 ) - { - pdblReal1[k] = c4*( dblBReal0 - dblBReal1 ) - s4*( dblBImag0 - dblBImag1 ); - pdblImag1[k] = c4*( dblBImag0 - dblBImag1 ) + s4*( dblBReal0 - dblBReal1 ); - pdblReal2[k] = c2*( dblBReal2 - dblBImag3 ) - s2*( dblBImag2 + dblBReal3 ); - pdblImag2[k] = c2*( dblBImag2 + dblBReal3 ) + s2*( dblBReal2 - dblBImag3 ); - pdblReal3[k] = c6*( dblBReal2 + dblBImag3 ) - s6*( dblBImag2 - dblBReal3 ); - pdblImag3[k] = c6*( dblBImag2 - dblBReal3 ) + s6*( dblBReal2 + dblBImag3 ); - - dblTReal = dblP7*( dblBReal5 - dblBImag5 ); - dblTImag = dblP7*( dblBReal5 + dblBImag5 ); - - pdblReal4[k] = c1*( dblBReal4 + dblTReal ) - s1*( dblBImag4 + dblTImag ); - pdblImag4[k] = c1*( dblBImag4 + dblTImag ) + s1*( dblBReal4 + dblTReal ); - pdblReal5[k] = c5*( dblBReal4 - dblTReal ) - s5*( dblBImag4 - dblTImag ); - pdblImag5[k] = c5*( dblBImag4 - dblTImag ) + s5*( dblBReal4 - dblTReal ); - - dblTReal = - dblP7* ( dblBReal7 + dblBImag7); - dblTImag = dblP7* ( dblBReal7 - dblBImag7); - - pdblReal6[k] = c3*( dblBReal6 + dblTReal ) - s3*( dblBImag6 + dblTImag ); - pdblImag6[k] = c3*( dblBImag6 + dblTImag ) + s3*( dblBReal6 + dblTReal ); - pdblReal7[k] = c7*( dblBReal6 - dblTReal ) - s7*( dblBImag6 - dblTImag ); - pdblImag7[k] = c7*( dblBImag6 - dblTImag ) + s7*( dblBReal6 - dblTReal ); - } - else - { - pdblReal1[k] = dblBReal0 - dblBReal1; - pdblImag1[k] = dblBImag0 - dblBImag1; - pdblReal2[k] = dblBReal2 - dblBImag3; - pdblImag2[k] = dblBImag2 + dblBReal3; - pdblReal3[k] = dblBReal2 + dblBImag3; - pdblImag3[k] = dblBImag2 - dblBReal3; - - dblTReal = dblP7 * ( dblBReal5 - dblBImag5 ); - dblTImag = dblP7 * ( dblBReal5 + dblBImag5 ); - - pdblReal4[k] = dblBReal4 + dblTReal; - pdblImag4[k] = dblBImag4 + dblTImag; - pdblReal5[k] = dblBReal4 - dblTReal; - pdblImag5[k] = dblBImag4 - dblTImag; - - dblTReal = -dblP7 * ( dblBReal7 + dblBImag7 ); - dblTImag = dblP7 * ( dblBReal7 - dblBImag7 ); - - pdblReal6[k] = dblBReal6 + dblTReal; - pdblImag6[k] = dblBImag6 + dblTImag; - pdblReal7[k] = dblBReal6 - dblTReal; - pdblImag7[k] = dblBImag6 - dblTImag; - - } - - } - - } + int j,k,kk; + double dblP7 = 1 / sqrt (2) ; + double dblPi2 = 8 * atan (1); + + double scale, arg; + double c1,c2,c3,c4,c5,c6,c7; + double s1,s2,s3,s4,s5,s6,s7; + + doubleComplex Atemp0,Atemp1,Atemp2,Atemp3,Atemp4,Atemp5,Atemp6,Atemp7; + doubleComplex Btemp0,Btemp1,Btemp2,Btemp3,Btemp4,Btemp5,Btemp6,Btemp7; + + doubleComplex temp ; + +/* + double *cr0,*cr1,*cr2,*cr3,*cr4,*cr5,*cr6,*cr7; + double *ci0,*ci1,*ci2,*ci3,*ci4,*ci5,*ci6,*ci7; + + cr0 = &(cc0[0].re); + cr1 = &(cc1[0].re); + cr2 = &(cc2[0].re); + cr3 = &(cc3[0].re); + cr4 = &(cc4[0].re); + cr5 = &(cc5[0].re); + cr6 = &(cc6[0].re); + cr7 = &(cc7[0].re); + + ci0 = &(cc0[0].im); + ci1 = &(cc1[0].im); + ci2 = &(cc2[0].im); + ci3 = &(cc3[0].im); + ci4 = &(cc4[0].im); + ci5 = &(cc5[0].im); + ci6 = &(cc6[0].im); + ci7 = &(cc7[0].im); +*/ + + scale = dblPi2/lengt; + + for(j=1;j<=nxtlt;j++) + { + arg = (j-1)*scale; + c1 = cos(arg); + s1 = sin(arg); + c2 = c1*c1 - s1*s1; + s2 = c1*s1 + c1*s1; + c3 = c1*c2 - s1*s2; + s3 = c2*s1 + s2*c1; + c4 = c2*c2 - s2*s2; + s4 = c2*s2 + c2*s2; + c5 = c2*c3 - s2*s3; + s5 = c3*s2 + s3*c2; + c6 = c3*c3 - s3*s3; + s6 = c3*s3 + c3*s3; + c7 = c3*c4 - s3*s4; + s7 = c4*s3 + s4*c3; + + for(k=j;k<=nthpo;k+=lengt) + { + kk = (k-1)*2; /* index by twos; re & im alternate */ + + Atemp0 = zadds ( cc0[kk] , cc4[kk] ) ; + Atemp1 = zadds ( cc1[kk] , cc5[kk] ) ; + Atemp2 = zadds ( cc2[kk] , cc6[kk] ) ; + Atemp3 = zadds ( cc3[kk] , cc7[kk] ) ; + +/* + ar0 = cr0[kk] + cr4[kk]; + ar1 = cr1[kk] + cr5[kk]; + ar2 = cr2[kk] + cr6[kk]; + ar3 = cr3[kk] + cr7[kk]; + + + ai0 = ci0[kk] + ci4[kk]; + ai1 = ci1[kk] + ci5[kk]; + ai2 = ci2[kk] + ci6[kk]; + ai3 = ci3[kk] + ci7[kk]; +*/ + + Atemp4 = zdiffs ( cc0[kk] , cc4[kk] ) ; + Atemp5 = zdiffs ( cc1[kk] , cc5[kk] ) ; + Atemp6 = zdiffs ( cc2[kk] , cc6[kk] ) ; + Atemp7 = zdiffs ( cc3[kk] , cc7[kk] ) ; +/* + ar4 = cr0[kk] - cr4[kk]; + ar5 = cr1[kk] - cr5[kk]; + ar6 = cr2[kk] - cr6[kk]; + ar7 = cr3[kk] - cr7[kk]; + + ai4 = ci0[kk] - ci4[kk]; + ai5 = ci1[kk] - ci5[kk]; + ai6 = ci2[kk] - ci6[kk]; + ai7 = ci3[kk] - ci7[kk]; +*/ + + + + Btemp0 = zadds ( Atemp0 , Atemp2 ) ; + Btemp1 = zadds ( Atemp1 , Atemp3 ) ; + Btemp2 = zdiffs ( Atemp0 , Atemp2 ) ; + Btemp3 = zdiffs ( Atemp1 , Atemp3 ) ; + +/* + br0 = ar0 + ar2; + br1 = ar1 + ar3; + br2 = ar0 - ar2; + br3 = ar1 - ar3; + + bi0 = ai0 + ai2; + bi1 = ai1 + ai3; + bi2 = ai0 - ai2; + bi3 = ai1 - ai3; +*/ + + Btemp4 = DoubleComplex ( zreals ( Atemp4 ) - zimags( Atemp6 ) , zimags ( Atemp4 ) + zreals( Atemp6 ) ); + Btemp5 = DoubleComplex ( zreals ( Atemp5 ) - zimags( Atemp7 ) , zimags ( Atemp5 ) + zreals( Atemp7 ) ); + Btemp6 = DoubleComplex ( zreals ( Atemp4 ) + zimags( Atemp6 ) , zimags ( Atemp4 ) - zreals( Atemp6 ) ); + Btemp7 = DoubleComplex ( zreals ( Atemp5 ) + zimags( Atemp7 ) , zimags ( Atemp5 ) - zreals( Atemp7 ) ); +/* + br4 = ar4 - ai6; + br5 = ar5 - ai7; + br6 = ar4 + ai6; + br7 = ar5 + ai7; + + bi4 = ai4 + ar6; + bi5 = ai5 + ar7; + bi6 = ai4 - ar6; + bi7 = ai5 - ar7; +*/ + cc0[kk] = zadds ( Btemp0 , Btemp1 ); +/* + cr0[kk] = br0 + br1; + ci0[kk] = bi0 + bi1; +*/ + + + + + if(j>1) + { + printf ( "on sup j>1\n"); + cc1[kk] = DoubleComplex ( c4 * (zreals(Btemp0) - zreals(Btemp1)) - s4 * (zimags(Btemp0) - zimags(Btemp1)), + c4 * (zimags(Btemp0) - zimags(Btemp1)) + s4 * (zreals(Btemp0) - zreals(Btemp1))); + + cc2[kk] = DoubleComplex ( c2 * (zreals(Btemp2) - zimags(Btemp3)) - s2 * (zimags(Btemp2) + zreals(Btemp3)) , + c2 * (zimags(Btemp2) + zreals(Btemp3)) + s2 * (zreals(Btemp2) - zimags(Btemp3))); + + cc3[kk] = DoubleComplex ( c6 * (zreals(Btemp2) + zimags(Btemp3)) - s6 * (zimags(Btemp2) - zreals(Btemp3)) , + c6 * (zimags(Btemp2) - zreals(Btemp3)) + s6 * (zreals(Btemp2) + zimags(Btemp3))); + +/* + cr1[kk] = c4*(br0-br1) - s4*(bi0-bi1); + ci1[kk] = c4*(bi0-bi1) + s4*(br0-br1); + + cr2[kk] = c2*(br2-bi3) - s2*(bi2+br3); + ci2[kk] = c2*(bi2+br3) + s2*(br2-bi3); + + cr3[kk] = c6*(br2+bi3) - s6*(bi2-br3); + ci3[kk] = c6*(bi2-br3) + s6*(br2+bi3); +*/ + + temp = DoubleComplex ( dblP7*(zreals ( Btemp5 ) - zimags( Btemp5 )) , + dblP7*(zreals ( Btemp5 ) + zimags( Btemp5 )) ); +/* + tr = dblP7*(br5-bi5); + ti = dblP7*(br5+bi5); +*/ + + cc4[kk] = DoubleComplex ( c1 * (zreals (Btemp4) + zreals(temp)) - s1 * (zimags (Btemp4) + zimags(temp)) , + c1 * (zimags (Btemp4) + zimags(temp)) + s1 * (zreals (Btemp4) + zreals(temp))); + cc5[kk] = DoubleComplex ( c5 * (zreals (Btemp4) - zreals(temp)) - s5 * (zimags (Btemp4) - zimags(temp)) , + c5 * (zimags (Btemp4) - zimags(temp)) + s5 * (zreals (Btemp4) - zreals(temp))); + +/* + cr4[kk] = c1*(br4+tr) - s1*(bi4+ti); + ci4[kk] = c1*(bi4+ti) + s1*(br4+tr); + cr5[kk] = c5*(br4-tr) - s5*(bi4-ti); + ci5[kk] = c5*(bi4-ti) + s5*(br4-tr); +*/ + temp = DoubleComplex ( - dblP7*(zreals ( Btemp7 ) + zimags( Btemp7 )) , + dblP7*(zreals ( Btemp7 ) - zimags( Btemp7 )) ); +/* + tr = -dblP7*(br7+bi7); + ti = dblP7*(br7-bi7); +*/ + cc6[kk] = DoubleComplex ( c3 * (zreals (Btemp6) + zreals(temp)) - s3 * (zimags (Btemp6) + zimags(temp)) , + c3 * (zimags (Btemp6) + zimags(temp)) + s3 * (zreals (Btemp6) + zreals(temp))); + cc7[kk] = DoubleComplex ( c7 * (zreals (Btemp6) - zreals(temp)) - s7 * (zimags (Btemp6) - zimags(temp)) , + c7 * (zimags (Btemp6) - zimags(temp)) + s7 * (zreals (Btemp6) - zreals(temp))); +/* + cr6[kk] = c3*(br6+tr) - s3*(bi6+ti); + ci6[kk] = c3*(bi6+ti) + s3*(br6+tr); + cr7[kk] = c7*(br6-tr) - s7*(bi6-ti); + ci7[kk] = c7*(bi6-ti) + s7*(br6-tr); +*/ + } + else + { + printf ( "on oupa sup j>1\n"); + cc1[kk] = zdiffs ( Btemp0 , Btemp1 ); + /* + cr1[kk] = br0 - br1; + ci1[kk] = bi0 - bi1; + */ + + cc2[kk] = DoubleComplex ( zreals ( Btemp2 ) - zimags( Btemp3 ) , + zimags ( Btemp2 ) + zreals( Btemp3 ) ); + + + cc3[kk] = DoubleComplex ( zreals ( Btemp2 ) + zimags( Btemp3 ) , + zimags ( Btemp2 ) - zreals( Btemp3 ) ); + + /* + cr2[kk] = br2 - bi3; + cr3[kk] = br2 + bi3; + + ci2[kk] = bi2 + br3; + ci3[kk] = bi2 - br3; + */ + + temp = DoubleComplex ( dblP7*(zreals ( Btemp5 ) - zimags( Btemp5 )) , + dblP7*(zreals ( Btemp5 ) + zimags( Btemp5 )) ); + /* + tr = dblP7*(br5-bi5); + ti = dblP7*(br5+bi5); + */ + cc4[kk] = zadds ( Btemp4 , temp ); + cc5[kk] = zdiffs ( Btemp4 , temp ); + /* + cr4[kk] = br4 + tr; + ci4[kk] = bi4 + ti; + cr5[kk] = br4 - tr; + ci5[kk] = bi4 - ti; + */ + temp = DoubleComplex ( - dblP7*(zreals ( Btemp7 ) + zimags( Btemp7 )) , + dblP7*(zreals ( Btemp7 ) - zimags( Btemp7 )) ); + /* + tr = -dblP7*(br7+bi7); + ti = dblP7*(br7-bi7); + */ + cc6[kk] = zadds ( Btemp6 , temp ); + cc7[kk] = zdiffs ( Btemp6 , temp ); + /* + cr6[kk] = br6 + tr; + ci6[kk] = bi6 + ti; + cr7[kk] = br6 - tr; + ci7[kk] = bi6 - ti; + */ + + + + + + + } + + } + } + + printf ( "plop %d \t%e \t%e\n" , 0 , zreals(cc0[kk]) , zimags(cc0[kk])); + printf ( "plop %d \t%e \t%e\n" , 1 , zreals(cc1[kk]) , zimags(cc1[kk])); + printf ( "plop %d \t%e \t%e\n" , 2 , zreals(cc2[kk]) , zimags(cc2[kk])); + printf ( "plop %d \t%e \t%e\n" , 3 , zreals(cc3[kk]) , zimags(cc3[kk])); + printf ( "plop %d \t%e \t%e\n" , 4 , zreals(cc4[kk]) , zimags(cc4[kk])); + printf ( "plop %d \t%e \t%e\n" , 5 , zreals(cc5[kk]) , zimags(cc5[kk])); + printf ( "plop %d \t%e \t%e\n" , 6 , zreals(cc6[kk]) , zimags(cc6[kk])); + printf ( "plop %d \t%e \t%e\n" , 7 , zreals(cc7[kk]) , zimags(cc7[kk])); } |