Exemplo n.º 1
0
int main(int argc, char ** argv)
{
  int n, np, npm, n2, i, j, nruns;
  double enp, t, y, z, zr, zi, zm, a;
  double * xr, * xi, * pxr, * pxi;

  if (argc >= 2) n = atoi(argv[1]); else n = 18;
  np = 1 << n;
  enp = np; 
  npm = np / 2  - 1;  
  t = PI / enp;
  xr = calloc(np, sizeof(double));
  xi = calloc(np, sizeof(double));
  pxr = xr;
  pxi = xi;
  for (nruns = 0; nruns < NRUNS; nruns++) {
    *pxr = (enp - 1.0) * 0.5;
    *pxi = 0.0;
    n2 = np / 2;  
    *(pxr+n2) = -0.5;
    *(pxi+n2) =  0.0;
    for (i = 1; i <= npm; i++) {
      j = np - i;
      *(pxr+i) = -0.5;
      *(pxr+j) = -0.5;
      z = t * (double)i;  
      y = -0.5*(cos(z)/sin(z));
      *(pxi+i) =  y;
      *(pxi+j) = -y;
    }
    dfft(xr,xi,np);
  }
  zr = 0.0; 
  zi = 0.0; 
  npm = np-1;
  for (i = 0; i <= npm; i++ ) {
    a = fabs(pxr[i] - i);
    if (zr < a) zr = a;
    a = fabs(pxi[i]);
    if (zi < a) zi = a;
  }
  zm = zr;
  if (zr < zi) zm = zi;
  printf("%d points, %s\n", np, zm < 1e-9 ? "result OK" : "WRONG result");
  return 0;
}
Exemplo n.º 2
0
int main(int argc, char* argv[])
{
int i,j,np,npm,lp,n2,kr,ki;
double *pxr,*pxi;
double a,enp,t,y,zr,zi,zm;

np  = 8;
pxr = xr;
pxi = xi;

	printf("\nFFT benchmark - Double Precision - V1.0 -  05 Jan 1993\n\n");
	printf("FFT size   max error\n");

	for (lp = 1; lp <= 15; lp++ )
	{ 
	  np = np * 2; 
	  printf(" %7d ",np);
	  enp = np; 
	  npm = np / 2  - 1;  
	  t = PI / enp;
	  pxr[0] = (enp - 1.0) * 0.5;
	  pxi[0] = 0.0;
	  n2 = np / 2;  
	  pxr[n2] = -0.5;
	  pxi[n2] =  0.0;
	  
	  for (i = 1; i <= npm; i++) 
	  {
		j = np - i;
		pxr[i] = -0.5;
		pxr[j] = -0.5;
		y = t * (double)i;  
		y = -0.5*(cos(y)/sin(y));
		pxi[i] =  y;
		pxi[j] = -y;
	  }
	  
	  dfft(xr,xi,np);
/*
	  for (i=0; i<=15; i++) printf("%d  %g  %g\n",i,xr[i],xi[i]);
*/
	  zr = 0.0; 
	  zi = 0.0; 
	  kr = 0; 
	  ki = 0; 
	  npm = np-1;
	  for (i = 0; i <= npm; i++ ) 
	  { 
		a = fabs( xr[i] - i );
		if (zr < a) 
		{ 
		 zr = a; 
		 kr = i; 
		}
		
		a = fabs(xi[i]);
		if (zi < a) 
		{ 
		 zi = a; 
		 ki = i; 
		}
	  }
	  zm = zr;
	  if ( fabs(zr) < fabs(zi) ) zm = zi;
	  printf(" %10.2g\n",zm);

/*
	  printf("re %7d  %10.2g  im %7d  %10.2g\n",kr,zr,ki,zi);
*/
	}

	return 0;
}