Exemple #1
0
void fft_init(){
	fft.InBuf = &sampleBuffer[0];
	fft.OutBuf = &outBuffer[0];
	fft.CosSinBuf = &TwiddleBuffer[0];
	fft.FFTSize = FFT_SIZE;
	fft.FFTStages = FFT_STAGES;
	fft.MagBuf = &MagBuffer[0];
	RFFT_f32_sincostable(&fft);

}
void performFFT()
{
	fft.InBuf = SampleTable; /* Input data buffer */
	fft.OutBuf = OutBuffer; /* FFT output buffer */
	fft.CosSinBuf = TwiddleBuffer; /* Twiddle factor buffer */
	fft.FFTSize = DATA_LENGTH; /* FFT length */
	fft.FFTStages = FFT_STAGES; /* FFT Stages */
	fft.MagBuf = spectraTable; /* Magnitude buffer */
	RFFT_f32_sincostable(&fft); /* Initialize Twiddle Buffer */
	RFFT_f32u(&fft); /* Calculate output */
	RFFT_f32_mag(&fft); /* Calculate magnitude */
}
void main(void)
{
	Uint16	i;

	InitSysCtrl();
	DINT;
	InitPieCtrl();
	IER = 0x0000;
	IFR = 0x0000;
	InitPieVectTable();
	EINT;   // Enable Global interrupt INTM
	ERTM;   // Enable Global realtime interrupt DBGM   

	// Clear input buffers:
	for(i=0; i < RFFT_SIZE; i++)
	{
		RFFTin1Buff[i] = 0.0f;
	}
	
	// Generate sample waveforms:
	Rad = 0.0f;
	for(i=0; i < RFFT_SIZE; i++)
	{
		RFFTin1Buff[i]   = sin(Rad) + cos(Rad*2.3567); //Real input signal
		//FFTImag_in[i] = cos(Rad*8.345) + sin(Rad*5.789);		
		Rad = Rad + RadStep;
	}
   
    rfft.FFTSize   = RFFT_SIZE;
    rfft.FFTStages = RFFT_STAGES;   
    rfft.InBuf     = &RFFTin1Buff[0];  //Input buffer
    rfft.OutBuf    = &RFFToutBuff[0];  //Output buffer
    rfft.CosSinBuf = &RFFTF32Coef[0];  //Twiddle factor buffer
    rfft.MagBuf    = &RFFTmagBuff[0];  //Magnitude buffer

    RFFT_f32_sincostable(&rfft);       //Calculate twiddle factor
 
    for (i=0; i < RFFT_SIZE; i++)
    {
      	RFFToutBuff[i] = 0;			   //Clean up output buffer
    }

    for (i=0; i < RFFT_SIZE/2; i++) 
    {
     	RFFTmagBuff[i] = 0;		       //Clean up magnitude buffer
    }   

    RFFT_f32(&rfft);				   //Calculate real FFT
    
//   OutBuf[0] = real[0]
//   OutBuf[1] = real[1]
//   OutBuf[2] = real[2]
//   ………
//   OutBuf[N/2] = real[N/2]
//   OutBuf[N/2+1] = imag[N/2-1]
//   ………
//   OutBuf[N-3] = imag[3]
//   OutBuf[N-2] = imag[2]
//   OutBuf[N-1] = imag[1]
//    
    
    RFFT_f32_mag(&rfft);				//Calculate magnitude
    
//   MagBuf[0] = magnitude[0]
//   MagBuf[1] = magnitude[1]
//   MagBuf[2] = magnitude[2]
//   ………
//   MagBuf[N/2] = magnitude[N/2]
//   MagBuf[N/2+1] = magnitude[N/2+1]

// 	  rfft.PhaseBuf = &RFFTmagBuff[0];  //Use magnitude buffer  
//    RFFT_f32_phase(&rfft);		   	//Calculate phase

	// Just sit and loop forever (optional):
    for(;;);

} //End of main
/**********************************************************************
* Function: main()
*
* Description: Main function for C2833x Real-time RFFT 
**********************************************************************/
void main(void)
{
	Uint16 i,j;
   	float32 freq;                       // Frequency of single-frequency-component signal
	
//--- CPU Initialization
	InitSysCtrl();						// Initialize the CPU (FILE: SysCtrl.c)
	InitGpio();							// Initialize the shared GPIO pins (FILE: Gpio.c)
	InitPieCtrl();						// Initialize and enable the PIE (FILE: PieCtrl.c)

//--- Peripheral Initialization
	InitAdc();							// Initialize the ADC (FILE: Adc.c)

// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
   	EALLOW;  // This is needed to write to EALLOW protected register
   	PieVectTable.ADCINT = &adc_isr;
   	EDIS;    // This is needed to disable write to EALLOW protected registers

    rfft_adc.Tail = &rfft.OutBuf;				//Link the RFFT_ADC_F32_STRUCT to
   												//RFFT_F32_STRUCT. Tail pointer of 
   												//RFFT_ADC_F32_STRUCT is passed to
   												//the OutBuf pointer of RFFT_F32_STRUCT
    rfft.FFTSize  = RFFT_SIZE;				//Real FFT size
    rfft.FFTStages = RFFT_STAGES;			//Real FFT stages
    rfft_adc.InBuf = &AdcBuf[0];				//Input buffer
    rfft.OutBuf = &RFFToutBuff[0];   			//Output buffer
    rfft.CosSinBuf = &RFFTF32Coef[0];	//Twiddle factor
    rfft.MagBuf = &RFFTmagBuff[0];		//Magnitude output buffer

    RFFT_f32_sincostable(&rfft);  				//Calculate twiddle factor
 
 	//Clean up output buffer
    for (i=0; i < RFFT_SIZE; i++)
    {
    	 RFFToutBuff[i] = 0;
    }
   
   	//Clean up magnitude buffer
    for (i=0; i < RFFT_SIZE/2; i++)
    {
   		 RFFTmagBuff[i] = 0;
    }  

//--- Enable global interrupts
	asm(" CLRC INTM, DBGM");			// Enable global interrupts and realtime debug

//--- Main Loop
	while(1)							// endless loop - wait for an interrupt
	{
		if(FFTStartFlag)				// If one frame data ready, then do FFT
		{
			RFFT_adc_f32u(&rfft_adc);   // This version of FFT doesn't need buffer alignment
			RFFT_f32_mag(&rfft);		// Calculate spectrum amplitude
			
   			j = 1;
   			freq = RFFTmagBuff[1];
   			for(i=2;i<RFFT_SIZE/2+1;i++)
   			{
   				//Looking for the maximum valude of spectrum magnitude
      			if(RFFTmagBuff[i] > freq)
      			{
          			j = i;
          			freq = RFFTmagBuff[i]; 
      			}
   			}
   
   			freq = F_PER_SAMPLE * (float)j;	//Convert normalized digital frequency to analog frequency
   				
			FFTStartFlag = 0;			   	//Start collecting the next frame of data
		}
		asm(" NOP");
	}
} //end of main()