improvements
[my-code/api.git] / fourier / fourier.c
index 14878e2..e877cd1 100644 (file)
@@ -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;i<fourier->dim;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;i<fourier->dim;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;k<fourier->data_len[0];k++) {
+      fourier->ftdata[k].r=0;
+      fourier->ftdata[k].i=0;
+      for(i=0;i<fourier->data_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;i<fourier->dim;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;k<fourier->data_len[0];k++) {
+      fourier->data[k].r=0;
+      fourier->data[k].i=0;
+      for(i=0;i<fourier->data_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;
+}