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.
问题描述:我用的TI官方给的controlSUITE里面的定点库例程计算实数FFT,板子是hellodsp28335开发板。用TI例程做定点实数FFT时候,256点,结果是对的,但是时间比官方给的时间长很多。
第一步:RFFT32_brev(ipcbsrc, ipcb, N); /* real FFT bit reversing */
这一步的时间跟官网的一致,均为1819 cycles
第二步:fft.calc(&fft); /* Compute the FFT */
官网是14756 cycles,我是25897 cycles,基本上等于官网给的256点复数FFT的时间了25901 cycles
cmd文件也是TI给的,没做改动,有人遇到过这样的问题么?请高手解答
还有:我发现TI在做定点FFT的时候,复数FFT和实数FFT调用的都是同一个函数:fft.calc(&fft);也就是用的同一个asm文件,FFT32_calc.asm,而且也只有这一个asm文件。虽然初始化的时候分别用了CFFT32,和RFFT32。难道我理解地不深入?请高手解答。
#include "DSP28x_Project.h" #include <fft.h> #include "math.h" #include "float.h" /* Create an Instance of FFT module */ #define N 128 // FFT size #pragma DATA_SECTION(ipcb, "FFTipcb"); // Input/output memory allocation #pragma DATA_SECTION(ipcbsrc, "FFTipcbsrc"); long ipcbsrc[N]; long ipcb[2*N]; float mag[N]; RFFT32 fft=RFFT32_128P_DEFAULTS; // Header structure definition /* Define window Co-efficient Array and place the .constant section in ROM memory */ const long win[N/2]=HAMMING32; // Select window, not used in this example int xn,yn; float RadStep = 0.1963495408494f; // Simulated signal generation parameter float Rad = 0.0f; // Initial value of Radstep void main() { unsigned long i; InitSysCtrl(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM // Generate sample waveforms: Rad = 0.0f; //Clean up input/output buffer for(i=0; i < (N*2); i=i+2) { ipcb[i] =0; ipcb[i+1] = 0; } //Simulated input signal for(i=0; i < N; i++) { ipcbsrc[i] =(long)(2147483648*(sin(Rad) + cos(Rad*2.3567))/2); //Q31 Rad = Rad + RadStep; } /*--------------------------------------------------------------------------- FFT Calculation ----------------------------------------------------------------------------*/ RFFT32_brev(ipcbsrc, ipcb, N); /* real FFT bit reversing */ fft.ipcbptr=ipcb; /* FFT computation buffer */ fft.magptr=ipcbsrc; /* Magnitude output buffer */ // fft.winptr=(long *)win; /* Window coefficient array */ fft.init(&fft); /* Twiddle factor pointer initialization */ fft.calc(&fft); /* Compute the FFT */ fft.mag(&fft); /* Q31 format (abs(ipcbsrc)/2^16).^2 */ for(i=0; i < N; i++) { mag[i] = ((float)ipcbsrc[i])/1073741824; //float(x)/2^30 mag[i] = 2*sqrt(mag[i]); // mag[i] = sqrt(mag[i]); } //asm(" ESTOP0"); for(;;); } /* End: main() */
MEMORY { PAGE 0 : /* BEGIN is used for the "boot to SARAM" bootloader mode */ /* BOOT_RSVD is used by the boot ROM for stack. */ /* This section is only reserved to keep the BOOT ROM from */ /* corrupting this area during the debug process */ BEGIN : origin = 0x000000, length = 0x000002 /* Boot to M0 will go here */ BOOT_RSVD : origin = 0x000002, length = 0x00004E /* Part of M0, BOOT rom will use this for stack */ RAMM0 : origin = 0x000050, length = 0x0003B0 RAML0 : origin = 0x008000, length = 0x001000 RAML1 : origin = 0x009000, length = 0x001000 ZONE7A : origin = 0x200000, length = 0x00FC00 /* XINTF zone 7 - program space */ CSM_RSVD : origin = 0x33FF80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */ CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */ ADC_CAL : origin = 0x380080, length = 0x000009 RESET : origin = 0x3FFFC0, length = 0x000002 IQTABLES : origin = 0x3FE000, length = 0x000b50 IQTABLES2 : origin = 0x3FEB50, length = 0x00008c FPUTABLES : origin = 0x3FEBDC, length = 0x0006A0 BOOTROM : origin = 0x3FF27C, length = 0x000D44 PAGE 1 : RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */ RAML2 : origin = 0x00A000, length = 0x000400 RAML3 : origin = 0x00A400, length = 0x001000 RAML4 : origin = 0x00B400, length = 0x001800 RAML5 : origin = 0x00CC00, length = 0x001000 RAML61 : origin = 0x00DC00, length = 0x001000 RAML62 : origin = 0x00EC00, length = 0x001000 RAML7 : origin = 0x00FC00, length = 0x000400 ZONE7B : origin = 0x20FC00, length = 0x000400 /* XINTF zone 7 - data space */ } SECTIONS { /* Setup for "boot to SARAM" mode: The codestart section (found in DSP28_CodeStartBranch.asm) re-directs execution to the start of user code. */ codestart : > BEGIN, PAGE = 0 ramfuncs : > RAML0, PAGE = 0 .text : > RAML1, PAGE = 0 .cinit : > RAML0, PAGE = 0 .pinit : > RAML0, PAGE = 0 .switch : > RAML0, PAGE = 0 .stack : > RAMM1, PAGE = 1 .ebss : > RAML2, PAGE = 1 .econst : > RAML3, PAGE = 1 .esysmem : > RAMM1, PAGE = 1 FFTtf > RAML4, PAGE = 1 DLOG > RAML5, PAGE = 1 FFTipcb : { } > RAML61 PAGE 1 FFTipcbsrc > RAML62 PAGE 1 SINTBL : > RAML7, PAGE = 1 IQmath : > RAML1, PAGE = 0 IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD /* Uncomment the section below if calling the IQNexp() or IQexp() functions from the IQMath.lib library in order to utilize the relevant IQ Math table in Boot ROM (This saves space and Boot ROM is 1 wait-state). If this section is not uncommented, IQmathTables2 will be loaded into other memory (SARAM, Flash, etc.) and will take up space, but 0 wait-state is possible. */ /* IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD { IQmath.lib<IQNexpTable.obj> (IQmathTablesRam) } */ FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD DMARAML4 : > RAML4, PAGE = 1 DMARAML5 : > RAML5, PAGE = 1 DMARAML6 : > RAML61, PAGE = 1 DMARAML7 : > RAML7, PAGE = 1 ZONE7DATA : > ZONE7B, PAGE = 1 .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used */ csm_rsvd : > CSM_RSVD PAGE = 0, TYPE = DSECT /* not used for SARAM examples */ csmpasswds : > CSM_PWL PAGE = 0, TYPE = DSECT /* not used for SARAM examples */ /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */ .adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD }