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.

[参考译文] TMS320F28377D:TMS320F28377D 上 FPU 库 C28x_FPU_DSP_LIBRARY 的复数 FFT。

Guru**** 2394305 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/638660/tms320f28377d-complex-fft-of-fpu-library-c28x_fpu_dsp_library-on-tms320f28377d

器件型号:TMS320F28377D

我们一直在 TMS320F28377 DSP 上开发 TI 的 FPU 库"C28x_FPU_DSP_library"。

我们使用了以下函数:
1) CFFT_F32
2) CFFT_F32_MAG_TMU0
3) ICFFT_F32

我们已经在9个阶段、即512点 FFT 中使用了"CFFT_F32"函数。

如该库的文档中所述、我们提供了如下内存分配和对齐方式。

CfftmagBuff    :>RAMGS5,     PAGE = 1
CfftF32Coef   :> RAMGS5,      PAGE = 1
Cfftin1Buff      :>RAMGS5,      PAGE = 1,ALIGN = 2048
CfftoutBuff      :>RAMGS5,      PAGE = 1,ALIGN = 2048

我们在使用上述函数时都采用了相同的执行顺序。

首先、我们使用"CFFT_F32"执行正向 FFT、然后使用"CFFT_F32_MAG_TMU0"根据它计算幅度。
之后、我们根据我们的要求操纵"ICFFT_F32"的输入缓冲器、并使用"ICFFT_F32"对该缓冲器执行逆向 FFT。

我们面临的问题有时是在1个周期(FFT 输入)间隔内随机出现、上述操作结束时获得的输出会失真(零)。
该中断仅在1个周期间隔内保持。

如上所示、它是在"ICFFT_F32"之后获得的输出。 它保持为零的持续时间为20ms (FFT 的1个输入周期)。

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

    感谢您的提问。 您的主题帖已分配给 C2000专家、应尽快回复。

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chen
    谢谢你。
    是否有关于此问题的任何更新?

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

    实际上,CFFT_F32() 函数不是根据中断进行调用的,而是每20ms 在后台进行一次调用。

    CFFT_F32() 函数执行时间:

    180 μ s、所有中断被禁用。

    324 μ s、仅禁用 timer0 (启用中断组1)。

    我们执行了三种不同的测试逻辑、如下所示:

    测试1:

    我们保持 timer0中断被启用、而没有在 ISR 中写入代码、如下所示:

    GpioDataRegs.GPESET.bit.GPIO133 = 1;
    
    CpuTimer0Regs.TCR.bit.TIF = 1;
    PieCtrlRegs.PIEACk.ACK1 = 1;
    
    //Timer0_ISR_ROUT ();
    
    GpioDataRegs.GPECLEAR.BIT.GPIO133 = 1; 

    但问题仍然存在。

    测试2:

    我们对其进行了测试、使中断组1保持启用状态、但在调用 CFFT_F32 ()函数之前禁用 timer0中断、如下所示。

    CpuTimer0Regs.tcr.bit.tie = 0;//计时器中断禁用。
    GpioDataRegs.GPBSET.BIO45 = 1;
    
    HND_CFFT->InPtr = CFFTin1Buff;
    HND_CFFT->OutPtr = CFFToutBuff;
    CFFT_F32 (HND_CFFT);
    
    GpioDataRegs.GPBCLEAR bit.GPIO45 = 1;
    CpuTimer0Regs.tcr.bit.tie = 1; 

    之后、我们没有观察到出现问题。

    测试3:

    然后、我们禁用 timer0中断及其时钟、并使用 EPWM10_INT_ISR (组3)实现200 μ s 中断、如下所示:

    uint16 Previ_IER = IER;
    
    GpioDataRegs.GPETOGGL.bit.GPIO133 = 1;
    
    //Timer0_ISR_ROUT ();
    
    EPwm10Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACk.ACK3 = 1;
    
    Previ_IER |= IER 组3;
    IER = Previ_IER; 

    但问题仍然存在。

    这一问题耗费了大量时间,而且十分紧迫,因此请尽快提供指导。