X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=fourier%2Ffourier.c;h=e877cd1d0519c5233e5df5c808fc9435a0820c04;hb=3856972e1294f9d560a930aba63902548157b72b;hp=14878e20ccde80d6139c9483c13da21ee22f7854;hpb=15a0affd01053e899568c0ee1e7bd1315e11f925;p=my-code%2Fapi.git diff --git a/fourier/fourier.c b/fourier/fourier.c index 14878e2..e877cd1 100644 --- a/fourier/fourier.c +++ b/fourier/fourier.c @@ -8,7 +8,7 @@ int fourier_init(t_fourier *fourier,int outfd) { - fprintf(outfd,"[fourier] initializing fourier api ...\n"); + dprintf(outfd,"[fourier] initializing fourier api ...\n"); fourier->outfd=outfd; fourier->type=0; @@ -17,41 +17,73 @@ int fourier_init(t_fourier *fourier,int outfd) { return F_SUCCESS; } -int fourier_set_datalen(t_fourier *fourier,int dim,int len) { +int fourier_alloc_data(t_fourier *fourier) { - int i; + int i,size; - if(dim>MAX_DIM) { - fprintf(fourier->outfd,"[fourier] dimension %d not supported\n",dim); - return F_SET_DLEN_ERROR; + size=1; + for(i=0;idim;i++) size*=fourier->data_len[i]; + + fourier->data=(t_complex *)malloc(2*size*sizeof(t_complex)); + fourier->ftdata=&(fourier->data[size]); + + memset(fourier->data,0,2*size*sizeof(t_complex)); + + if(fourier->data==NULL) { + dprintf(fourier->outfd,"[fourier] malloc failed\n"); + return F_ALLOC_FAIL; } - fourier->data_len[dim]=len; + return F_SUCCESS; +} + +int fourier_shutdown(t_fourier *fourier) { + + dprintf(fourier->outfd,"[fourier] shutdown\n"); + + free(fourier->data); return F_SUCCESS; } -int fourier_malloc(t_fourier *fourier) { +int fourier_dft_1d(t_fourier *fourier) { - int i; + int i,k; + double arg; - if(fourier->dim==0) { - fprintf(fourier->outfd,"[fourier] dimension not specified\n"); - return F_DIM_ERROR; - } - for(i=0;idim;i++) { - if(fourier->data_len[i]==0) { - fprintf(fourier->outfd,"[fourier] invalid data len for dim %d\n",i); - return F_DLEN_ERROR; + if(fourier->type&FWD) { + for(k=0;kdata_len[0];k++) { + fourier->ftdata[k].r=0; + fourier->ftdata[k].i=0; + for(i=0;idata_len[0];i++) { + /* f(k) = 1/N sum(n=0-N) f(n) exp(-i*k*2*PI*n/N) */ + arg=-2.0*k*M_PI*i/fourier->data_len[0]; + fourier->ftdata[k].r+=(cos(arg)*fourier->data[i].r-sin(arg)*fourier->data[i].i); + fourier->ftdata[k].i+=(sin(arg)*fourier->data[i].r+cos(arg)*fourier->data[i].i); + } + fourier->ftdata[k].r/=fourier->data_len[0]; + fourier->ftdata[k].i/=fourier->data_len[0]; } } - - for(i=0;idim;i++) { - if((fourier->data[i]=(t_complex *)malloc(sizeof(t_complex)*fourier->data_len[i]))==NULL) { - fprintf(fourier->outfd,"[fourier] malloc for data dim %d failed\n",i); - return F_MALLOC_ERROR; + else { + for(k=0;kdata_len[0];k++) { + fourier->data[k].r=0; + fourier->data[k].i=0; + for(i=0;idata_len[0];i++) { + arg=2.0*k*M_PI*i/fourier->data_len[0]; + fourier->data[k].r+=(cos(arg)*fourier->ftdata[i].r-sin(arg)*fourier->ftdata[i].i); + fourier->data[k].i+=(sin(arg)*fourier->ftdata[i].r+cos(arg)*fourier->ftdata[i].i); + } } } return F_SUCCESS; } + +int fourier_dft_2d(t_fourier *fourier) { + return F_NOT_SUPPORTED; +} + +int fourier_dft_3d(t_fourier *fourier) { + return F_NOT_SUPPORTED; +}