X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=fourier%2Ffourier.c;h=9f810ecef37084d7d0bd4e17291688236b611752;hb=0e73e99a5415a252a15883b7f3594411781d2e9e;hp=e877cd1d0519c5233e5df5c808fc9435a0820c04;hpb=3856972e1294f9d560a930aba63902548157b72b;p=my-code%2Fapi.git diff --git a/fourier/fourier.c b/fourier/fourier.c index e877cd1..9f810ec 100644 --- a/fourier/fourier.c +++ b/fourier/fourier.c @@ -24,6 +24,9 @@ int fourier_alloc_data(t_fourier *fourier) { size=1; for(i=0;idim;i++) size*=fourier->data_len[i]; + dprintf(fourier->outfd,"[fourier] allocating %d bytes for data ...\n", + 2*size*sizeof(t_complex)); + fourier->data=(t_complex *)malloc(2*size*sizeof(t_complex)); fourier->ftdata=&(fourier->data[size]); @@ -46,6 +49,81 @@ int fourier_shutdown(t_fourier *fourier) { return F_SUCCESS; } +/* 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<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;idata_len[0];i++) { + r=0; + for(j=0;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;ilog2len[0];i++) { + + + // } + + + for(i=0;idata_len[0];i++) + dprintf(fourier->outfd,"%f %f\n", + fourier->ftdata[i].r,fourier->revdata[i]->r); + + return F_NOT_SUPPORTED; + + return F_SUCCESS; +} + int fourier_dft_1d(t_fourier *fourier) { int i,k; @@ -81,7 +159,86 @@ int fourier_dft_1d(t_fourier *fourier) { } int fourier_dft_2d(t_fourier *fourier) { - return F_NOT_SUPPORTED; + + int off_f,off_r; + int u,v,x,y; + int X,Y; + int size; + double arg; + t_complex *data; + + X=fourier->data_len[0]; + Y=fourier->data_len[1]; + + size=X*Y; + + data=(t_complex *)malloc(size*sizeof(t_complex)); + if(data==NULL) { + dprintf(fourier->outfd, + "[fourier] malloc of %d bytes of temp data failed\n",size); + return F_ALLOC_FAIL; + } + memset(data,0,size*sizeof(t_complex)); + + if(fourier->type&BWD) return F_NOT_SUPPORTED; + + /* stupid way */ + /* + for(v=0;vftdata[off_f+u].r+=(cos(arg)*fourier->data[off_r+x].r-sin(arg)*fourier->data[off_r+x].i); + fourier->ftdata[off_f+u].i+=(sin(arg)*fourier->data[off_r+x].r+cos(arg)*fourier->data[off_r+x].i); + } + } + fourier->ftdata[off_f+u].r/=(X*Y); + fourier->ftdata[off_f+u].i/=(X*Y); + } + } + */ + + /* the more clever way ... */ + // dft on index 1 + off_f=0; + for(y=0;youtfd,"[fourier] (u=%d,v=%d)\n",u,y); + for(x=0;xdata[off_r].r-sin(arg)*fourier->data[off_r].i); + data[off_f+u].r+=(sin(arg)*fourier->data[off_r].r+cos(arg)*fourier->data[off_r].i); + } + data[off_f+u].r/=X; + data[off_f+u].i/=X; + } + off_f+=X; + } + // dft on index 2 of 'index 1 transformed data' + for(x=0;xoutfd,"[fourier] (u=%d,v=%d)\n",v,x); + off_r=0; + for(y=0;yftdata[off_f+x].r+=(cos(arg)*data[off_r+x].r-sin(arg)*data[off_r+x].i); + fourier->ftdata[off_f+x].r+=(sin(arg)*data[off_r+x].r+cos(arg)*data[off_r+x].i); + off_r+=X; + } + fourier->ftdata[off_f+x].r/=Y; + fourier->ftdata[off_f+x].i/=Y; + off_f+=X; + } + } + + free(data); + + return F_SUCCESS; } int fourier_dft_3d(t_fourier *fourier) {