void so3CombineCoef_fftw( int bwIn, int bwOut, int degLim, REAL *sigCoefR, REAL *sigCoefI, REAL *patCoefR, REAL *patCoefI, fftw_complex *so3Coef ) { int l, m1, m2 ; int fudge, dummy ; REAL tmpSigCoefR, tmpSigCoefI ; REAL tmpPatCoefR, tmpPatCoefI ; /* for sanity, set all so3coefs to 0 */ memset( so3Coef, 0, sizeof(fftw_complex) * totalCoeffs_so3( bwOut ) ); for( l = 0 ; l <= degLim ; l ++ ) { for( m1 = -l ; m1 <= l ; m1 ++ ) { /* grab signal coefficient, at this degree and order */ dummy = seanindex(-m1, l, bwIn) ; tmpSigCoefR = sigCoefR[ dummy ]; tmpSigCoefI = sigCoefI[ dummy ]; /* need to reset the -1 fudge factor */ if ( (m1 + l) % 2 ) fudge = -1 ; else fudge = 1 ; for( m2 = -l ; m2 <= l ; m2 ++ ) { dummy = seanindex( -m2, l, bwIn ); /* first take the CONJUGATE of the pattern coef and multiply it by the fudge factor */ tmpPatCoefR = fudge * patCoefR[ dummy ]; tmpPatCoefI = fudge * (-patCoefI[ dummy ]); /* now multiply the signal coef by the pattern coef, and save it in the so3 coefficient array */ dummy = so3CoefLoc( m1, m2, l, bwOut ) ; so3Coef[ dummy ][0] = tmpSigCoefR*tmpPatCoefR - tmpSigCoefI*tmpPatCoefI ; so3Coef[ dummy ][1] = tmpSigCoefR*tmpPatCoefI + tmpSigCoefI*tmpPatCoefR ; /* multiply fudge factor by -1 */ fudge *= -1 ; } } } }
void so3CombineCoef( int bwIn, int bwOut, int degLim, double *sigCoefR, double *sigCoefI, double *patCoefR, double *patCoefI, double *so3CoefR, double *so3CoefI ) { int l, m1, m2 ; int fudge, dummy ; double tmpSigCoefR, tmpSigCoefI ; double tmpPatCoefR, tmpPatCoefI ; double wigNorm ; /* for sanity, set all so3coefs to 0 */ memset( so3CoefR, 0, sizeof(double) * totalCoeffs_so3( bwOut ) ); memset( so3CoefI, 0, sizeof(double) * totalCoeffs_so3( bwOut ) ); for( l = 0 ; l <= degLim ; l ++ ) { wigNorm = 2.*M_PI*sqrt(2./(2.*l+1)) ; for( m1 = -l ; m1 <= l ; m1 ++ ) { /* grab signal coefficient, at this degree and order */ dummy = seanindex(-m1, l, bwIn) ; tmpSigCoefR = sigCoefR[ dummy ]; tmpSigCoefI = sigCoefI[ dummy ]; /* need to reset the -1 fudge factor */ if ( (m1 + l) % 2 ) fudge = -1 ; else fudge = 1 ; for( m2 = -l ; m2 <= l ; m2 ++ ) { dummy = seanindex( -m2, l, bwIn ); /* first take the CONJUGATE of the pattern coef and multiply it by the fudge factor */ tmpPatCoefR = fudge * patCoefR[ dummy ]; tmpPatCoefI = fudge * (-patCoefI[ dummy ]); /* now multiply the signal coef by the pattern coef, and save it in the so3 coefficient array */ dummy = so3CoefLoc( m1, m2, l, bwOut ) ; so3CoefR[ dummy ] = wigNorm * ( tmpSigCoefR*tmpPatCoefR - tmpSigCoefI*tmpPatCoefI ) ; so3CoefI[ dummy ] = wigNorm * ( tmpSigCoefR*tmpPatCoefI + tmpSigCoefI*tmpPatCoefR ) ; /* multiply fudge factor by -1 */ fudge *= -1 ; } } } }
int main( int argc, char **argv ) { int i, bw, n, n3 ; int l, m1, m2, dummy, format ; double *rsignal, *isignal ; double *rcoeffs, *icoeffs ; double *workspace1, *workspace2 ; double tstart, tstop, runtime ; FILE *fp ; if (argc != 5) { fprintf(stdout,"Usage: test_soft_for bw sampleFile "); fprintf(stdout,"coefFile order_flag\n"); exit(0); } bw = atoi( argv[1] ); n = 2 * bw ; n3 = n * n * n ; format = atoi( argv[4] ); /* real and imaginary parts of signal each need n^3 space */ rsignal = ( double * ) malloc( sizeof( double ) * n3 ) ; isignal = ( double * ) malloc( sizeof( double ) * n3 ) ; /* real and imaginary parts of coeffs each need totalCoeffs_so3( bw) amount of space */ rcoeffs = ( double * ) malloc(sizeof( double ) * totalCoeffs_so3( bw ) ) ; icoeffs = ( double * ) malloc(sizeof( double ) * totalCoeffs_so3( bw ) ) ; /* now for LOTS OF workspace */ workspace1 = ( double * ) malloc(sizeof( double ) * 4 * n3 ) ; workspace2 = ( double * ) malloc(sizeof( double ) * ( 26 * bw + 2 * bw * bw) ); if ( ( rsignal == NULL ) || ( isignal == NULL ) || ( rcoeffs == NULL ) || ( icoeffs == NULL ) || ( workspace1 == NULL ) || ( workspace2 == NULL ) ) { perror("Error in allocating memory"); exit( 1 ) ; } /* read in samples */ fp = fopen( argv[2], "r" ); for ( i = 0 ; i < n3 ; i ++ ) { /* first the real part */ fscanf(fp, "%lf", rsignal+i) ; /* now the imaginary part */ fscanf(fp, "%lf", isignal+i) ; } fclose ( fp ) ; /* turn on stopwatch */ tstart = csecond( ) ; /* now do the forward transform */ Forward_SO3_Naive( bw, rsignal, isignal, rcoeffs, icoeffs, workspace1, workspace2 ) ; /* turn off stopwatch */ tstop = csecond( ) ; runtime = tstop - tstart ; fprintf(stdout,"runtime: %.5f seconds\n", runtime); /* write out coefficients to disk */ /* ordered as the inverse transform expects the coefficients */ if ( format == 0 ) { fp = fopen( argv[ 3 ], "w" ); for ( i = 0 ; i < totalCoeffs_so3( bw ) ; i ++ ) fprintf(fp, "%.16f\n%.16f\n", rcoeffs[ i ], icoeffs[ i ] ) ; fclose( fp ) ; } else /* ordered in a more human friendly way */ { fp = fopen( argv[ 3 ], "w" ); for ( l = 0 ; l < bw ; l ++ ) for ( m1 = -l ; m1 < l + 1 ; m1 ++ ) for ( m2 = -l ; m2 < l + 1 ; m2 ++ ) { dummy = so3CoefLoc( m1, m2, l, bw ) ; fprintf(fp, "l = %d m1 = %d m2 = %d\t%.15f\t%.15f\n", l, m1, m2, rcoeffs[ dummy ], icoeffs[ dummy ] ) ; } fclose( fp ) ; } /* free up memory (and there's lots of it) */ free( workspace2 ); free( workspace1 ); free( icoeffs ); free( rcoeffs ); free( isignal ); free( rsignal ); return 0 ; }