www.pudn.com > ica_C.rar > spec.c


#include "spec.h"

static void make_sintbl(int n, vector sintbl)
{
  int i,n2,n4,n8;
  SCALAR c,s,dc,ds,t;

  n2=n/2; n4=n/4; n8=n/8;
  t =sin(PI/n);
  dc=2*t*t; ds=sqrt(dc*(2-dc));
  t =2*dc;  c =sintbl[n4]=1;  s=sintbl[0]=0;
  for(i=1;i=n) break;
    k=n2;
    while(k<=j){j-=k;k/=2;}
    j+=k;
  }
}

int fft(int n, vector x, vector y)
{
  static int    last_n = 0;
  static int   *bitrev = NULL;
  static SCALAR *sintbl = NULL;
  int i, j, k, ik, h, d, k2, n4, inverse;
  SCALAR t, s, c, dx, dy;

  if (n < 0) {
    n = -n;  inverse = 1;
  } else inverse = 0;
  n4 = n/4;
  if (n!=last_n || n==0) {
    last_n = n;
    if (sintbl != NULL) free(sintbl);
    if (bitrev != NULL) free(bitrev);
    if (n == 0) return 0;
    sintbl=new_vector(n+n4);
    bitrev=malloc(n*sizeof(int));
    if (sintbl == NULL || bitrev == NULL) {
      fprintf(stderr, "no memory space\n");  return 1;
    }
    make_sintbl(n, sintbl);
    make_bitrev(n, bitrev);
  }
  for (i=0;i0)
    for(t=f_size-1;t