问题描述:我用的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*/ #defineN128 // 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 = 0x0003B0RAML0: origin = 0x008000, length = 0x001000RAML1: origin = 0x009000, length = 0x001000ZONE7A: 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 = 0x000009RESET: origin = 0x3FFFC0, length = 0x000002IQTABLES: origin = 0x3FE000, length = 0x000b50IQTABLES2 : origin = 0x3FEB50, length = 0x00008cFPUTABLES : origin = 0x3FEBDC, length = 0x0006A0BOOTROM: origin = 0x3FF27C, length = 0x000D44 PAGE 1 :RAMM1: origin = 0x000400, length = 0x000400/* on-chip RAM block M1 */RAML2: origin = 0x00A000, length = 0x000400RAML3: origin = 0x00A400, length = 0x001000RAML4: origin = 0x00B400, length = 0x001800RAML5: origin = 0x00CC00, length = 0x001000RAML61: origin = 0x00DC00, length = 0x001000RAML62: origin = 0x00EC00, length = 0x001000RAML7: origin = 0x00FC00, length = 0x000400ZONE7B: 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 = 0ramfuncs: > 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 = 1FFTtf > RAML4,PAGE = 1DLOG > RAML5, PAGE = 1FFTipcb : { } >RAML61 PAGE 1FFTipcbsrc> RAML62 PAGE 1SINTBL : > RAML7, PAGE = 1IQmath: > RAML1,PAGE = 0IQmathTables: > 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 therelevant IQ Math table in Boot ROM (This saves space and Boot ROMis 1 wait-state). If this section is not uncommented, IQmathTables2will be loaded into other memory (SARAM, Flash, etc.) and will takeup space, but 0 wait-state is possible.*//*IQmathTables2: > IQTABLES2, PAGE = 0, TYPE = NOLOAD{IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)}*/FPUmathTables: > FPUTABLES, PAGE = 0, TYPE = NOLOADDMARAML4: > RAML4,PAGE = 1DMARAML5: > RAML5,PAGE = 1DMARAML6: > RAML61,PAGE = 1DMARAML7: > RAML7,PAGE = 1ZONE7DATA: > ZONE7B,PAGE = 1.reset: > RESET,PAGE = 0, TYPE = DSECT /* not used*/csm_rsvd: > CSM_RSVDPAGE = 0, TYPE = DSECT /* not used for SARAM examples */csmpasswds: > CSM_PWLPAGE = 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 }
user151383853:
库和程序应该都没有问题, 有问题的是
1. 处理器主频
2. 编译器优化
问题描述:我用的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*/ #defineN128 // 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 = 0x0003B0RAML0: origin = 0x008000, length = 0x001000RAML1: origin = 0x009000, length = 0x001000ZONE7A: 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 = 0x000009RESET: origin = 0x3FFFC0, length = 0x000002IQTABLES: origin = 0x3FE000, length = 0x000b50IQTABLES2 : origin = 0x3FEB50, length = 0x00008cFPUTABLES : origin = 0x3FEBDC, length = 0x0006A0BOOTROM: origin = 0x3FF27C, length = 0x000D44 PAGE 1 :RAMM1: origin = 0x000400, length = 0x000400/* on-chip RAM block M1 */RAML2: origin = 0x00A000, length = 0x000400RAML3: origin = 0x00A400, length = 0x001000RAML4: origin = 0x00B400, length = 0x001800RAML5: origin = 0x00CC00, length = 0x001000RAML61: origin = 0x00DC00, length = 0x001000RAML62: origin = 0x00EC00, length = 0x001000RAML7: origin = 0x00FC00, length = 0x000400ZONE7B: 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 = 0ramfuncs: > 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 = 1FFTtf > RAML4,PAGE = 1DLOG > RAML5, PAGE = 1FFTipcb : { } >RAML61 PAGE 1FFTipcbsrc> RAML62 PAGE 1SINTBL : > RAML7, PAGE = 1IQmath: > RAML1,PAGE = 0IQmathTables: > 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 therelevant IQ Math table in Boot ROM (This saves space and Boot ROMis 1 wait-state). If this section is not uncommented, IQmathTables2will be loaded into other memory (SARAM, Flash, etc.) and will takeup space, but 0 wait-state is possible.*//*IQmathTables2: > IQTABLES2, PAGE = 0, TYPE = NOLOAD{IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)}*/FPUmathTables: > FPUTABLES, PAGE = 0, TYPE = NOLOADDMARAML4: > RAML4,PAGE = 1DMARAML5: > RAML5,PAGE = 1DMARAML6: > RAML61,PAGE = 1DMARAML7: > RAML7,PAGE = 1ZONE7DATA: > ZONE7B,PAGE = 1.reset: > RESET,PAGE = 0, TYPE = DSECT /* not used*/csm_rsvd: > CSM_RSVDPAGE = 0, TYPE = DSECT /* not used for SARAM examples */csmpasswds: > CSM_PWLPAGE = 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 }
Bruce_旋:
您好,我最近也在做FFT,我使用和您一样的例程,开始用256点,结果没问题,如下图
但是用512点,出现下面结果,虽然峰值对,但是不是FFT幅值应该的对称形式,请问你当时遇到这样的问题了吗?希望能从你的调试中吸取一些宝贵的经验,谢谢!!!
问题描述:我用的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*/ #defineN128 // 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 = 0x0003B0RAML0: origin = 0x008000, length = 0x001000RAML1: origin = 0x009000, length = 0x001000ZONE7A: 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 = 0x000009RESET: origin = 0x3FFFC0, length = 0x000002IQTABLES: origin = 0x3FE000, length = 0x000b50IQTABLES2 : origin = 0x3FEB50, length = 0x00008cFPUTABLES : origin = 0x3FEBDC, length = 0x0006A0BOOTROM: origin = 0x3FF27C, length = 0x000D44 PAGE 1 :RAMM1: origin = 0x000400, length = 0x000400/* on-chip RAM block M1 */RAML2: origin = 0x00A000, length = 0x000400RAML3: origin = 0x00A400, length = 0x001000RAML4: origin = 0x00B400, length = 0x001800RAML5: origin = 0x00CC00, length = 0x001000RAML61: origin = 0x00DC00, length = 0x001000RAML62: origin = 0x00EC00, length = 0x001000RAML7: origin = 0x00FC00, length = 0x000400ZONE7B: 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 = 0ramfuncs: > 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 = 1FFTtf > RAML4,PAGE = 1DLOG > RAML5, PAGE = 1FFTipcb : { } >RAML61 PAGE 1FFTipcbsrc> RAML62 PAGE 1SINTBL : > RAML7, PAGE = 1IQmath: > RAML1,PAGE = 0IQmathTables: > 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 therelevant IQ Math table in Boot ROM (This saves space and Boot ROMis 1 wait-state). If this section is not uncommented, IQmathTables2will be loaded into other memory (SARAM, Flash, etc.) and will takeup space, but 0 wait-state is possible.*//*IQmathTables2: > IQTABLES2, PAGE = 0, TYPE = NOLOAD{IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)}*/FPUmathTables: > FPUTABLES, PAGE = 0, TYPE = NOLOADDMARAML4: > RAML4,PAGE = 1DMARAML5: > RAML5,PAGE = 1DMARAML6: > RAML61,PAGE = 1DMARAML7: > RAML7,PAGE = 1ZONE7DATA: > ZONE7B,PAGE = 1.reset: > RESET,PAGE = 0, TYPE = DSECT /* not used*/csm_rsvd: > CSM_RSVDPAGE = 0, TYPE = DSECT /* not used for SARAM examples */csmpasswds: > CSM_PWLPAGE = 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 }
Yuqiao Hu:
回复 Bruce_旋:
你们这个库从哪里找到的,能不能有详细路径?小弟求指教啊