fwd kissfftndr sorta works, but the packing is wrong, or at least different from FFTW

This commit is contained in:
Mark Borgerding
2006-11-14 15:32:22 +00:00
parent 7f68a2916b
commit b4d5ded242
6 changed files with 264 additions and 28 deletions

View File

@ -19,8 +19,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
#include <unistd.h>
#include "kiss_fft.h"
#include "kiss_fftnd.h"
#include "kiss_fftr.h"
#include "kiss_fftndr.h"
static
void fft_file(FILE * fin,FILE * fout,int nfft,int isinverse)
@ -62,6 +61,51 @@ void fft_filend(FILE * fin,FILE * fout,int *dims,int ndims,int isinverse)
free (buf);
}
#define CHK fprintf(stderr,"LINE=%d\t",__LINE__)
static
void fft_filend_real(FILE * fin,FILE * fout,int *dims,int ndims,int isinverse)
{
int dimprod=1,i;
kiss_fftndr_cfg st;
void *ibuf;
void *obuf;
int insize,outsize; // size in bytes
for (i=0;i<ndims;++i)
dimprod *= dims[i];
insize = outsize = dimprod;
if (isinverse)
insize = insize*2*(dims[0]/2+1)/dims[0];
else
outsize = outsize*2*(dims[0]/2+1)/dims[0];
fprintf(stderr,"insize=%d outsize=%d\n",insize,outsize);
ibuf = malloc(insize*sizeof(kiss_fft_scalar));
obuf = malloc(outsize*sizeof(kiss_fft_scalar));
st = kiss_fftndr_alloc(dims, ndims, isinverse, 0, 0);
while ( fread (ibuf, sizeof(kiss_fft_scalar), insize, fin) > 0) {
if (isinverse) {
kiss_fftndri(st,
(kiss_fft_cpx*)ibuf,
(kiss_fft_scalar*)obuf);
}else{
kiss_fftndr(st,
(kiss_fft_scalar*)ibuf,
(kiss_fft_cpx*)obuf);
}
fwrite (obuf, sizeof(kiss_fft_scalar), outsize,fout);
}
free(st);
free(ibuf);
free(obuf);
}
static
void fft_file_real(FILE * fin,FILE * fout,int nfft,int isinverse)
{
@ -100,7 +144,7 @@ int get_dims(char * arg,int * dims)
if (p0)
*p0++ = '\0';
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;
}while (p0);
return ndims;
@ -147,12 +191,17 @@ int main(int argc,char ** argv)
++optind;
}
if (ndims>1 && !isreal)
fft_filend(fin,fout,dims,ndims,isinverse);
else if (ndims==1 && !isreal)
fft_file(fin,fout,dims[0],isinverse);
else if (ndims==1 && isreal)
fft_file_real(fin,fout,dims[0],isinverse);
if (ndims==1) {
if (isreal)
fft_file_real(fin,fout,dims[0],isinverse);
else
fft_file(fin,fout,dims[0],isinverse);
}else{
if (isreal)
fft_filend_real(fin,fout,dims,ndims,isinverse);
else
fft_filend(fin,fout,dims,ndims,isinverse);
}
if (fout!=stdout) fclose(fout);
if (fin!=stdin) fclose(fin);