mirror of
				https://github.com/mborgerding/kissfft.git
				synced 2025-10-31 08:14:41 -04:00 
			
		
		
		
	fix for inplace odd rank multi-dimensional ffts
This commit is contained in:
		| @ -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,9 +146,13 @@ 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) { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user