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()