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.

[参考译文] 在 TMS320F280025C 上最高效地实现 FFT

Guru**** 2434370 points
Other Parts Discussed in Thread: TMS320F280025, C2000WARE, TMS320F280025C

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1024963/most-efficient-implementation-of-fft-on-tms320f280025c

器件型号:TMS320F280025
主题中讨论的其他器件: C2000WARE

我想在 TMS320F280025控制器上实现64点 FFT 的电网电压。 我计划在50Hz 电网电压的一个周期中获取64个等间隔样本、并计算其 FFT。 该过程应在每个新周期数据上连续运行。 我知道 控制套件中有 DSP 库。 控制器中运行的时间关键型控制代码已经占用了大约70%的控制器带宽。
 在这方面,我有以下问题:
1 - 如果我要使用定点实现或浮点、则将处理时间作为主要性能标准。 我问的原因是该控制器具有一个32位 FPU 单元。
2: 我应该使用复数 FFT 还是实数 FFT 函数? 由于所有数据都来自 ADC 且是真实的、因此 是否有任何理由使用复杂 FFT?   
3-最好为此控制器提供一个链接器命令文件,以便将 FFT 数据块(例如 Twiddle Factors)映射到闪存中。  
4:除了示例项目之外、还有什么文档可以帮助理解 FFT 库函数的使用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Asad、

    [引用 userid="488051" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1024963/most-efficient-implementation-of-fft-on-tms320f280025c 1]1- 如果我要使用定点实现或浮点、则考虑将处理时间作为主要性能标准。 我问的原因是该控制器具有32位 FPU 单元。

    使用定点的64点 RFFT 需要313个周期、使用 FPU 的64位 RFFT 需要1281个周期、因此对于您的用例、我建议使用定点实现。 您可以在 c2000ware 内定点和 FPU DSP 库中的文档中找到详细的基准测试信息。

    [引用 userid="488051" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1024963/most-efficient-implementation-of-fft-on-tms320f280025c 2"- 我应该使用复杂 FFT 或实数 FFT 函数吗? 由于所有数据都来自 ADC 且是真实的、因此 是否有任何理由使用复杂 FFT?   [/报价]

    由于您不处理虚值、因此 RFFT 就足够了。

    [引用 userid="488051" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1024963/most-efficient-implementation-of-fft-on-tms320f280025c 3"-在此控制器中有一个链接器命令文件、用于映射到闪存中的 FFT 数据块(例如旋转因子)、这将是一件很好的事情。  [/报价]

    我们确实为闪存和 RAM 提供了链接器命令文件。 请查看 c2000ware 中提供的相应库和示例以了解更多信息。

    [引用 userid="488051" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1024963/most-efficient-implementation-of-fft-on-tms320f280025c 4"-除示例项目外、是否还有任何文档可帮助您了解 FFT 库函数的使用。

    请参阅 c2000ware 库文件夹中提供的文档。

    希望这对您有所帮助。

    -Shantanu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您为每个问题提供答案。 我对第1、2和4点不再有疑问。 但是、对于第3点、最好提供更多详细信息。 示例文件夹包含2833x 系列的实现。 我将尝试从该控制器的链接器命令文件中获取指南行。 但是、如果28002x 系列有一些包含 IQMath 段和 FFT 段映射的参考链接器命令文件、效果会好得多。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您也可以参考 IQMath 示例。 IQMath 库中提供了链接器 cmd 文件。 只需确保为 FFT 和 IQMath 正确分配表和库。 如果您遇到任何困难、请告诉我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 shanty 非常感谢您的持续支持。 该文档提供了如下示例分配:
    FFTipcb align(256):{}>RAML4,第1页
    FFTipcbsrc:{}>RAML5,第1页
    FFTmag > RAML6、第1页
    FFTtf > RAML7、第1页

    我使用的链接器命令文件是从 TMS320F280025C launchpad 的示例文件中修改的。 在此链接器命令文件中、RAM 扇区组合到单个块中、并已关联到不同的段。 请参阅以下内容:

    存储器

    开始:origin = 0x080000,length = 0x000002
    BOOT_RSVD:origin = 0x00000002,length = 0x00000126
    RAMM0:origin = 0x00000128,length = 0x000002D8
    RAMM1:origin = 0x00000400,length = 0x000003F8 //片上 RAM 块 M1 *
    // RAMM1_RSVD:origin = 0x000007F8,length = 0x00000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超过有效内存的预取),保留并不用于代码*/

    /* RAMLS4:origin = 0x0000A000,length = 0x00000800
    RAMLS5:origin = 0x0000A800,length = 0x00000800
    RAMLS6:origin = 0x0000B000、length = 0x00000800
    RAMLS7:origin = 0x0000B800,length = 0x00000800*/

    /*合并所有 LS RAM */
    RAMLS4567:origin = 0x0000A000,length = 0x00002000
    RAMGS0:origin = 0x0000C000,length = 0x000007F8
    // RAMGS0_RSVD:origin = 0x0000C7F8,length = 0x00000008 //保留并不用于根据勘误咨询“内存:预取超出有效内存”的代码*/


    // FLASHBANK1:origin = 0x00080000,length = 0x0000FFF0
    // flash_bank1_RSVD:origin = 0x0008FFF0,length = 0x00000010 //保留并不用于根据勘误咨询“Memory:pretching Beyond valid Memory”(内存:有效内存之外的预取)*/的代码
    BootROM:origin = 0x003F0000,length = 0x00008000
    BootROM_EXT:origin = 0x003F8000,length = 0x00007FC0
    复位:origin = 0x003FFFC0,length = 0x00000002
    /*闪存扇区*/
    /*组0 */
    FLASH_BANK0_SEC0:origin = 0x080002、length = 0x000FFE //片上闪存*
    FLASH_BANK0_SEC1:origin = 0x081000、length = 0x001000 //片上闪存*
    FLASH_BANK0_sec2:origin = 0x082000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC3:origin = 0x083000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC4:origin = 0x084000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC5:origin = 0x085000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC6_7:origin = 0x086000、length = 0x002000 //片上闪存*
    FLASH_BANK0_SEC8:origin = 0x088000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC9:origin = 0x089000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC10:origin = 0x08A000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC11:origin = 0x08B000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC12:origin = 0x08C000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC13:origin = 0x08D000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC14:origin = 0x08E000、length = 0x001000 //片上闪存*
    FLASH_BANK0_SEC15:origin = 0x08F000、length = 0x000FF0 //片上闪存*
    // flash_BANK0_SEC15_RSVD:origin = 0x08FFF0,length = 0x000010 //根据勘误咨询“Memory: prepetching Beyond valid Memory”(内存:超出有效内存的预取),保留代码且不用于代码*/


    部分

    codestart:>开始,align (8)
    .text:>> flash_BANK0_sec2 | flash_BANK0_SEC3 | flash_BANK0_SEC4 | flash_BANK0_SEC5,align (8)
    .cinit:> flash_BANK0_SEC1,align (8)
    .switch:> FLASH_BANK0_SEC1,ALIGN (8)
    .reset:> reset,type = DSECT /* not used,*/

    .stack:> RAMM1

    init_array:> flash_BANK0_SEC1,align (8)
    .bss:> RAMLS4567
    .bss:输出:> RAMLS4567
    .bss:CIO :>RAMGS0
    .const:> FLASH_BANK0_SEC6_7、ALIGN (8)
    .data:> RAMLS4567
    .sysmem:> RAMLS4567

    RAMS0:> RAMGS0


    /*分配 IQ 数学区域:*/
    IQMath:> FLASH_BANK0_SEC1,PAGE = 0,ALIGN (4)/*数学代码*/
    IQmathTables:> FLASH_BANK0_sec2,PAGE = 0,ALIGN (4)

    .TI.ramfunc:load = flash_BANK0_SEC1,
    运行= RAMGS0、
    Load_start (RamfuncsLoadStart)、
    load_size (RamfuncsLoadSize)、
    Load_End (RamfuncsLoadEnd)、
    RUN_START (RamfuncsRunStart)、
    run_size (RamfuncsRunSize)、
    RUN_END (RamfuncsRunEnd)、
    对齐(8)


    /*
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *

    我对链接器命令文件的修改不太熟悉。 请提供有关如何适应上述链接器命令文件中的 FFT 段的指南。  如果您可以编辑上述链接器文件以进行相同操作、那将非常好。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    你是对的。 您可以按照相同的方式将 FPU FFT 数学表分配到 F28002x 中的 RAMLS4567。  

    但是、如果您想将表(IQMath 或 FFT)分配给闪存、请确保将它们存储到代码中的 RAM 中、如示例所示。  

    -Shantanu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为什么需要将 memcpy IQMath /FFT 连接到 RAM? 是用于快速执行吗? 其次、FFT Twiddle 因素占用闪存的三个扇区。 这对于我的项目来说非常昂贵。 我知道这是由于4096点 FFT Twiddle 因子造成的。  考虑到我将仅使用64点 RFFT、我能否减少它。 如果您可以检查以下链接器命令是否具有正确的分配、将不胜感激

    MEMORY
    {
       BEGIN           	: origin = 0x080000, length = 0x000002
       BOOT_RSVD		: origin = 0x00000002, length = 0x00000126
       RAMM0           	: origin = 0x00000128, length = 0x000002D8
       RAMM1            : origin = 0x00000400, length = 0x000003F8     /* on-chip RAM block M1 */
    // RAMM1_RSVD       : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    /* RAMLS4           : origin = 0x0000A000, length = 0x00000800
       RAMLS5           : origin = 0x0000A800, length = 0x00000800
       RAMLS6           : origin = 0x0000B000, length = 0x00000800
       RAMLS7           : origin = 0x0000B800, length = 0x00000800*/
    
       /* Combining all the LS RAMs */
       RAMLS4567        : origin = 0x0000A000, length = 0x00002000
       RAMGS0           : origin = 0x0000C000, length = 0x000007F8
    // RAMGS0_RSVD      : origin = 0x0000C7F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    
    //  FLASHBANK1       : origin = 0x00080000, length = 0x0000FFF0
    //  FLASH_BANK1_RSVD : origin = 0x0008FFF0, length = 0x00000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       BOOTROM          : origin = 0x003F0000, length = 0x00008000
       BOOTROM_EXT      : origin = 0x003F8000, length = 0x00007FC0
       RESET            : origin = 0x003FFFC0, length = 0x00000002
       /* Flash sectors */
       /* BANK 0 */
       FLASH_BANK0_SEC0  : origin = 0x080002, length = 0x000FFE	/* on-chip Flash */
       FLASH_BANK0_SEC1  : origin = 0x081000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC2  : origin = 0x082000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC3_9  : origin = 0x083000, length = 0x007000	/* on-chip Flash */
       FLASH_BANK0_SEC10_11 : origin = 0x08A000, length = 0x002000	/* on-chip Flash */
       FLASH_BANK0_SEC12_15 : origin = 0x08C000, length = 0x003FF0	/* on-chip Flash */
       // FLASH_BANK0_SEC15_RSVD     : origin = 0x08FFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    }
    
    
    SECTIONS
    {
       codestart        : > BEGIN, ALIGN(8)
       .text            : >> FLASH_BANK0_SEC2 | FLASH_BANK0_SEC3_9 ,   ALIGN(8)
       .cinit           : > FLASH_BANK0_SEC1,  ALIGN(8)
       .switch          : > FLASH_BANK0_SEC1,  ALIGN(8)
       .reset           : > RESET,                  TYPE = DSECT /* not used, */
    
       .stack           : > RAMM1
    
       .init_array      : > FLASH_BANK0_SEC1,  ALIGN(8)
       .bss             : > RAMLS4567
       .bss:output      : > RAMLS4567
       .bss:cio         : > RAMGS0
       .const           : > FLASH_BANK0_SEC10_11,  ALIGN(8)
       .data            : > RAMLS4567
       .sysmem          : > RAMLS4567
    
        ramgs0 : > RAMGS0
    
    
       /* Allocate IQ math areas: */
       IQmath : > FLASH_BANK0_SEC1, PAGE = 0, ALIGN(4) /* Math Code */
       IQmathTables : > FLASH_BANK0_SEC2, PAGE = 0, ALIGN(4)
    
       /* Allocating FFT areas: */
       FFTipcb 		: >> RAMGS0, ALIGN(256) //64 points FFT
       FFTipcbsrc	: >> RAMLS4567
       FFTtf        : > FLASH_BANK0_SEC12_15
    
      .TI.ramfunc      : LOAD = FLASH_BANK0_SEC1,
                      RUN = RAMGS0,
                      LOAD_START(RamfuncsLoadStart),
                      LOAD_SIZE(RamfuncsLoadSize),
                      LOAD_END(RamfuncsLoadEnd),
                      RUN_START(RamfuncsRunStart),
                      RUN_SIZE(RamfuncsRunSize),
                      RUN_END(RamfuncsRunEnd),
                      ALIGN(8)
    
    }
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您还可以使用 ROM 中的 FFT 和 IQMath 表。 如果空间有问题、您无需实际加载它们。 请参考示例中的 RAM_ROMTABLES 配置。 您需要确保包含符号库。 请参阅文档。

    无需在闪存中放置表、但正如示例中指定的、这就是如何完成对闪存的分配:

    FPU64fftTables:load = FLASHB,
    运行= RAMGS2、
    RUN_START (FPU64fftTablesRunStart)、
    Load_start (FPU64fftTablesLoadStart)、
    load_size (FPU64fftTablesLoadSize)、
    PAGE = 1.

    由于您指定从 RAM 运行、因此需要 memcpy、因为存储器访问时间较短。  

    希望 这对您有所帮助。

    -Shantanu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shanty:

     我使用示例代码作为参考来制作一个小代码、用于在 TMS320F280025C 上检查 RFFT。 我的链接器命令文件如下所示:

    MEMORY
    {
       BEGIN           	: origin = 0x080000, length = 0x000002
       BOOT_RSVD		: origin = 0x00000002, length = 0x00000126
       RAMM0           	: origin = 0x00000128, length = 0x000002D8
       RAMM1            : origin = 0x00000400, length = 0x000003F8     /* on-chip RAM block M1 */
    // RAMM1_RSVD       : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    /* RAMLS4           : origin = 0x0000A000, length = 0x00000800
       RAMLS5           : origin = 0x0000A800, length = 0x00000800
       RAMLS6           : origin = 0x0000B000, length = 0x00000800
       RAMLS7           : origin = 0x0000B800, length = 0x00000800*/
    
       /* Combining all the LS RAMs */
       RAMLS4567        : origin = 0x0000A000, length = 0x00002000
       RAMGS0           : origin = 0x0000C000, length = 0x000007F8
    // RAMGS0_RSVD      : origin = 0x0000C7F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    
    //  FLASHBANK1       : origin = 0x00080000, length = 0x0000FFF0
    //  FLASH_BANK1_RSVD : origin = 0x0008FFF0, length = 0x00000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       BOOTROM          : origin = 0x003F0000, length = 0x00008000
       BOOTROM_EXT      : origin = 0x003F8000, length = 0x00007FC0
       RESET            : origin = 0x003FFFC0, length = 0x00000002
       /*IQMath table already exists in the BOOTROM section*/
       //IQTABLES 		: origin = 0x3F1402, length = 0x0166D
       /* Flash sectors */
       /* BANK 0 */
       FLASH_BANK0_SEC0  : origin = 0x080002, length = 0x000FFE	/* on-chip Flash */
       FLASH_BANK0_SEC1  : origin = 0x081000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC2  : origin = 0x082000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC3_9  : origin = 0x083000, length = 0x007000	/* on-chip Flash */
       FLASH_BANK0_SEC10_11 : origin = 0x08A000, length = 0x002000	/* on-chip Flash */
       FLASH_BANK0_SEC12_15 : origin = 0x08C000, length = 0x003FF0	/* on-chip Flash */
       // FLASH_BANK0_SEC15_RSVD     : origin = 0x08FFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    }
    
    
    SECTIONS
    {
       codestart        : > BEGIN, ALIGN(8)
       .text            : >> FLASH_BANK0_SEC2 | FLASH_BANK0_SEC3_9 ,   ALIGN(8)//executable code >> operator splits code
       .cinit           : > FLASH_BANK0_SEC1,  ALIGN(8)//table that initializes global variables
       .switch          : > FLASH_BANK0_SEC1,  ALIGN(8)
       .reset           : > RESET,                  TYPE = DSECT /* not used, Dummy Section*/
    
       .stack           : > RAMM1
    
       .init_array      : > FLASH_BANK0_SEC1,  ALIGN(8)
       .bss             : > RAMLS4567 //uninitialized global variables
       .bss:output      : > RAMLS4567
       .bss:cio         : > RAMGS0
       .const           : > FLASH_BANK0_SEC10_11,  ALIGN(8)
       .data            : > RAMLS4567 //initialized data
       .sysmem          : > RAMLS4567
    
        ramgs0 : > RAMGS0
    
    
       /* Allocate IQ math areas: */
       IQmath : > FLASH_BANK0_SEC1, PAGE = 0, ALIGN(4) /* Math Code */
       //IQmathTables : > FLASH_BANK0_SEC2, PAGE = 0, ALIGN(4)/*This was working*/
       IQmathTables : > FLASH_BANK0_SEC1, PAGE = 0, ALIGN(4)/*Moved to sector 1 to run from RAM.Need verification*/
    
       /* Allocating FFT areas: */
       FFTipcb 		: >> RAMGS0, ALIGN(256) //64 points FFT
       FFTipcbsrc	: >> RAMLS4567
       FFTtf        : > FLASH_BANK0_SEC12_15
    
      .TI.ramfunc      : LOAD = FLASH_BANK0_SEC1, //Flash bank0 sector 1 contaings time critical functions required to run from RAM
                      RUN = RAMGS0,
                      LOAD_START(RamfuncsLoadStart),
                      LOAD_SIZE(RamfuncsLoadSize),
                      LOAD_END(RamfuncsLoadEnd),
                      RUN_START(RamfuncsRunStart),
                      RUN_SIZE(RamfuncsRunSize),
                      RUN_END(RamfuncsRunEnd),
                      ALIGN(8)
    
    }
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

     结果有两个问题。

    1- ipcbsrc 数组中的值应该是较大的值,但这些值在很大程度上缩小了(打印为样本输入)。 但它仍然是一个单周期正弦波。

    2 - FFT 结果全为零。

    请检查链接器命令文件是否正常。 如果我缺少某些计算步骤、也请检查代码。

     FFT 代码的代码片段如下所示(出于简单目的、我删除了非 FFT 代码)。

    #define FFT_SIZE    64
    
    #include "fft.h"
    #include "fft_hamming_Q31.h"
    #include "math.h"
    
    //Defining FFT sections
    #pragma DATA_SECTION(ipcb, "FFTipcb");
    int32_t ipcb[FFT_SIZE+2];         //Calculations buffer
    #pragma DATA_SECTION(ipcbsrc, "FFTipcbsrc");
    int32_t ipcbsrc[FFT_SIZE];        //Sampled input signal
    //Defining real fft object for 64 point calculations
    RFFT32  rfft = RFFT32_64P_DEFAULTS;
    
    
    
    void main(void)
    {for (i=0;i<FFT_SIZE;i++)
        {
            ipcbsrc[i]=(long)(2147483648*sinf(Rad));//Q31 format
            Rad=Rad+0.09817;
        }
        printf("\r\nSample Input:\r\n");
        for (i = 0; i < FFT_SIZE; i++)
    
    
            printf("%ld\r\n", ipcbsrc[i]);
        }
        RFFT32_brev(ipcbsrc, ipcb, FFT_SIZE); // real FFT bit reversing
    
        rfft.ipcbptr = ipcb;                  // FFT computation buffer
        rfft.magptr  = ipcbsrc;               // Magnitude output buffer
        rfft.winptr  = (long *)win;           // Window coefficient array
        rfft.init(&rfft);                     // Twiddle factor pointer initialization
    
        rfft.calc(&rfft);                     // Compute the FFT
        rfft.split(&rfft);                    // Post processing to get the correct spectrum
        rfft.mag(&rfft);                      // Q31 format (abs(ipcbsrc)/2^16).^2
    
    
        printf("\r\nFFT Result:\r\n");
        for (i = 0; i < FFT_SIZE; i++)
        {
             printf("%ld\r\n", ipcbsrc[i]);
        }
    }

    以下是串行终端上打印的代码输出:

    采样输入:
    0
    31.
    63.
    94
    123.
    152.
    179.
    205.
    229
    250
    269.
    285.
    299
    310
    317.
    322
    324.
    322
    317.
    310
    299
    285.
    269.
    250
    229
    205.
    180
    152.
    124.
    94
    63.
    31.
    0
    -31.
    -63.
    -94.
    -123.
    -152.
    -179.
    -205.
    -229
    -250
    -269.
    -285.
    -299
    -310
    -317
    -322
    -324
    -322
    -317
    -310
    -299
    -285.
    -269.
    -250
    -229
    -205.
    -180
    -152.
    -124.
    -94.
    -63.
    -31.


    FFT 结果:
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    -31.
    -63.
    -94.
    -123.
    -152.
    -179.
    -205.
    -229
    -250
    -269.
    -285.
    -299
    -310
    -317
    -322
    -324
    -322
    -317
    -310
    -299
    -285.
    -269.
    -250
    -229
    -205.
    -180
    -152.
    -124.
    -94.
    -63.
    -31.



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    很抱歉耽误你的答复。 如果看一下提供的 rfft 示例、输入和输出缓冲器会互换。 也请提供 ipcb 缓冲区。

    此外、请执行以下检查:

    1) 1)在映射文件中、确保已分配所有表

    2) 2)运行期间、请确保所有缓冲区都有适当的值

    3) 3)尝试使用加载、运行参数复制到 RAM。 它应该与 cmd 文件中的类似:

    FPUmathTables:load = flash,
    运行= RAMGS3、
    RUN_START (FPUmathTablesRunStart)、
    Load_start (FPUmathTablesLoadStart)、
    load_size (FPUmathTablesLoadSize)、

    在代码中、您必须按  Memcopy (&FPUmathTablesLoadStart、&FPUmathTablesLoadEnd、&FPUmathTablesRunStart)创建表;

    4) 4)您还可以使用引导 ROM 中已提供的表。 您无需将它们分配到闪存或 RAM 中。 请参阅 RAM-ROMTABLES 配置和文档/

    希望这对您有所帮助

    -Shantanu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shantanu:

      很抱歉,我没有收到你的答复。 我创建了一个新帖子、其中我提供了更多详细信息。 让我将此主题标记为已解决、因为最初的目的是获取有关此主题中已解决的初始实施问题的建议。 请在有关实现问题的另一个主题上提供指导。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    阿萨德

    在这种情况下、您可以将此线程标记为已解决。 请发送新主题的链接。

    -Shantanu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../tms320f280025c-rfft-code-calculations-giving-all-zeros-and-lots-of-warnings