/* Sin/Cos function generated automatically by gen_sincos_table.pl */

#include "xparameters.h"
#include "stdio.h"

short sintab[512] = {
	0,	50,	100,	150,	200,	251,	301,	351,	401,	451,
	501,	551,	601,	650,	700,	749,	799,	848,	897,	946,
	995,	1043,	1092,	1140,	1189,	1237,	1284,	1332,	1379,	1427,
	1474,	1520,	1567,	1613,	1659,	1705,	1751,	1796,	1841,	1886,
	1930,	1975,	2018,	2062,	2105,	2148,	2191,	2233,	2275,	2317,
	2358,	2399,	2439,	2480,	2519,	2559,	2598,	2637,	2675,	2713,
	2750,	2787,	2824,	2860,	2896,	2931,	2966,	3000,	3034,	3068,
	3101,	3134,	3166,	3197,	3229,	3259,	3289,	3319,	3348,	3377,
	3405,	3433,	3460,	3487,	3513,	3538,	3563,	3588,	3612,	3635,
	3658,	3680,	3702,	3723,	3744,	3764,	3784,	3803,	3821,	3839,
	3856,	3873,	3889,	3904,	3919,	3933,	3947,	3960,	3973,	3985,
	3996,	4007,	4017,	4026,	4035,	4043,	4051,	4058,	4065,	4071,
	4076,	4080,	4084,	4088,	4091,	4093,	4094,	4095,	4096,	4095,
	4094,	4093,	4091,	4088,	4084,	4080,	4076,	4071,	4065,	4058,
	4051,	4043,	4035,	4026,	4017,	4007,	3996,	3985,	3973,	3960,
	3947,	3933,	3919,	3904,	3889,	3873,	3856,	3839,	3821,	3803,
	3784,	3764,	3744,	3723,	3702,	3680,	3658,	3635,	3612,	3588,
	3563,	3538,	3513,	3487,	3460,	3433,	3405,	3377,	3348,	3319,
	3289,	3259,	3229,	3197,	3166,	3134,	3101,	3068,	3034,	3000,
	2966,	2931,	2896,	2860,	2824,	2787,	2750,	2713,	2675,	2637,
	2598,	2559,	2519,	2480,	2439,	2399,	2358,	2317,	2275,	2233,
	2191,	2148,	2105,	2062,	2018,	1975,	1930,	1886,	1841,	1796,
	1751,	1705,	1659,	1613,	1567,	1520,	1474,	1427,	1379,	1332,
	1284,	1237,	1189,	1140,	1092,	1043,	995,	946,	897,	848,
	799,	749,	700,	650,	601,	551,	501,	451,	401,	351,
	301,	251,	200,	150,	100,	50,	0,	-50,	-100,	-150,
	-200,	-251,	-301,	-351,	-401,	-451,	-501,	-551,	-601,	-650,
	-700,	-749,	-799,	-848,	-897,	-946,	-995,	-1043,	-1092,	-1140,
	-1189,	-1237,	-1284,	-1332,	-1379,	-1427,	-1474,	-1520,	-1567,	-1613,
	-1659,	-1705,	-1751,	-1796,	-1841,	-1886,	-1930,	-1975,	-2018,	-2062,
	-2105,	-2148,	-2191,	-2233,	-2275,	-2317,	-2358,	-2399,	-2439,	-2480,
	-2519,	-2559,	-2598,	-2637,	-2675,	-2713,	-2750,	-2787,	-2824,	-2860,
	-2896,	-2931,	-2966,	-3000,	-3034,	-3068,	-3101,	-3134,	-3166,	-3197,
	-3229,	-3259,	-3289,	-3319,	-3348,	-3377,	-3405,	-3433,	-3460,	-3487,
	-3513,	-3538,	-3563,	-3588,	-3612,	-3635,	-3658,	-3680,	-3702,	-3723,
	-3744,	-3764,	-3784,	-3803,	-3821,	-3839,	-3856,	-3873,	-3889,	-3904,
	-3919,	-3933,	-3947,	-3960,	-3973,	-3985,	-3996,	-4007,	-4017,	-4026,
	-4035,	-4043,	-4051,	-4058,	-4065,	-4071,	-4076,	-4080,	-4084,	-4088,
	-4091,	-4093,	-4094,	-4095,	-4096,	-4095,	-4094,	-4093,	-4091,	-4088,
	-4084,	-4080,	-4076,	-4071,	-4065,	-4058,	-4051,	-4043,	-4035,	-4026,
	-4017,	-4007,	-3996,	-3985,	-3973,	-3960,	-3947,	-3933,	-3919,	-3904,
	-3889,	-3873,	-3856,	-3839,	-3821,	-3803,	-3784,	-3764,	-3744,	-3723,
	-3702,	-3680,	-3658,	-3635,	-3612,	-3588,	-3563,	-3538,	-3513,	-3487,
	-3460,	-3433,	-3405,	-3377,	-3348,	-3319,	-3289,	-3259,	-3229,	-3197,
	-3166,	-3134,	-3101,	-3068,	-3034,	-3000,	-2966,	-2931,	-2896,	-2860,
	-2824,	-2787,	-2750,	-2713,	-2675,	-2637,	-2598,	-2559,	-2519,	-2480,
	-2439,	-2399,	-2358,	-2317,	-2275,	-2233,	-2191,	-2148,	-2105,	-2062,
	-2018,	-1975,	-1930,	-1886,	-1841,	-1796,	-1751,	-1705,	-1659,	-1613,
	-1567,	-1520,	-1474,	-1427,	-1379,	-1332,	-1284,	-1237,	-1189,	-1140,
	-1092,	-1043,	-995,	-946,	-897,	-848,	-799,	-749,	-700,	-650,
	-601,	-551,	-501,	-451,	-401,	-351,	-301,	-251,	-200,	-150,
	-100,	-50};

short costab[512] = {
	4096,	4095,	4094,	4093,	4091,	4088,	4084,	4080,	4076,	4071,
	4065,	4058,	4051,	4043,	4035,	4026,	4017,	4007,	3996,	3985,
	3973,	3960,	3947,	3933,	3919,	3904,	3889,	3873,	3856,	3839,
	3821,	3803,	3784,	3764,	3744,	3723,	3702,	3680,	3658,	3635,
	3612,	3588,	3563,	3538,	3513,	3487,	3460,	3433,	3405,	3377,
	3348,	3319,	3289,	3259,	3229,	3197,	3166,	3134,	3101,	3068,
	3034,	3000,	2966,	2931,	2896,	2860,	2824,	2787,	2750,	2713,
	2675,	2637,	2598,	2559,	2519,	2480,	2439,	2399,	2358,	2317,
	2275,	2233,	2191,	2148,	2105,	2062,	2018,	1975,	1930,	1886,
	1841,	1796,	1751,	1705,	1659,	1613,	1567,	1520,	1474,	1427,
	1379,	1332,	1284,	1237,	1189,	1140,	1092,	1043,	995,	946,
	897,	848,	799,	749,	700,	650,	601,	551,	501,	451,
	401,	351,	301,	251,	200,	150,	100,	50,	0,	-50,
	-100,	-150,	-200,	-251,	-301,	-351,	-401,	-451,	-501,	-551,
	-601,	-650,	-700,	-749,	-799,	-848,	-897,	-946,	-995,	-1043,
	-1092,	-1140,	-1189,	-1237,	-1284,	-1332,	-1379,	-1427,	-1474,	-1520,
	-1567,	-1613,	-1659,	-1705,	-1751,	-1796,	-1841,	-1886,	-1930,	-1975,
	-2018,	-2062,	-2105,	-2148,	-2191,	-2233,	-2275,	-2317,	-2358,	-2399,
	-2439,	-2480,	-2519,	-2559,	-2598,	-2637,	-2675,	-2713,	-2750,	-2787,
	-2824,	-2860,	-2896,	-2931,	-2966,	-3000,	-3034,	-3068,	-3101,	-3134,
	-3166,	-3197,	-3229,	-3259,	-3289,	-3319,	-3348,	-3377,	-3405,	-3433,
	-3460,	-3487,	-3513,	-3538,	-3563,	-3588,	-3612,	-3635,	-3658,	-3680,
	-3702,	-3723,	-3744,	-3764,	-3784,	-3803,	-3821,	-3839,	-3856,	-3873,
	-3889,	-3904,	-3919,	-3933,	-3947,	-3960,	-3973,	-3985,	-3996,	-4007,
	-4017,	-4026,	-4035,	-4043,	-4051,	-4058,	-4065,	-4071,	-4076,	-4080,
	-4084,	-4088,	-4091,	-4093,	-4094,	-4095,	-4096,	-4095,	-4094,	-4093,
	-4091,	-4088,	-4084,	-4080,	-4076,	-4071,	-4065,	-4058,	-4051,	-4043,
	-4035,	-4026,	-4017,	-4007,	-3996,	-3985,	-3973,	-3960,	-3947,	-3933,
	-3919,	-3904,	-3889,	-3873,	-3856,	-3839,	-3821,	-3803,	-3784,	-3764,
	-3744,	-3723,	-3702,	-3680,	-3658,	-3635,	-3612,	-3588,	-3563,	-3538,
	-3513,	-3487,	-3460,	-3433,	-3405,	-3377,	-3348,	-3319,	-3289,	-3259,
	-3229,	-3197,	-3166,	-3134,	-3101,	-3068,	-3034,	-3000,	-2966,	-2931,
	-2896,	-2860,	-2824,	-2787,	-2750,	-2713,	-2675,	-2637,	-2598,	-2559,
	-2519,	-2480,	-2439,	-2399,	-2358,	-2317,	-2275,	-2233,	-2191,	-2148,
	-2105,	-2062,	-2018,	-1975,	-1930,	-1886,	-1841,	-1796,	-1751,	-1705,
	-1659,	-1613,	-1567,	-1520,	-1474,	-1427,	-1379,	-1332,	-1284,	-1237,
	-1189,	-1140,	-1092,	-1043,	-995,	-946,	-897,	-848,	-799,	-749,
	-700,	-650,	-601,	-551,	-501,	-451,	-401,	-351,	-301,	-251,
	-200,	-150,	-100,	-50,	0,	50,	100,	150,	200,	251,
	301,	351,	401,	451,	501,	551,	601,	650,	700,	749,
	799,	848,	897,	946,	995,	1043,	1092,	1140,	1189,	1237,
	1284,	1332,	1379,	1427,	1474,	1520,	1567,	1613,	1659,	1705,
	1751,	1796,	1841,	1886,	1930,	1975,	2018,	2062,	2105,	2148,
	2191,	2233,	2275,	2317,	2358,	2399,	2439,	2480,	2519,	2559,
	2598,	2637,	2675,	2713,	2750,	2787,	2824,	2860,	2896,	2931,
	2966,	3000,	3034,	3068,	3101,	3134,	3166,	3197,	3229,	3259,
	3289,	3319,	3348,	3377,	3405,	3433,	3460,	3487,	3513,	3538,
	3563,	3588,	3612,	3635,	3658,	3680,	3702,	3723,	3744,	3764,
	3784,	3803,	3821,	3839,	3856,	3873,	3889,	3904,	3919,	3933,
	3947,	3960,	3973,	3985,	3996,	4007,	4017,	4026,	4035,	4043,
	4051,	4058,	4065,	4071,	4076,	4080,	4084,	4088,	4091,	4093,
	4094,	4095};

short GetSin(index)
   int index;
   {
   index = 0x01FF & index;
   return sintab[index];
   }

short GetCos(index)
   int index;
   {
   index = 0x01FF & index;
   return costab[index];
   }

int main (void)
   {
   int i, j, num_pts, y_data[512];
   int real[256], imag[256]; 

/* Read the stream of 8 bit integers from the serial port from LABVIEW. */

   scanf("%d", &num_pts);
   for ( i = 0; i < num_pts; i++ )
      scanf("%d", &y_data[i]);
   
/* Compute the discrete fourier transform -- see lab description for details */

/* number of freqs 1/2 num time domain pts */
   for ( j = 0; j < num_pts/2; j++ ) 
      {
      real[j] = 0;
      imag[j] = 0;
      for ( i = 0; i < num_pts; i++ ) 
         {
         real[j] += y_data[i]*GetCos(i*j); 
         imag[j] += y_data[i]*GetSin(i*j); 
         }
      }

/* Write the real and imag parts back to labview for conversion to floating point
 * and then to mag and phase */

   printf("%d\n", num_pts);
   for ( i = 0; i < num_pts/2; i++ )
      printf("%d\n", real[i]);
   for ( i = 0; i < num_pts/2; i++ )
      printf("%d\n", imag[i]);

   return(0);
   }
