X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Fapi.git;a=blobdiff_plain;f=fourier%2Ffourier.c;h=4f395f5f53d242f841f3f1c620ebcc6fa7ce88db;hp=d322bc03ae0d807ea5e5a4da1a52c801dd704a52;hb=515c7fc6da820714686f9bfc87ccb9743c57d692;hpb=a54cc5ef402ca4ba6202f13ee65e5f2fdcfd10c1 diff --git a/fourier/fourier.c b/fourier/fourier.c index d322bc0..4f395f5 100644 --- a/fourier/fourier.c +++ b/fourier/fourier.c @@ -103,7 +103,7 @@ int fourier_fft_1d_shutdown(t_fourier *fourier) { int fourier_fft_1d(t_fourier *fourier) { - int i,j; + int i; /* copy src to destination, destination is modified in place */ memcpy(fourier->ftdata,fourier->data,fourier->data_len[0]*sizeof(t_complex)); @@ -117,7 +117,7 @@ int fourier_fft_1d(t_fourier *fourier) { for(i=0;idata_len[0];i++) dprintf(fourier->outfd,"%f %f\n", - fourier->ftdata[i]->r,fourier->revdata[i]->i); + fourier->ftdata[i].r,fourier->revdata[i]->r); return F_NOT_SUPPORTED; @@ -163,32 +163,82 @@ int fourier_dft_2d(t_fourier *fourier) { 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 - actually you would do: ft_on_index_1(ft_on_index_2(f(x,y))) */ - for(v=0;voutfd,"[fourier] (u=%d,v=%d)\n",u,v); + // fourier->ftdata[off_f+u].r=0; + // fourier->ftdata[off_f+u].i=0; + // for(y=0;yftdata[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;yftdata[off+u].r=0; - fourier->ftdata[off+u].i=0; + //dprintf(fourier->outfd,"[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' + off_f=0; + for(x=0;xoutfd,"[fourier] (u=%d,v=%d)\n",v,x); for(y=0;yftdata[off+u].r+=(cos(arg)*fourier->data[off_r+x].r-sin(arg)*fourier->data[off_r+x].i); - fourier->ftdata[off+u].i+=(sin(arg)*fourier->data[off_r+x].r+cos(arg)*fourier->data[off_r+x].i); - } + arg=-2.0*M_PI*v*y/Y; + off_r=off_f+y; + fourier->ftdata[off_f+v].r+=(cos(arg)*data[off_r].r-sin(arg)*data[off_r].i); + fourier->ftdata[off_f+v].r+=(sin(arg)*data[off_r].r+cos(arg)*data[off_r].i); } - fourier->ftdata[off_f+u].r/=(X*Y); - fourier->ftdata[off_f+u].i/=(X*Y); + fourier->ftdata[off_f+v].r/=Y; + fourier->ftdata[off_f+v].i/=Y; } + off_f+=Y; } + free(data); + return F_SUCCESS; }