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.

[参考译文] AUDIO-AM275-EVM:为什么 FFTLIB 需要`μ.Pinit`段来设置 pBlock、而像 FIR 这样的 DSPLIB 允许基于 malloc 的 pBlock?

Guru**** 2540720 points
Other Parts Discussed in Thread: FFTLIB

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1559653/audio-am275-evm-why-does-fftlib-require-pinit-section-for-pblock-while-dsplib-like-fir-allows-malloc-based-pblock

部件号:AUDIO-AM275-EVM
主题中讨论的其他部件:FFTLIB

工具/软件:

TI 团队大家好、

我在 C7x 上同时使用 FFTLIB 和 DSPLIB 内核、并注意到如何处理参数块 (`pBlock`) 有差异:

*在 DSPLIB FIR 内核(例如`D` SPLIB_fir_ci.cpp `)中、` InitArgs `struct 包含` pBlock `、并动态分配其存储器(通过` GetSize ()`m+` alloc)。 这可以正常工作、内核可以正常运行。
*然而,在 FFTLIB 中,示例总是在`. pinit `部分声明` pBlock`,例如:

```c
pragma DATA_SECTION (FFTLIB_fft1d_i32f_c32fc_o32fc_pBlock、“.pinit")“)
Uint8_t FFTLIB_fft1d_i32f_c32fc_o32fc_pBlock[FFTLIB_FFT1D_I32F_C32FC_O32FC_PBLOCK_size];
```μ s

如果我尝试使用`malloc`动态分配`pBlock`(128B 对齐、相同的 L2SRAM 区域)、内核会冻结或崩溃。 只有`.pinit`放置工作。

——

我的问题:

1、`FFTLIB 为何要求将` pBlock `具体放置在`.pinit 中?
2.这是由于硬件流引擎 (SE/SA) 要求还是 FFTLIB 内核实现强制的约定造成的吗?
3.是否有任何安全的方法可以使用 malloc 分配的缓冲区管理多个 FFT 实例(每个实例都有自己的 pBlock)、或者`.pinit`是必需的?

了解这一差异将有助于我们设计存储器分配策略(我们计划管理多个 FFT/IFFT 通道、可能通过在执行前将本地 pBlocks 复制到共享全局`.pinit `块中)。

此致、
Hendry Newman

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

    尊敬的 Hendry:

    我看到 malloc 存储器和静态分配存储器之间的唯一区别是存储器中的初始值。 malloc 存储器可能不会初始化为零、而静态分配的存储器最初设置为零。 是否可以尝试将 malloc 存储器设置为零并重试?

    此致、

    Ming  

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

    我也尝试了 memset 将其设置为零。 不起作用。  

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

    尊敬的 Hendry:

    您能否在示例中共享 malloc-ing、初始化和使用 pBlock 的代码段? 还请针对静态和动态情况包含 linker.cmd、syscfg 和映射文件。

    此致、

    Ming

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

    e2e.ti.com/.../1526.ti_2D00_fft_2D00_expt4.zip

    上面的 zip 文件包含 test_FFT 工程、您可以尝试编译和运行该工程、只需在 my_fft.c 中启用/禁用以下代码片段:

      //me->fft_pblock  =(uint8_t *) memalign (FFTLIB_BUFFER_ALIGNATION_REQ、fft_PBLOCK_SIZE);
      //memset ((void *) me->fft_pblock、0、fft_PBLOCK_SIZE);
      //me->ifft_pblock  =(uint8_t *) memalign (FFTLIB_BUFFER_ALIGNATION_REQ、IFFT_PBLOCK_SIZE);
      //memset ((void *) me->ifft_pblock、0、IFFT_PBLOCK_SIZE);

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

    尊敬的 Hendry:

    当我使用 malloc 分配  me->fft_pblock 和 me->ifft_pblock 时。 FFT 和 IFFT 成功运行并返回、但结果不正确(test_assert_real_array_inner 返回错误)

    在 process_forward () 之前、 fft_data.fft_inst 和  ifft_data.fft_inst 看起来正常:

    在 process_forward () 之后、ifft_data.fft_inst 看起来错误:

    您需要仔细检查您的程序。

    我也注意到你的 my_ft_destroy ()  在 malloc 情况下不会释放 fft_pblock 或 ifft_pblock。

    此致、

    Ming

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

    my_fft_destroy()  在 malloc 情况下不释放 fft_pblock 或 ifft_pblock -->是的、我错过了它。
    但正如我提到的、在.pinit 段中分配 pblock 时、根本没有观察到这个问题。  

    关于 FFT  sreekanth Sree 后的腐败问题 、可以回答得更好。

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

    尊敬的 Hendry:

    我想问题出在以下代码:

    FFTLIB_fft1dBaged_i32fc_c32fc_o32fc_init (
      (FFTLIB_F32 *) px、&bufParamsX_FFT、(FFTLIB_F32 *) pw、
      &bufParamsX_FFT、(FFTLIB_F32 *) pXFFT、&bufParamsX_FFT、
      (numPoints >> 1)、1、&((uint8_t *) pBlock)[5 * SE_PARAM_SIZE]);

    FFT 实例的 pBlock 为 14*64、但在  FFTLIB_fft1dBmatch_i32fc_c32fc_o32fc_init() 内、13*64 已使用(参见 SA_LOOP6_PARAM_OFFSET)。 加上 FFTLIB_fft_real_forward_init() 中使用的 5*64。 FFT 实例 pBlock 至少应有 18*64。

    更改后:

    ME->fft_pblock =(uint8_t *) memalign (FFTLIB_BUFFER_ALIGN_REQ、FFT_PBLOCK_SIZE);
    memset ((void *) me->fft_pblock、0、fft_PBLOCK_SIZE);

    最终目的

    ME->fft_pblock =(uint8_t *) memalign (FFTLIB_BUFFER_ALIGN_REQ、IFFT_PBLOCK_SIZE);
    memset ((void *) me->fft_pblock、0、IFFT_PBLOCK_SIZE);

    程序按预期运行。

    此致、

    Ming

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

    尊敬的 Hendry:

    我与 FFTLIB 开发团队交谈过。 他们告诉我 FFTLIB_fft1d_i32f_c32fc_o32fc.h 中定义的函数已经过时。 他们将  在下一个版本中删除 FFTLIB_fft1d_i32f_c32fc_o32fc.h 中定义的函数。 在此之前、请  改用 FFTLIB_fft1dBatched_i32f_c32fc_o32fc.h 中定义的函数。

    此致、

    Ming  

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

    尊敬的 Ming:

    感谢您的支持。 我看到测试案例正在通过18 * SE_PARAM_SIZE(即)18 * 64
    根据您之前的评论、我理解我们应该使用:

    define FFTLIB_FFT1DBATCHED_I32F_C32FC_O32FC_PBLOCK_SIZE (25 * SE_PARAM_SIZE) //(25 * 64)  

    您能否确认我的理解是否正确? 或者、您希望我们完全避免使用`
    FFTLIB_fft1d_i32f_c32fc_o32fc`函数?
    `Δ f FFTLIB_fft1d_i32f_c32fc_o32fc `是否出现其他问题?  

    这是否也适用于 iift 例程` FFTLIB_ifft1d_i32fc_c32fc_o32fc `?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Hendry:

    是的。 请对 FFT 和 IFFT 使用批量处理版本。

    此致、

    Ming

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

    感谢您的支持。