// utils void FFT_2d(int sizeX, int sizeY, std::vector< std::complex<Real_t> > signal_in, std::vector< std::complex<Real_t> > *signal_out){ std::vector< std::complex<Real_t> > out_tmp(sizeX*sizeY); // x direction fft for(int y=0; y<sizeY; y++){ std::vector< std::complex<Real_t> > x_tmp_in(sizeX); std::vector< std::complex<Real_t> > x_tmp_out(sizeX); for(int x=0; x<sizeX; x++){ x_tmp_in[x] =signal_in[x +sizeX*y]; } FFT_1d(x_tmp_in, &x_tmp_out); for(int x=0; x<sizeX; x++){ out_tmp[x +y*sizeX] =x_tmp_out[x]; } } // y direction fft for(int x=0; x<sizeX; x++){ std::vector< std::complex<Real_t> > y_tmp_in(sizeY); std::vector< std::complex<Real_t> > y_tmp_out(sizeY); for(int y=0; y<sizeY; y++){ y_tmp_in[y] =out_tmp[x+sizeX*y]; } FFT_1d(y_tmp_in, &y_tmp_out); for(int y=0; y<sizeY; y++){ out_tmp[x +y*sizeX] =y_tmp_out[y]; } } auto& F = *signal_out; for(int i =0; i<signal_in.size(); i++){ F[i] =out_tmp[i]; } }
int main(int argc, char *argv[]) { void *block; (void) argc; (void) argv; if (GSIZE > DSIZE*DSIZE) block = (void *) malloc(sizeof(double)*GSIZE*4); else block = (void *) malloc(sizeof(double)*DSIZE*DSIZE*4); { Complex_f *data = (Complex_f *) block; int i, k; printf("\n1-DIMENSIONAL FFT EXAMPLE:\n"); for (k = 0; k < 1; k++) { for (i = 0; i < QSIZE; i++) { data[i].real = (float) i; data[i].imag = (float) (QSIZE-i); } Print_Complex_1f(QSIZE,data,"In"); FFT_1f(QSIZE,data,0); Print_Complex_1f(QSIZE,data,"FFT"); FFT_1f(QSIZE,data,1); Print_Complex_1f(QSIZE,data,"FFT_1(FFT)"); } } { Complex_f *data = (Complex_f *) block; int i, k; printf("\n1-DIMENSIONAL FFT TEST:\n\n"); for (k = 1; k <= GSIZE; k *= 2) { for (i = 0; i < k; i++) { data[i].real = (float) ((i % 256) + 1); data[i].imag = (float) (((k-i) % 256) + 1); } if (FFT_1f(k,data,0) == NULL) goto error; if (FFT_1f(k,data,1) == NULL) goto error; { double avg, dev, mxdev, mxdiff; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < k; i++) { dev = fabs(data[i].real - ((i%256)+1)); if (dev > mxdiff) mxdiff = dev; dev /= ((i%256)+1.); if (dev > mxdev) mxdev = dev; avg += dev; dev = fabs(data[i].imag - (((k-i) % 256) + 1)); if (dev > mxdiff) mxdiff = dev; dev /= ((k-i) % 256) + 1.; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %8d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", k,mxdiff,mxdev,avg/(2.*k)); } } } { float *data = (float *) block; int i, k; Complex_f *fft; printf("\n1-DIMENSIONAL *REAL* FFT EXAMPLE:\n"); for (k = 0; k < 1; k++) { for (i = 0; i < QSIZE; i++) data[i] = (float) i; Print_Real_1f(QSIZE,data,"Input"); fft = Real_FFT_1f(QSIZE,data); Print_Complex_1f(QSIZE/2,fft,"Real_FFT"); Real_FFT_Inverse_1f(QSIZE,fft); Print_Real_1f(QSIZE,data,"F_1(F(data))"); } } { float *data = (float *) block; int i, k; Complex_f *fft; printf("\n1-DIMENSIONAL *REAL* FFT TEST:\n\n"); for (k = 1; k <= 2*GSIZE; k *= 2) { for (i = 0; i < k; i++) data[i] = (float) ((i%256)+1); if ((fft = Real_FFT_1f(k,data)) == NULL) goto error; if (Real_FFT_Inverse_1f(k,fft) == NULL) goto error; { double avg, dev, mxdev, mxdiff; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < k; i++) { dev = fabs(data[i] - (i%256+1)); if (dev > mxdiff) mxdiff = dev; dev /= (i%256+1); if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %8d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", k,mxdiff,mxdev,avg/k); } } } { float *rata = (float *) block; float *fata = rata + QSIZE; int i, k; printf("\n1-DIMENSIONAL REAL CONVOLUTION EXAMPLE:\n"); for (k = 0; k < 1; k++) { for (i = 0; i < QSIZE; i++) { rata[i] = (float) (i%2+1); fata[i] = (float) (i%2+1); } Print_Real_1f(QSIZE,fata,"Inputs 1 & 2"); Real_FFT_Inverse_1f(QSIZE,Real_Convolution_1f(QSIZE,Real_FFT_1f(QSIZE,fata), Real_FFT_1f(QSIZE,rata))); Print_Real_1f(QSIZE,fata,"Convolution"); } } { float *rata = (float *) block; float *fata = rata + QSIZE; int i, k; printf("\n1-DIMENSIONAL REAL CORRELATION EXAMPLE:\n"); for (k = 0; k < 1; k++) { for (i = 0; i < QSIZE; i++) { rata[i] = (float) (i%2+1); fata[i] = (float) (i%2+1); } Print_Real_1f(QSIZE,fata,"Inputs 1 & 2"); Real_FFT_Inverse_1f(QSIZE,Real_Correlation_1f(QSIZE,Real_FFT_1f(QSIZE,fata), Real_FFT_1f(QSIZE,rata))); Print_Real_1f(QSIZE,fata,"Correlation"); } } { float *data = (float *) block; float *rata = data + 2*GSIZE; int i, k; printf("\n1-DIMENSIONAL REAL CONVOLUTION TEST:\n\n"); for (k = 1; k <= 2*GSIZE; k *= 2) { for (i = 0; i < k; i++) data[i] = rata[i] = (float) (i%2+1); if (Real_FFT_1f(k,data) == NULL) goto error; if (Real_FFT_1f(k,rata) == NULL) goto error; if (Real_Convolution_1f(k,(Complex_f *) data,(Complex_f *) rata) == NULL) goto error; if (Real_FFT_Inverse_1f(k,(Complex_f *) data) == NULL) goto error; { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < k; i++) { if (k == 1) x = 1; else x = 2*k + ((i+1)%2)*(k/2); dev = fabs(data[i] - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %8d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", k,mxdiff,mxdev,avg/k); } } } { float *data = (float *) block; float *rata = data + 2*GSIZE; int i, k; printf("\n1-DIMENSIONAL REAL CORRELATION TEST:\n\n"); for (k = 1; k <= 2*GSIZE; k *= 2) { for (i = 0; i < k; i++) data[i] = rata[i] = (float) (i%2+1); if (Real_FFT_1f(k,data) == NULL) goto error; if (Real_FFT_1f(k,rata) == NULL) goto error; if (Real_Correlation_1f(k,(Complex_f *) data,(Complex_f *) rata) == NULL) goto error; if (Real_FFT_Inverse_1f(k,(Complex_f *) data) == NULL) goto error; { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < k; i++) { if (k == 1) x = 1; else x = 2*k + ((i+1)%2)*(k/2); dev = fabs(data[i] - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %8d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", k,mxdiff,mxdev,avg/k); } } } { Complex_f *data = (Complex_f *) block; int dims[2]; int i, j, k, d; dims[0] = HSIZE; dims[1] = HSIZE; printf("\nMULTI-DIMENSIONAL FFT EXAMPLE:\n"); for (k = 0; k < 1; k++) { int base1 = dims[0]; for (i = 0; i < dims[1]; i++) for (j = 0; j < dims[0]; j++) { d = i*base1+j; data[d].real = (float) d; data[d].imag = (float) (base1-d); } Print_Complex_nf(2,dims,data,"Input"); FFT_nf(2,dims,data,0); Print_Complex_nf(2,dims,data,"FFT"); FFT_nf(2,dims,data,1); Print_Complex_nf(2,dims,data,"FFT_1(FFT)"); } } { Complex_f *data = (Complex_f *) block; int dims[2]; int h, k, i, j, d; printf("\nMULTI-DIMENSIONAL FFT TEST:\n\n"); for (h = 1; h <= DSIZE; h *= 2) for (k = 1; k <= DSIZE; k *= 2) { dims[0] = k; dims[1] = h; for (i = 0; i < dims[1]; i++) for (j = 0; j < dims[0]; j++) { d = i*k+j; data[d].real = (float) ((d % 256) + 1); data[d].imag = (float) (abs((k-d) % 256) + 1); } if (FFT_nf(2,dims,data,0) == NULL) goto error; if (FFT_nf(2,dims,data,1) == NULL) goto error; { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < dims[1]; i++) for (j = 0; j < dims[0]; j++) { d = i*k+j; x = (d % 256) + 1; dev = fabs(data[d].real - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; x = abs((k-d) % 256) + 1; dev = fabs(data[d].imag - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %4d,%4d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", h,k,mxdiff,mxdev,avg/(2.*k*h)); } } } { float *data = (float *) block; int dims[2]; Complex_f *fft; int k, i; dims[0] = HSIZE; dims[1] = HSIZE; printf("\nMULTI-DIMENSIONAL *REAL* FFT EXAMPLE:\n"); for (k = 0; k < 1; k++) { for (i = 0; i < dims[0]*dims[1]; i++) data[i] = (float) i; Print_Real_nf(2,dims,data,"Input"); fft = Real_FFT_nf(2,dims,data); dims[0] /= 2; Print_Complex_nf(2,dims,fft,"Real_FFT"); dims[0] *= 2; Real_FFT_Inverse_nf(2,dims,fft); Print_Real_nf(2,dims,data,"F_1(F(data))"); } } { float *data = (float *) block; int dims[2]; Complex_f *fft; int h, k, i; printf("\nMULTI-DIMENSIONAL *REAL* FFT TEST:\n\n"); for (h = 1; h <= DSIZE; h *= 2) for (k = 1; k <= 2*DSIZE; k *= 2) { dims[0] = k; dims[1] = h; for (i = 0; i < k*h; i++) data[i] = (float) ((i % 256) + 1); if ((fft = Real_FFT_nf(2,dims,data)) == NULL) goto error; if (Real_FFT_Inverse_nf(2,dims,fft) == NULL) goto error; { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < k*h; i++) { x = (i % 256) + 1; dev = fabs(data[i] - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %4d,%4d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", h,k,mxdiff,mxdev,avg/(2.*k*h)); } } } { float *rata = (float *) block; float *fata = rata + HSIZE*HSIZE; int dims[2]; int i, j, k, d; dims[0] = HSIZE; dims[1] = HSIZE; printf("\nMULTI-DIMENSIONAL REAL CONVOLUTION EXAMPLE:\n"); for (k = 0; k < 1; k++) { int base1 = dims[0]; for (i = 0; i < dims[1]; i++) for (j = 0; j < dims[0]; j++) { d = i*base1+j; rata[d] = (float) (d % 2 + 1); fata[d] = (float) (d % 2 + 1); } Print_Real_nf(2,dims,fata,"Inputs 1 & 2"); Real_FFT_Inverse_nf(2,dims, Real_Convolution_nf(2,dims,Real_FFT_nf(2,dims,fata),Real_FFT_nf(2,dims,rata))); Print_Real_nf(2,dims,fata,"Convolution"); } } { float *rata = (float *) block; float *fata = rata + HSIZE*HSIZE; int dims[2]; int i, j, k, d; dims[0] = HSIZE; dims[1] = HSIZE; printf("\nMULTI-DIMENSIONAL REAL CORRELATION EXAMPLE:\n"); for (k = 0; k < 1; k++) { int base1 = dims[0]; for (i = 0; i < dims[1]; i++) for (j = 0; j < dims[0]; j++) { d = i*base1+j; rata[d] = (float) (d % 2 + 1); fata[d] = (float) (d % 2 + 1); } Print_Real_nf(2,dims,fata,"Inputs 1 & 2"); Real_FFT_Inverse_nf(2,dims, Real_Correlation_nf(2,dims,Real_FFT_nf(2,dims,fata),Real_FFT_nf(2,dims,rata))); Print_Real_nf(2,dims,fata,"Correlation"); } } { float *rata = (float *) block; float *fata = rata + 2*DSIZE*DSIZE; int dims[2]; int h, k, i; printf("\nMULTI-DIMENSIONAL REAL CONVOLUTION TEST:\n\n"); for (h = 1; h <= DSIZE; h *= 2) for (k = 1; k <= 2*DSIZE; k *= 2) { int size; dims[0] = k; dims[1] = h; size = k*h; for (i = 0; i < size; i++) { rata[i] = (float) ((i % 2) + 1); fata[i] = (float) ((i % 2) + 1); } if (Real_FFT_nf(2,dims,fata) == NULL) goto error; if (Real_FFT_nf(2,dims,rata) == NULL) goto error; if (Real_Convolution_nf(2,dims,(Complex_f *) fata,(Complex_f *) rata) == NULL) goto error; if (Real_FFT_Inverse_nf(2,dims,(Complex_f *) fata) == NULL) goto error; { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < size; i++) { if (size == 1) x = 1; else { x = 4 + (i+1)%2; x = x * k * h / 2; } dev = fabs(fata[i] - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %4d,%4d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", h,k,mxdiff,mxdev,avg/(2.*k*h)); } } } { float *rata = (float *) block; float *fata = rata + 2*DSIZE*DSIZE; int dims[2]; int h, k, i; printf("\nMULTI-DIMENSIONAL REAL CORRELATION TEST:\n\n"); for (h = 1; h <= DSIZE; h *= 2) for (k = 1; k <= 2*DSIZE; k *= 2) { int size; dims[0] = k; dims[1] = h; size = k*h; for (i = 0; i < size; i++) { rata[i] = (float) ((i % 2) + 1); fata[i] = (float) ((i % 2) + 1); } if (Real_FFT_nf(2,dims,fata) == NULL) goto error; if (Real_FFT_nf(2,dims,rata) == NULL) goto error; if (Real_Correlation_nf(2,dims,(Complex_f *) fata,(Complex_f *) rata) == NULL) goto error; if (Real_FFT_Inverse_nf(2,dims,(Complex_f *) fata) == NULL) goto error; { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < size; i++) { if (size == 1) x = 1; else { x = 4 + (i+1)%2; x = x * k * h / 2; } dev = fabs(fata[i] - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %4d,%4d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", h,k,mxdiff,mxdev,avg/(2.*k*h)); } } } { Complex_d *data = (Complex_d *) block; int i, k; printf("\n1-DIMENSIONAL FFT EXAMPLE:\n"); for (k = 0; k < 1; k++) { for (i = 0; i < QSIZE; i++) { data[i].real = i; data[i].imag = QSIZE-i; } Print_Complex_1d(QSIZE,data,"In"); FFT_1d(QSIZE,data,0); Print_Complex_1d(QSIZE,data,"FFT"); FFT_1d(QSIZE,data,1); Print_Complex_1d(QSIZE,data,"FFT_1(FFT)"); } } { Complex_d *data = (Complex_d *) block; int i, k; printf("\n1-DIMENSIONAL FFT TEST:\n\n"); for (k = 1; k <= GSIZE; k *= 2) { for (i = 0; i < k; i++) { data[i].real = (i % 256) + 1; data[i].imag = ((k-i) % 256) + 1; } FFT_1d(k,data,0); FFT_1d(k,data,1); { double avg, dev, mxdev, mxdiff; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < k; i++) { dev = fabs(data[i].real - ((i%256)+1)); if (dev > mxdiff) mxdiff = dev; dev /= ((i%256)+1.); if (dev > mxdev) mxdev = dev; avg += dev; dev = fabs(data[i].imag - (((k-i) % 256) + 1)); if (dev > mxdiff) mxdiff = dev; dev /= ((k-i) % 256) + 1.; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %8d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", k,mxdiff,mxdev,avg/(2.*k)); } } } { double *data = (double *) block; int i, k; Complex_d *fft; printf("\n1-DIMENSIONAL *REAL* FFT EXAMPLE:\n"); for (k = 0; k < 1; k++) { for (i = 0; i < QSIZE; i++) data[i] = i; Print_Real_1d(QSIZE,data,"Input"); fft = Real_FFT_1d(QSIZE,data); Print_Complex_1d(QSIZE/2,fft,"Real_FFT"); Real_FFT_Inverse_1d(QSIZE,fft); Print_Real_1d(QSIZE,data,"F_1(F(data))"); } } { double *data = (double *) block; int i, k; Complex_d *fft; printf("\n1-DIMENSIONAL *REAL* FFT TEST:\n\n"); for (k = 1; k <= 2*GSIZE; k *= 2) { for (i = 0; i < k; i++) data[i] = (i%256)+1; fft = Real_FFT_1d(k,data); Real_FFT_Inverse_1d(k,fft); { double avg, dev, mxdev, mxdiff; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < k; i++) { dev = fabs(data[i] - (i%256+1)); if (dev > mxdiff) mxdiff = dev; dev /= (i%256+1); if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %8d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", k,mxdiff,mxdev,avg/k); } } } { double *rata = (double *) block; double *fata = rata + QSIZE; int i, k; printf("\n1-DIMENSIONAL REAL CONVOLUTION EXAMPLE:\n"); for (k = 0; k < 1; k++) { for (i = 0; i < QSIZE; i++) { rata[i] = i%2+1; fata[i] = i%2+1; } Print_Real_1d(QSIZE,fata,"Inputs 1 & 2"); Real_FFT_Inverse_1d(QSIZE, Real_Convolution_1d(QSIZE,Real_FFT_1d(QSIZE,fata),Real_FFT_1d(QSIZE,rata))); Print_Real_1d(QSIZE,fata,"Convolution"); } } { double *rata = (double *) block; double *fata = rata + QSIZE; int i, k; printf("\n1-DIMENSIONAL REAL CORRELATION EXAMPLE:\n"); for (k = 0; k < 1; k++) { for (i = 0; i < QSIZE; i++) { rata[i] = i%2+1; fata[i] = i%2+1; } Print_Real_1d(QSIZE,fata,"Inputs 1 & 2"); Real_FFT_Inverse_1d(QSIZE, Real_Correlation_1d(QSIZE,Real_FFT_1d(QSIZE,fata),Real_FFT_1d(QSIZE,rata))); Print_Real_1d(QSIZE,fata,"Correlation"); } } { double *data = (double *) block; double *rata = data + 2*GSIZE; int i, k; printf("\n1-DIMENSIONAL REAL CONVOLUTION TEST:\n\n"); for (k = 1; k <= 2*GSIZE; k *= 2) { for (i = 0; i < k; i++) data[i] = rata[i] = i%2+1; Real_FFT_Inverse_1d(k,Real_Convolution_1d(k,Real_FFT_1d(k,data),Real_FFT_1d(k,rata))); { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < k; i++) { if (k == 1) x = 1; else x = 2*k + ((i+1)%2)*(k/2); dev = fabs(data[i] - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %8d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", k,mxdiff,mxdev,avg/k); } } } { double *data = (double *) block; double *rata = data + 2*GSIZE; int i, k; printf("\n1-DIMENSIONAL REAL CORRELATION TEST:\n\n"); for (k = 1; k <= 2*GSIZE; k *= 2) { for (i = 0; i < k; i++) data[i] = rata[i] = i%2+1; Real_FFT_Inverse_1d(k,Real_Correlation_1d(k,Real_FFT_1d(k,data),Real_FFT_1d(k,rata))); { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < k; i++) { if (k == 1) x = 1; else x = 2*k + ((i+1)%2)*(k/2); dev = fabs(data[i] - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %8d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", k,mxdiff,mxdev,avg/k); } } } { Complex_d *data = (Complex_d *) block; int dims[2]; int i, j, k, d; dims[0] = HSIZE; dims[1] = HSIZE; printf("\nMULTI-DIMENSIONAL FFT EXAMPLE:\n"); for (k = 0; k < 1; k++) { int base1 = dims[0]; for (i = 0; i < dims[1]; i++) for (j = 0; j < dims[0]; j++) { d = i*base1+j; data[d].real = d; data[d].imag = base1-d; } Print_Complex_nd(2,dims,data,"Input"); FFT_nd(2,dims,data,0); Print_Complex_nd(2,dims,data,"FFT"); FFT_nd(2,dims,data,1); Print_Complex_nd(2,dims,data,"FFT_1(FFT)"); } } { Complex_d *data = (Complex_d *) block; int dims[2]; int h, k, i, j, d; printf("\nMULTI-DIMENSIONAL FFT TEST:\n\n"); for (h = 1; h <= DSIZE; h *= 2) for (k = 1; k <= DSIZE; k *= 2) { dims[0] = k; dims[1] = h; for (i = 0; i < dims[1]; i++) for (j = 0; j < dims[0]; j++) { d = i*k+j; data[d].real = (d % 256) + 1; data[d].imag = abs((k-d) % 256) + 1; } FFT_nd(2,dims,data,0); FFT_nd(2,dims,data,1); { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < dims[1]; i++) for (j = 0; j < dims[0]; j++) { d = i*k+j; x = (d % 256) + 1; dev = fabs(data[d].real - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; x = abs((k-d) % 256) + 1; dev = fabs(data[d].imag - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %4d,%4d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", h,k,mxdiff,mxdev,avg/(2.*k*h)); } } } { double *data = (double *) block; int dims[2]; Complex_d *fft; int k, i; dims[0] = HSIZE; dims[1] = HSIZE; printf("\nMULTI-DIMENSIONAL *REAL* FFT EXAMPLE:\n"); for (k = 0; k < 1; k++) { for (i = 0; i < dims[0]*dims[1]; i++) data[i] = i; Print_Real_nd(2,dims,data,"Input"); fft = Real_FFT_nd(2,dims,data); dims[0] /= 2; Print_Complex_nd(2,dims,fft,"Real_FFT"); dims[0] *= 2; Real_FFT_Inverse_nd(2,dims,fft); Print_Real_nd(2,dims,data,"F_1(F(data))"); } } { double *data = (double *) block; int dims[2]; Complex_d *fft; int h, k, i; printf("\nMULTI-DIMENSIONAL *REAL* FFT TEST:\n\n"); for (h = 1; h <= DSIZE; h *= 2) for (k = 1; k <= DSIZE; k *= 2) { dims[0] = k; dims[1] = h; for (i = 0; i < k*h; i++) data[i] = (i % 256) + 1; fft = Real_FFT_nd(2,dims,data); Real_FFT_Inverse_nd(2,dims,fft); { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < k*h; i++) { x = (i % 256) + 1; dev = fabs(data[i] - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %4d,%4d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", h,k,mxdiff,mxdev,avg/(2.*k*h)); } } } { double *rata = (double *) block; double *fata = rata + HSIZE*HSIZE; int dims[2]; int i, j, k, d; dims[0] = HSIZE; dims[1] = HSIZE; printf("\nMULTI-DIMENSIONAL REAL CONVOLUTION EXAMPLE:\n"); for (k = 0; k < 1; k++) { int base1 = dims[0]; for (i = 0; i < dims[1]; i++) for (j = 0; j < dims[0]; j++) { d = i*base1+j; rata[d] = d % 2 + 1; fata[d] = d % 2 + 1; } Print_Real_nd(2,dims,fata,"Inputs 1 & 2"); Real_FFT_Inverse_nd(2,dims, Real_Convolution_nd(2,dims,Real_FFT_nd(2,dims,fata),Real_FFT_nd(2,dims,rata))); Print_Real_nd(2,dims,fata,"Convolution"); } } { double *rata = (double *) block; double *fata = rata + HSIZE*HSIZE; int dims[2]; int i, j, k, d; dims[0] = HSIZE; dims[1] = HSIZE; printf("\nMULTI-DIMENSIONAL REAL CORRELATION EXAMPLE:\n"); for (k = 0; k < 1; k++) { int base1 = dims[0]; for (i = 0; i < dims[1]; i++) for (j = 0; j < dims[0]; j++) { d = i*base1+j; rata[d] = d % 2 + 1; fata[d] = d % 2 + 1; } Print_Real_nd(2,dims,fata,"Inputs 1 & 2"); Real_FFT_Inverse_nd(2,dims, Real_Correlation_nd(2,dims,Real_FFT_nd(2,dims,fata),Real_FFT_nd(2,dims,rata))); Print_Real_nd(2,dims,fata,"Correlation"); } } { double *rata = (double *) block; double *fata = rata + 2*DSIZE*DSIZE; int dims[2]; int h, k, i; printf("\nMULTI-DIMENSIONAL REAL CONVOLUTION TEST:\n\n"); for (h = 1; h <= DSIZE; h *= 2) for (k = 1; k <= 2*DSIZE; k *= 2) { int size; dims[0] = k; dims[1] = h; size = k*h; for (i = 0; i < size; i++) { rata[i] = (i % 2) + 1; fata[i] = (i % 2) + 1; } Real_FFT_Inverse_nd(2,dims, Real_Convolution_nd(2,dims,Real_FFT_nd(2,dims,fata),Real_FFT_nd(2,dims,rata))); { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < size; i++) { if (size == 1) x = 1; else { x = 4 + (i+1)%2; x = x * k * h / 2; } dev = fabs(fata[i] - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %4d,%4d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", h,k,mxdiff,mxdev,avg/(2.*k*h)); } } } { double *rata = (double *) block; double *fata = rata + 2*DSIZE*DSIZE; int dims[2]; int h, k, i; printf("\nMULTI-DIMENSIONAL REAL CORRELATION TEST:\n\n"); for (h = 1; h <= DSIZE; h *= 2) for (k = 1; k <= 2*DSIZE; k *= 2) { int size; dims[0] = k; dims[1] = h; size = k*h; for (i = 0; i < size; i++) { rata[i] = (i % 2) + 1; fata[i] = (i % 2) + 1; } Real_FFT_Inverse_nd(2,dims, Real_Correlation_nd(2,dims,Real_FFT_nd(2,dims,fata),Real_FFT_nd(2,dims,rata))); { double avg, dev, mxdev, mxdiff; int x; avg = 0.; mxdiff = 0.; mxdev = 0.; for (i = 0; i < size; i++) { if (size == 1) x = 1; else { x = 4 + (i+1)%2; x = x * k * h / 2; } dev = fabs(fata[i] - x); if (dev > mxdiff) mxdiff = dev; dev /= x; if (dev > mxdev) mxdev = dev; avg += dev; } printf("For %4d,%4d: max diff = %.3e, max dev = %.3e, avg dev = %.3e\n", h,k,mxdiff,mxdev,avg/(2.*k*h)); } } } exit (0); error: printf("Encounted an error (%s) %s\n",FFT_Error_Source(),FFT_Error_String()); exit (0); }