fix for inplace odd rank multi-dimensional ffts

This commit is contained in:
Mark Borgerding 2004-02-02 01:49:08 +00:00
parent 490a602472
commit 1d58b0eced
2 changed files with 10 additions and 9 deletions

View File

@ -45,22 +45,19 @@ void fft_filend(FILE * fin,FILE * fout,int *dims,int ndims,int isinverse)
{ {
void *st; void *st;
kiss_fft_cpx *buf; kiss_fft_cpx *buf;
kiss_fft_cpx *bufout;
int dimprod=1,i; int dimprod=1,i;
for (i=0;i<ndims;++i) for (i=0;i<ndims;++i)
dimprod *= dims[i]; dimprod *= dims[i];
buf = (kiss_fft_cpx *) malloc (sizeof (kiss_fft_cpx) * dimprod); buf = (kiss_fft_cpx *) malloc (sizeof (kiss_fft_cpx) * dimprod);
bufout = (kiss_fft_cpx *) malloc (sizeof (kiss_fft_cpx) * dimprod);
st = kiss_fftnd_alloc (dims, ndims, isinverse, 0, 0); st = kiss_fftnd_alloc (dims, ndims, isinverse, 0, 0);
while (fread (buf, sizeof (kiss_fft_cpx) * dimprod, 1, fin) > 0) { while (fread (buf, sizeof (kiss_fft_cpx) * dimprod, 1, fin) > 0) {
kiss_fftnd (st, buf, bufout); kiss_fftnd (st, buf, buf);
fwrite (bufout, sizeof (kiss_fft_cpx), dimprod, fout); fwrite (buf, sizeof (kiss_fft_cpx), dimprod, fout);
} }
free (st); free (st);
free (buf); free (buf);
free (bufout);
} }
void fft_file_real(FILE * fin,FILE * fout,int nfft,int isinverse) void fft_file_real(FILE * fin,FILE * fout,int nfft,int isinverse)
@ -99,7 +96,7 @@ int get_dims(char * arg,int * dims)
if (p0) if (p0)
*p0++ = '\0'; *p0++ = '\0';
dims[ndims++] = atoi(arg); dims[ndims++] = atoi(arg);
fprintf(stderr,"dims[%d] = %d\n",ndims-1,dims[ndims-1]); /* fprintf(stderr,"dims[%d] = %d\n",ndims-1,dims[ndims-1]); */
arg = p0; arg = p0;
}while (p0); }while (p0);
return ndims; return ndims;

View File

@ -146,15 +146,19 @@ void kiss_fftnd(void * cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout)
kiss_fft_cpx * bufout; kiss_fft_cpx * bufout;
/*arrange it so the last bufout == fout*/ /*arrange it so the last bufout == fout*/
if ( st->ndims & 1 ) if ( st->ndims & 1 ) {
bufout = fout; bufout = fout;
else if (fin==fout) {
memcpy( st->tmpbuf, fin, sizeof(kiss_fft_cpx) * st->dimprod );
bufin = st->tmpbuf;
}
}else
bufout = st->tmpbuf; bufout = st->tmpbuf;
for ( k=0; k < st->ndims; ++k) { for ( k=0; k < st->ndims; ++k) {
int curdim = st->dims[k]; int curdim = st->dims[k];
int stride = st->dimprod / curdim; int stride = st->dimprod / curdim;
for ( i=0 ; i<stride ; ++i ) for ( i=0 ; i<stride ; ++i )
kiss_fft_stride( st->states[k], bufin+i , bufout+i*curdim, stride ); kiss_fft_stride( st->states[k], bufin+i , bufout+i*curdim, stride );