mirror of
https://github.com/mborgerding/kissfft.git
synced 2025-05-27 21:20:27 -04:00
fix for inplace odd rank multi-dimensional ffts
This commit is contained in:
parent
490a602472
commit
1d58b0eced
@ -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;
|
||||||
|
@ -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 );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user