#define NSTAGES 8
#define NSAMPLES 1<<NSTAGES
#define ERR_EPSILON 4
#define ERR_IFFT_EPSILON 143
这些都是什么意思?? 等等 还有buffer1Q15 buffer2Q15 。。。。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
#define NSTAGES 8
#define NSAMPLES 1<<NSTAGES
#define ERR_EPSILON 4
#define ERR_IFFT_EPSILON 143
这些都是什么意思?? 等等 还有buffer1Q15 buffer2Q15 。。。。
#include "vcu2_types.h"
#include "vcu2_fft.h"
#include "examples_setup.h"
//!
//! \addtogroup CFFT_EXAMPLES Complex Fast Fourier Transform (N = 256) Example
// @{
//*****************************************************************************
// defines
//*****************************************************************************
#define NSTAGES 8
#define NSAMPLES 1<<NSTAGES
#define ERR_EPSILON 4
#define ERR_IFFT_EPSILON 143
//*****************************************************************************
// globals
//*****************************************************************************
#ifdef __cplusplus
#pragma DATA_SECTION("buffer1")
#else
#pragma DATA_SECTION(buffer1Q15,"buffer1")
#endif //__cplusplus
// \brief Test Input Data
//
int16_t buffer1Q15[2*NSAMPLES] = {
#include "data_input.h"
};
// \brief Expected Output
//
const int16_t goldenOutputQ15[2*NSAMPLES] = {
#include "data_output.h"
};
// \brief Expected Output of the IFFT
//
const int16_t goldenIfftOutputQ15[2*NSAMPLES] = {
#include "data_input.h"
};
// \brief Error Vector
//
int16_t errorQ15[2*NSAMPLES];
#ifdef __cplusplus
#pragma DATA_SECTION("buffer2")
#else
#pragma DATA_SECTION(buffer2Q15,"buffer2")
#endif
// \brief Test Output Data
//
int16_t buffer2Q15[2*NSAMPLES];
// \brief CFFT Object
//
CFFT_Obj CFFT;
// \brief Handle to the CFFT object
//
CFFT_Handle handleCFFT;
uint16_t pass = 0;
uint16_t fail = 0;
//*****************************************************************************
// Function Prototypes
//*****************************************************************************
//*****************************************************************************
// function definitions
//*****************************************************************************
//!
//! \brief main routine for the 256-sample CFFT example
//! \return returns a 1
//!
//! This example shows how to use the vcu2 supported CFFT routines from the
//! library. The input is placed in a section buffer1 that needs to be
//! aligned to the size of the input in words to allow the bit reverse
//! addressing in stage 1 of the FFT to work properly. The output, however, need
//! not be aligned to any boundary unless it is used as the input to an IFFT
//!
int main( void )
{
// Locals
int16_t i;
int16_t *pTemp;
#ifdef FLASH
EALLOW;
Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0;
memcpy((uint32_t *)&RamfuncsRunStart, (uint32_t *)&RamfuncsLoadStart,
(uint32_t)&RamfuncsLoadSize );
VCU2_initFlash();
#endif //FLASH
VCU2_initSystemClocks();
VCU2_initEpie();
//*************************************************************************
// Running the FFT
//*************************************************************************
//! \b Running \b the \b FFT
//! The user starts by initializing the CFFT Object with the appropriate
//! init() and run().The init() accepts pointers to the input and output
//! buffers and will initialize the other object elements appropriately.
//! For the F28X7x devices, the twiddle factor tables are already present
//! in bootrom.
//! \code
//*************************************************************************
// Step 1: Initialize CFFT object
CFFT.pInBuffer = buffer1Q15;
CFFT.pOutBuffer = buffer2Q15;
CFFT.init = (void (*)(void *))CFFT_init256Pt;
CFFT.run = (void (*)(void *))CFFT_run256Pt;
// Step 2: Initialize the handle
handleCFFT = &CFFT;
// Step 3: Calling the init() will setup the twiddle factor table
CFFT.init(handleCFFT);
CFFT.run(handleCFFT);
//*************************************************************************
//!
//! \endcode
//!
//*************************************************************************
// Step 4: Verify the result
for(i = 0; i < CFFT.nSamples*2; i++){
errorQ15[i] = abs(CFFT.pOutBuffer[i] - goldenOutputQ15[i]);
if( errorQ15[i] > ERR_EPSILON ){
fail++;
}else{
pass++;
}
}
//*************************************************************************
// Running the IFFT
//*************************************************************************
//! \b Running \b the \b IFFT
//! The user need not re-initialize the CFFT object if done before. The user
//! must take that the pInBuffer pointer points to the input. If running through
//! the forward FFT first, as in this example, the pointers pInBuffer and pOutBuffer
//! should be switched first
//! \code
//*************************************************************************
// Step 1: Switch the input and output pointers of the CFFT object
pTemp = CFFT.pInBuffer;
CFFT.pInBuffer = CFFT.pOutBuffer;
CFFT.pOutBuffer = pTemp;
// Step 2: Assign the IFFT function to the run pointer
CFFT.run = (void (*)(void *))ICFFT_run256Pt;
// Step 3: Run the routine
CFFT.run(handleCFFT);
//*************************************************************************
//!
//! \endcode
//!
//*************************************************************************
// Step 4: Verify the result of the IFFT
for(i = 0; i < CFFT.nSamples*2; i++){
errorQ15[i] = abs(CFFT.pOutBuffer[i] - goldenIfftOutputQ15[i]);
if( errorQ15[i] > ERR_IFFT_EPSILON ){
fail++;
}else{
pass++;
}
}
// End of test
done();
// Execution never reaches this point
return 1;
}
// End of main
// @} //addtogroup
// End of file
CFFT是傅里叶变换的函数,vcu是c2000芯片里面的硬件加速器,可以用来更快的运行CFFT算法。
具体可以参考C28X-VCU-LIB-UG文档的说明
您好,请问运行这个例程得到的结果应该是什么呢?
新手求教,谢谢您!
请教一下,VCU的C28X-VCU-LIB-UG文档和.h文件里都只支持到1024点的FFT运算,更多点数的怎么操作?
目前8192与16384点的运算都是自己写程序算的。。。。