+/* fft functions */
+
+int fourier_fft_1d_init(t_fourier *fourier) {
+
+ unsigned int i,j,m,r;
+ int mask[32];
+
+ /* calculate m = log 2 (N) + check N = 2^m */
+ m=0;
+ while(m<32) {
+ if(1<<m==fourier->data_len[0]) break;
+ else m++;
+ }
+ if(m==32) {
+ dprintf(fourier->outfd,
+ "[fourier] fft impossible (N > 2^32 or not a power of 2\n");
+ return F_FFT_IMPOSSIBLE;
+ }
+ dprintf(fourier->outfd,"[fourier] log2(%d) = %d\n",fourier->data_len[0],m);
+ fourier->log2len[0]=m;
+
+ /* pointer array which will point to reversed t_complex data */
+ fourier->revdata=(t_complex **)malloc(fourier->data_len[0]*sizeof(t_complex *));
+ if(fourier->revdata==NULL) {
+ dprintf(fourier->outfd,
+ "[fourier] malloc for reversed data pointers failed\n");
+ return F_ALLOC_FAIL;
+ }
+
+ dprintf(fourier->outfd,"[fourier] fft: allocated data pointers\n");
+
+ /* swap data (bit reversal) */
+ for(i=0;i<m;i++) mask[i]=1<<i;
+ for(i=0;i<fourier->data_len[0];i++) {
+ r=0;
+ for(j=0;j<m;j++) r+=(((i&mask[j])>>j)<<(m-j-1));
+ fourier->revdata[i]=fourier->ftdata+r;
+ }
+
+ return F_SUCCESS;
+}
+
+int fourier_fft_1d_shutdown(t_fourier *fourier) {
+
+ dprintf(fourier->outfd,"[fourier] fft shutdown\n");
+
+ free(fourier->revdata);
+
+ return F_SUCCESS;
+}
+
+
+int fourier_fft_1d(t_fourier *fourier) {
+
+ int i;
+
+ /* copy src to destination, destination is modified in place */
+ memcpy(fourier->ftdata,fourier->data,fourier->data_len[0]*sizeof(t_complex));
+ /* from now on access bit reversed data by revdata[i]->... */
+
+ // for(i=0;i<fourier->log2len[0];i++) {
+
+
+ // }
+
+
+ for(i=0;i<fourier->data_len[0];i++)
+ dprintf(fourier->outfd,"%f %f\n",
+ fourier->ftdata[i].r,fourier->revdata[i]->r);
+
+ return F_NOT_SUPPORTED;
+
+ return F_SUCCESS;
+}
+