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的时间有问题。。。。。误差很大。。。。。

Other Parts Discussed in Thread: CONTROLSUITE

问题描述:我用的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
}
  • 库和程序应该都没有问题, 有问题的是

    1. 处理器主频

    2. 编译器优化

  • 您好,我最近也在做FFT,我使用和您一样的例程,开始用256点,结果没问题,如下图

    但是用512点,出现下面结果,虽然峰值对,但是不是FFT幅值应该的对称形式,请问你当时遇到这样的问题了吗?希望能从你的调试中吸取一些宝贵的经验,谢谢!!!

  • 你们这个库从哪里找到的,能不能有详细路径?小弟求指教啊