cmath4.c, correct array size and relay to specific array order for r2c transformation

This commit is contained in:
dwarning 2013-11-25 21:36:50 +01:00 committed by rlar
parent dc398f1387
commit 2671aef5cd
1 changed files with 18 additions and 24 deletions

View File

@ -517,6 +517,7 @@ cx_fft(void *data, short int type, int length, int *newlength, short int *newtyp
ngcomplex_t *outdata = NULL;
struct dvec *sv;
char window[BSIZE_SP];
double *realdata;
#ifdef HAVE_LIBFFTW3
fftw_complex *inc;
@ -526,7 +527,6 @@ cx_fft(void *data, short int type, int length, int *newlength, short int *newtyp
#else
int N, M;
double *datax = NULL;
double *realdata;
#endif
if (grouping == 0)
@ -558,7 +558,7 @@ cx_fft(void *data, short int type, int length, int *newlength, short int *newtyp
if (type == VF_COMPLEX)
fpts = N;
else
fpts = N/2;
fpts = N/2 + 1;
#endif
*newtype = VF_COMPLEX;
@ -701,7 +701,9 @@ cx_fft(void *data, short int type, int length, int *newlength, short int *newtyp
} else { /* input vector is real */
double *indata = (double *) data;
realdata = (double *) data;
*newlength = fpts;
outdata = alloc_c(fpts);
#ifdef HAVE_LIBFFTW3
@ -712,15 +714,12 @@ cx_fft(void *data, short int type, int length, int *newlength, short int *newtyp
out = fftw_malloc(sizeof(fftw_complex) * (unsigned int) fpts);
for (i = 0; i < length; i++)
ind[i] = indata[i] * win[i];
ind[i] = realdata[i] * win[i];
plan_forward = fftw_plan_dft_r2c_1d(length, ind, out, FFTW_ESTIMATE);
fftw_execute(plan_forward);
*newlength = fpts;
outdata = alloc_c(fpts);
scale = (double) length;
for (i = 0; i < fpts; i++) {
outdata[i].cx_real = out[i][0]/scale;
@ -732,9 +731,7 @@ cx_fft(void *data, short int type, int length, int *newlength, short int *newtyp
#else /* Green's FFT */
printf("FFT: Time span: %g s, input length: %d, zero padding: %d\n", span, length, N-length);
printf("FFT: Frequency resolution: %g Hz, output length: %d\n", 1.0/span, N/2);
realdata = (double *) data;
printf("FFT: Frequency resolution: %g Hz, output length: %d\n", 1.0/span, fpts);
datax = TMALLOC(double, N);
@ -747,15 +744,16 @@ cx_fft(void *data, short int type, int length, int *newlength, short int *newtyp
rffts(datax, M, 1);
fftFree();
*newlength = N/2;
outdata = alloc_c(N/2);
scale = (double) N;
/* Re(x[0]), Re(x[N/2]), Re(x[1]), Im(x[1]), Re(x[2]), Im(x[2]), ... Re(x[N/2-1]), Im(x[N/2-1]). */
for (i = 0; i < N/2; i++) {
outdata[0].cx_real = datax[0]/scale;
outdata[0].cx_imag = 0.0;
for (i = 1; i < fpts-1; i++) {
outdata[i].cx_real = datax[2*i]/scale;
outdata[i].cx_imag = datax[2*i+1]/scale;
}
outdata[fpts-1].cx_real = datax[1]/scale;
outdata[fpts-1].cx_imag = 0.0;
#endif
@ -875,6 +873,10 @@ cx_ifft(void *data, short int type, int length, int *newlength, short int *newty
sv->v_realdata = xscale;
vec_new(sv);
*newtype = VF_COMPLEX;
*newlength = tpts;
outdata = alloc_c(tpts);
#ifdef HAVE_LIBFFTW3
printf("IFFT: Frequency span: %g Hz, input length: %d\n", 1/span*length, length);
@ -892,10 +894,6 @@ cx_ifft(void *data, short int type, int length, int *newlength, short int *newty
fftw_execute(plan_backward);
*newtype = VF_COMPLEX;
*newlength = tpts;
outdata = alloc_c(tpts);
for (i = 0; i < tpts; i++) {
outdata[i].cx_real = out[i][0];
outdata[i].cx_imag = out[i][1];
@ -925,12 +923,8 @@ cx_ifft(void *data, short int type, int length, int *newlength, short int *newty
iffts(datax, M, 1);
fftFree();
*newtype = VF_COMPLEX;
*newlength = N;
outdata = alloc_c(N);
scale = (double) N;
for (i = 0; i < N; i++) {
scale = (double) tpts;
for (i = 0; i < tpts; i++) {
outdata[i].cx_real = datax[2*i] * scale;
outdata[i].cx_imag = datax[2*i+1] * scale;
}