示例#1
0
文件: fft.c 项目: Ntools/fft-lib-0.1
void fft2x(Complex a[], int n, int nmax, int flag)
{
	int i, iter, j, k;
	Complex *p, *w;

	if(n < 2)
	{
		fprintf(stderr, "Error : Illegal parameter in fft2()\n");
		return;
	}
	iter = 0;
	i = n;
	while((i /= 2) != 0)	iter++;
	j = 1;
	for(i = 1; i <= iter; i++)	j *= 2;
	if(n != j)
	{
		fprintf(stderr, "Error : n != 2 ^ k  in fft2x()\n");
		return;
	}
	w = (Complex *)malloc(n * sizeof(Complex));
	if(w == NULL)
	{
		fprintf(stderr, "Error : Out of memory  in fft2x()\n");
		return;
	}

	for(j = 0; j < n; j++, k += nmax)
	{
		for(i = 0, p = a + j; i < n; i++, p += nmax)	*(w + i) = *p;
		fft1x(w, n, iter, flag);
		for(i = 0, p = a + j; i < n; i++, p += nmax)	*p = *(w + i);
	}
	for(i = k = 0; i < n; i++, k += nmax)
	{
		for(j = 0, p = a + k; j < n; j++)	*(w + j) = *p++;
		fft1x(w, n, iter, flag);
		for(j = 0, p = a + k; j < n; j++)	*p++ = *(w + j);
	}
	free((char *)w);
	return;
}
示例#2
0
文件: test.c 项目: rennone/Cpp
int main(void)
{
	static double ar[8] = { 0., 0., 0., 1., 1., 0., 0., 0.};
	static double ai[8] = { 0., 0., 0., 0., 0., 0., 0., 0.};
	static double ar2[16] = { 0., 0., 0., 0., 0., 1., 1., 0.,
							  0., 1., 1., 0., 0., 0., 0., 0.};
	static double ai2[16] = { 0., 0., 0., 0., 0., 0., 0., 0.,
							  0., 0., 0., 0., 0., 0., 0., 0.};
	Complex a[8], a2[16];
	int flag, i, iter, j, k, n, nmax;

	iter = 0;
	n = 8;
#ifndef CPX
	for(i = 0; i < n; i++)
          a[i] = tocomplex(ar[i], ai[i]);
	print(ar, ai, n);
#else
	printx(a, n);
#endif

/* forward FFT */
	flag = 0;
#ifndef CPX
	fft1(ar, ai, n, iter, flag);
	print(ar, ai, n);
#else
	fft1x(a, n, iter, flag);
	printx(a, n);
#endif

/* reverse FFT */
	flag = 1;
#ifndef CPX
	fft1(ar, ai, n, iter, flag);
	print(ar, ai, n);
#else
	fft1x(a, n, iter, flag);
	printx(a, n);
#endif
	n = nmax = 4;
	for(i = k = 0; i < n; i++)
          for(j = 0; j < n; j++, k++)
            a2[k] = tocomplex(ar2[k], ai2[k]);
#ifndef CPX
	print2(ar2, ai2, n, nmax);
#else
	print2x(a2, n, nmax);
#endif
	flag = 0;
#ifndef CPX
	fft2(ar2, ai2, n, nmax, flag);
	print2(ar2, ai2, n, nmax);
#else
	fft2x(a2, n, nmax, flag);
	print2x(a2, n, nmax);
#endif
	flag = 1;
#ifndef CPX
	fft2(ar2, ai2, n, nmax, flag);
	print2(ar2, ai2, n, nmax);
#else
	fft2x(a2, n, nmax, flag);
	print2x(a2, n, nmax);
#endif
	return 1;
}