int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, BLASLONG posX, BLASLONG posY, #ifdef USE_ALPHA FLOAT alpha_r, FLOAT alpha_i, #endif FLOAT *b){ BLASLONG i, js, offset; FLOAT data01; FLOAT *ao1; lda *= 2; js = n; while (js > 0){ offset = posX - posY; if (offset > 0) ao1 = a + posY * 2 + (posX + 0) * lda; else ao1 = a + (posX + 0) * 2 + posY * lda; i = m; while (i > 0) { if (offset > 0) { data01 = CMULT(*(ao1 + 0), -*(ao1 + 1)); } else if (offset < 0) { data01 = CMULT(*(ao1 + 0), *(ao1 + 1)); } else { data01 = CMULT(*(ao1 + 0), ZERO); } if (offset > 0) ao1 += 2; else ao1 += lda; b[ 0] = data01; b ++; offset --; i --; } posX ++; js --; } return 0; }
int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda, #ifdef USE_ALPHA FLOAT alpha_r, FLOAT alpha_i, #endif FLOAT *b){ BLASLONG i; FLOAT *a_offset, a1, a2; lda *= 2; while (n > 0) { a_offset = a; a += 2; for (i = 0; i < m; i ++) { a1 = *(a_offset + 0); a2 = *(a_offset + 1); *(b + 0) = CMULT(a1, a2); a_offset += lda; b ++; } n --; } return 0; }
void fft_shift2( int n, int nup, float af, float * f, float ag, float * g ) { static int nupold=0 , nuptop=0 ; static complex * row=NULL , * cf=NULL , * cg=NULL ; int ii , nby2=nup/2 , n21=nby2+1 ; complex fac , gac ; float sf , sg , dk ; #ifdef RECUR complex csf , csg ; #endif ENTRY("fft_shift2") ; /* 15 Mar 2001: shift too big ==> return all zeros */ if( (af < -n || af > n) && (ag < -n || ag > n) ){ for( ii=0 ; ii < n ; ii++ ) f[ii] = g[ii] = 0.0 ; EXRETURN ; } /* make new memory for row storage? */ if( nup > nuptop ){ if( row != NULL ){ free(row) ; free(cf) ; free(cg) ; } row = (complex *) malloc( sizeof(complex) * nup ) ; cf = (complex *) malloc( sizeof(complex) * n21 ) ; cg = (complex *) malloc( sizeof(complex) * n21 ) ; nuptop = nup ; } /* FFT the pair of rows */ if( g != NULL ) for( ii=0 ; ii < n ; ii++ ){ row[ii].r = f[ii] ; row[ii].i = g[ii] ; } else for( ii=0 ; ii < n ; ii++ ){ row[ii].r = f[ii] ; row[ii].i = 0 ; } #ifdef ZFILL for( ii=n ; ii < nup ; ii++ ){ row[ii].r = row[ii].i = 0.0 ; } #else if( nup > n ){ sf = 0.5 * (row[0].r + row[n-1].r) ; sg = 0.5 * (row[0].i + row[n-1].i) ; for( ii=n ; ii < nup ; ii++ ){ row[ii].r = sf ; row[ii].i = sg ; } } #endif csfft_cox( -1 , nup , row ) ; /* untangle FFT coefficients from row into cf,cg */ cf[0].r = 2.0 * row[0].r ; cf[0].i = 0.0 ; /* twice too big */ cg[0].r = 2.0 * row[0].i ; cg[0].i = 0.0 ; for( ii=1 ; ii < nby2 ; ii++ ){ cf[ii].r = row[ii].r + row[nup-ii].r ; cf[ii].i = row[ii].i - row[nup-ii].i ; cg[ii].r = row[ii].i + row[nup-ii].i ; cg[ii].i = -row[ii].r + row[nup-ii].r ; } cf[nby2].r = 2.0 * row[nby2].r ; cf[nby2].i = 0.0 ; cg[nby2].r = 2.0 * row[nby2].i ; cg[nby2].i = 0.0 ; /* phase shift both rows (cf,cg) */ dk = (2.0*PI) / nup ; sf = -af * dk ; sg = -ag * dk ; #ifdef RECUR csf = CEXPIT(sf) ; csg = CEXPIT(sg) ; fac.r = gac.r = 1.0 ; fac.i = gac.i = 0.0 ; #endif for( ii=1 ; ii <= nby2 ; ii++ ){ #ifdef RECUR fac = CMULT( csf , fac ) ; cf[ii] = CMULT( fac , cf[ii] ) ; gac = CMULT( csg , gac ) ; cg[ii] = CMULT( gac , cg[ii] ) ; #else fac = CEXPIT(ii*sf) ; cf[ii] = CMULT( fac , cf[ii] ) ; gac = CEXPIT(ii*sg) ; cg[ii] = CMULT( gac , cg[ii] ) ; #endif } cf[nby2].i = 0.0 ; cg[nby2].i = 0.0 ; /* retangle the coefficients from 2 rows */ row[0].r = cf[0].r ; row[0].i = cg[0].r ; for( ii=1 ; ii < nby2 ; ii++ ){ row[ii].r = cf[ii].r - cg[ii].i ; row[ii].i = cf[ii].i + cg[ii].r ; row[nup-ii].r = cf[ii].r + cg[ii].i ; row[nup-ii].i = -cf[ii].i + cg[ii].r ; } row[nby2].r = cf[nby2].r ; row[nby2].i = cg[nby2].r ; /* inverse FFT and store back in output arrays */ csfft_cox( 1 , nup , row ) ; sf = 0.5 / nup ; /* 0.5 to allow for twice too big above */ if( g != NULL ) for( ii=0; ii < n; ii++ ){ f[ii] = sf*row[ii].r; g[ii] = sf*row[ii].i; } else for( ii=0; ii < n; ii++ ){ f[ii] = sf*row[ii].r; } EXRETURN ; }
void ft_shift2( int n, int nup, float af, float * f, float ag, float * g ) { static int nupold=0 ; static complex * row=NULL , * cf=NULL , * cg=NULL ; int ii , nby2=nup/2 , n21=nby2+1 ; complex fac , gac ; float sf , sg , dk ; /* make new memory for row storage? */ if( nup > nupold ){ if( row != NULL ){ free(row) ; free(cf) ; free(cg) ; } row = (complex *) malloc( sizeof(complex) * nup ) ; cf = (complex *) malloc( sizeof(complex) * n21 ) ; cg = (complex *) malloc( sizeof(complex) * n21 ) ; nupold = nup ; } /* FFT the pair of rows */ for( ii=0 ; ii < n ; ii++ ){ row[ii].r = f[ii] ; row[ii].i = g[ii] ; } for( ; ii < nup ; ii++ ){ row[ii].r = row[ii].i = 0.0 ; } csfft_cox( -1 , nup , row ) ; /* untangle FFT coefficients from row into cf,cg */ cf[0].r = 2.0 * row[0].r ; cf[0].i = 0.0 ; /* twice too big */ cg[0].r = 2.0 * row[0].i ; cg[0].i = 0.0 ; for( ii=1 ; ii < nby2 ; ii++ ){ cf[ii].r = row[ii].r + row[nup-ii].r ; cf[ii].i = row[ii].i - row[nup-ii].i ; cg[ii].r = row[ii].i + row[nup-ii].i ; cg[ii].i = -row[ii].r + row[nup-ii].r ; } cf[nby2].r = 2.0 * row[nby2].r ; cf[nby2].i = 0.0 ; cg[nby2].r = 2.0 * row[nby2].i ; cg[nby2].i = 0.0 ; /* phase shift both rows (cf,cg) */ dk = (2.0*PI) / nup ; sf = -af * dk ; sg = -ag * dk ; for( ii=1 ; ii <= nby2 ; ii++ ){ fac = CEXPIT(ii*sf) ; cf[ii] = CMULT( fac , cf[ii] ) ; gac = CEXPIT(ii*sg) ; cg[ii] = CMULT( gac , cg[ii] ) ; } cf[nby2].i = 0.0 ; cg[nby2].i = 0.0 ; /* retangle the coefficients from 2 rows */ row[0].r = cf[0].r ; row[0].i = cg[0].r ; for( ii=1 ; ii < nby2 ; ii++ ){ row[ii].r = cf[ii].r - cg[ii].i ; row[ii].i = cf[ii].i + cg[ii].r ; row[nup-ii].r = cf[ii].r + cg[ii].i ; row[nup-ii].i = -cf[ii].i + cg[ii].r ; } row[nby2].r = cf[nby2].r ; row[nby2].i = cg[nby2].r ; /* inverse FFT and store back in output arrays */ csfft_cox( 1 , nup , row ) ; sf = 0.5 / nup ; /* 0.5 to allow for twice too big above */ for( ii=0 ; ii < n ; ii++ ){ f[ii] = sf * row[ii].r ; g[ii] = sf * row[ii].i ; } return ; }