Exemple #1
0
void convo2d()
{
	/*ID FFT Row wise*/
	for (i = 0; i<MAXN; i++)
	{
		fft1d(data1[i], MAXN, -1);
		fft1d(data2[i], MAXN, -1);
	}

	/*Transpose*/
	for (i = 0; i < MAXN; i++)
	{
		for (j = i; j < MAXN; j++)
		{
			C_SWAP(data1[i][j], data1[j][i]);
			C_SWAP(data2[i][j], data2[j][i]);
		}
	}

	/*1D FFT Row wise (Transposed Column)*/
	for (i = 0; i<MAXN; i++)
	{
		fft1d(data1[i], MAXN, -1);
		fft1d(data2[i], MAXN, -1);
	}
	
	/*Point Multiplication*/
	for (i = 0; i < MAXN; i++)
	{
		for (j = 0; j < MAXN; j++)
		{
			data3[i][j].r = data1[i][j].r * data2[i][j].r - data1[i][j].i * data2[i][j].i;
			data3[i][j].i = data1[i][j].r * data2[i][j].i + data1[i][j].i * data2[i][j].r;
		}
	}
	
	/*1D IFFT Row wise*/
	for (i = 0; i<MAXN; i++)
	{
		fft1d(data3[i], MAXN, 1);
	}
	
	/*Transpose*/
	for (j = 0; j < MAXN; j++)
	{
		for (i = j; i < MAXN; i++)
		{
			C_SWAP(data3[i][j], data3[j][i]);
		}
	}

	/*1D IFFT Row wise (Transposed Column)*/
	for (i = 0; i<MAXN; i++)
	{
		fft1d(data3[i], MAXN, 1);
	}
}
Exemple #2
0
void c_vector_swap(c_pvector thiz, c_pvector V)
{
	c_vector tmp;
	C_SWAP(*thiz, *V, tmp);
}
Exemple #3
0
void c_fft1d(complex *r, int      n, int      isign)
{
   int     m,i,i1,j,k,i2,l,l1,l2;
   float   c1,c2,z;
   complex t, u;

   if (isign == 0) return;

   /* Do the bit reversal */
   i2 = n >> 1;
   j = 0;
   for (i=0;i<n-1;i++) {
      if (i < j)
         C_SWAP(r[i], r[j]);
      k = i2;
      while (k <= j) {
         j -= k;
         k >>= 1;
      }
      j += k;
   }

   /* m = (int) log2((double)n); */
   for (i=n,m=0; i>1; m++,i/=2);

   /* Compute the FFT */
   c1 = -1.0;
   c2 =  0.0;
   l2 =  1;
   for (l=0;l<m;l++) {
      l1   = l2;
      l2 <<= 1;
      u.r = 1.0;
      u.i = 0.0;
      for (j=0;j<l1;j++) {
         for (i=j;i<n;i+=l2) {
            i1 = i + l1;

            /* t = u * r[i1] */
            t.r = u.r * r[i1].r - u.i * r[i1].i;
            t.i = u.r * r[i1].i + u.i * r[i1].r;

            /* r[i1] = r[i] - t */
            r[i1].r = r[i].r - t.r;
            r[i1].i = r[i].i - t.i;

            /* r[i] = r[i] + t */
            r[i].r += t.r;
            r[i].i += t.i;
         }
         z =  u.r * c1 - u.i * c2;

         u.i = u.r * c2 + u.i * c1;
         u.r = z;
      }
      c2 = sqrt((1.0 - c1) / 2.0);
      if (isign == -1) /* FWD FFT */
         c2 = -c2;
      c1 = sqrt((1.0 + c1) / 2.0);
   }

   /* Scaling for inverse transform */
   if (isign == 1) {       /* IFFT*/
      for (i=0;i<n;i++) {
         r[i].r /= n;
         r[i].i /= n;
      }
   }
}