📄 fft.c
字号:
{#line 603 pthread_barrier_wait(&(Global->start));#line 603}; if ((MyNum == 0) || (dostats)) { {#line 606 struct timeval FullTime;#line 606#line 606 gettimeofday(&FullTime, NULL);#line 606 (clocktime1) = (unsigned long)(FullTime.tv_usec + FullTime.tv_sec * 1000000);#line 606}; } /* transpose from x into scratch */ Transpose(n1, x, scratch, MyNum, MyFirst, MyLast, pad_length); if ((MyNum == 0) || (dostats)) { {#line 613 struct timeval FullTime;#line 613#line 613 gettimeofday(&FullTime, NULL);#line 613 (clocktime2) = (unsigned long)(FullTime.tv_usec + FullTime.tv_sec * 1000000);#line 613}; *l_transtime += (clocktime2-clocktime1); } /* do n1 1D FFTs on columns */ for (j=MyFirst; j<MyLast; j++) { FFT1DOnce(direction, m1, n1, upriv, &scratch[2*j*(n1+pad_length)]); TwiddleOneCol(direction, n1, j, umain2, &scratch[2*j*(n1+pad_length)], pad_length); } { pthread_barrier_wait(&(Global->start));}; if ((MyNum == 0) || (dostats)) { { struct timeval FullTime; gettimeofday(&FullTime, NULL); (clocktime1) = (unsigned long)(FullTime.tv_usec + FullTime.tv_sec * 1000000);}; } /* transpose */ Transpose(n1, scratch, x, MyNum, MyFirst, MyLast, pad_length); if ((MyNum == 0) || (dostats)) { { struct timeval FullTime; gettimeofday(&FullTime, NULL); (clocktime2) = (unsigned long)(FullTime.tv_usec + FullTime.tv_sec * 1000000);}; *l_transtime += (clocktime2-clocktime1); } /* do n1 1D FFTs on columns again */ for (j=MyFirst; j<MyLast; j++) { FFT1DOnce(direction, m1, n1, upriv, &x[2*j*(n1+pad_length)]); if (direction == -1) Scale(n1, N, &x[2*j*(n1+pad_length)]); } { pthread_barrier_wait(&(Global->start));}; if ((MyNum == 0) || (dostats)) { { struct timeval FullTime; gettimeofday(&FullTime, NULL); (clocktime1) = (unsigned long)(FullTime.tv_usec + FullTime.tv_sec * 1000000);}; } /* transpose back */ Transpose(n1, x, scratch, MyNum, MyFirst, MyLast, pad_length); if ((MyNum == 0) || (dostats)) { { struct timeval FullTime; gettimeofday(&FullTime, NULL); (clocktime2) = (unsigned long)(FullTime.tv_usec + FullTime.tv_sec * 1000000);}; *l_transtime += (clocktime2-clocktime1); } { pthread_barrier_wait(&(Global->start));}; /* copy columns from scratch to x */ if ((test_result) || (doprint)) { for (j=MyFirst; j<MyLast; j++) { CopyColumn(n1, &scratch[2*j*(n1+pad_length)], &x[2*j*(n1+pad_length)]); } } { pthread_barrier_wait(&(Global->start));};}void TwiddleOneCol(long direction, long n1, long j, double *u, double *x, long pad_length){ long i; double omega_r; double omega_c; double x_r; double x_c; for (i=0; i<n1; i++) { omega_r = u[2*(j*(n1+pad_length)+i)]; omega_c = direction*u[2*(j*(n1+pad_length)+i)+1]; x_r = x[2*i]; x_c = x[2*i+1]; x[2*i] = omega_r*x_r - omega_c*x_c; x[2*i+1] = omega_r*x_c + omega_c*x_r; }}void Scale(long n1, long N, double *x){ long i; for (i=0; i<n1; i++) { x[2*i] /= N; x[2*i+1] /= N; }}void Transpose(long n1, double *src, double *dest, long MyNum, long MyFirst, long MyLast, long pad_length){ long i; long j; long k; long l; long m; long blksize; long numblks; long firstfirst; long h_off; long v_off; long v; long h; long n1p; long row_count; blksize = MyLast-MyFirst; numblks = (2*blksize)/num_cache_lines; if (numblks * num_cache_lines != 2 * blksize) { numblks ++; } blksize = blksize / numblks; firstfirst = MyFirst; row_count = n1/P; n1p = n1+pad_length; for (l=MyNum+1;l<P;l++) { v_off = l*row_count; for (k=0; k<numblks; k++) { h_off = firstfirst; for (m=0; m<numblks; m++) { for (i=0; i<blksize; i++) { v = v_off + i; for (j=0; j<blksize; j++) { h = h_off + j; dest[2*(h*n1p+v)] = src[2*(v*n1p+h)]; dest[2*(h*n1p+v)+1] = src[2*(v*n1p+h)+1]; } } h_off += blksize; } v_off+=blksize; } } for (l=0;l<MyNum;l++) { v_off = l*row_count; for (k=0; k<numblks; k++) { h_off = firstfirst; for (m=0; m<numblks; m++) { for (i=0; i<blksize; i++) { v = v_off + i; for (j=0; j<blksize; j++) { h = h_off + j; dest[2*(h*n1p+v)] = src[2*(v*n1p+h)]; dest[2*(h*n1p+v)+1] = src[2*(v*n1p+h)+1]; } } h_off += blksize; } v_off+=blksize; } } v_off = MyNum*row_count; for (k=0; k<numblks; k++) { h_off = firstfirst; for (m=0; m<numblks; m++) { for (i=0; i<blksize; i++) { v = v_off + i; for (j=0; j<blksize; j++) { h = h_off + j; dest[2*(h*n1p+v)] = src[2*(v*n1p+h)]; dest[2*(h*n1p+v)+1] = src[2*(v*n1p+h)+1]; } } h_off += blksize; } v_off+=blksize; }}void CopyColumn(long n1, double *src, double *dest){ long i; for (i=0; i<n1; i++) { dest[2*i] = src[2*i]; dest[2*i+1] = src[2*i+1]; }}void Reverse(long N, long M, double *x){ long j, k; for (k=0; k<N; k++) { j = BitReverse(M, k); if (j > k) { SWAP_VALS(x[2*j], x[2*k]); SWAP_VALS(x[2*j+1], x[2*k+1]); } }}void FFT1DOnce(long direction, long M, long N, double *u, double *x){ long j; long k; long q; long L; long r; long Lstar; double *u1; double *x1; double *x2; double omega_r; double omega_c; double tau_r; double tau_c; double x_r; double x_c; Reverse(N, M, x); for (q=1; q<=M; q++) { L = 1<<q; r = N/L; Lstar = L/2; u1 = &u[2*(Lstar-1)]; for (k=0; k<r; k++) { x1 = &x[2*(k*L)]; x2 = &x[2*(k*L+Lstar)]; for (j=0; j<Lstar; j++) { omega_r = u1[2*j]; omega_c = direction*u1[2*j+1]; x_r = x2[2*j]; x_c = x2[2*j+1]; tau_r = omega_r*x_r - omega_c*x_c; tau_c = omega_r*x_c + omega_c*x_r; x_r = x1[2*j]; x_c = x1[2*j+1]; x2[2*j] = x_r - tau_r; x2[2*j+1] = x_c - tau_c; x1[2*j] = x_r + tau_r; x1[2*j+1] = x_c + tau_c; } } }}/************************************************************************************************//*打印FFT结果的函数,可注释掉void PrintArray(long N, double *x){ long i, j, k; for (i=0; i<rootN; i++) { k = i*(rootN+pad_length); for (j=0; j<rootN; j++) { printf(" %4.2f %4.2f", x[2*(k+j)], x[2*(k+j)+1]); if (i*rootN+j != N-1) { printf(","); } if ((i*rootN+j+1) % 8 == 0) { printf("\n"); } } } printf("\n"); printf("\n");}*//************************************************************************************************/void printerr(char *s){ fprintf(stderr,"ERROR: %s\n",s);}long log_2(long number){ long cumulative = 1, out = 0, done = 0; while ((cumulative < number) && (!done) && (out < 50)) { if (cumulative == number) { done = 1; } else { cumulative = cumulative * 2; out ++; } } if (cumulative == number) { return(out); } else { return(-1); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -