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.

[参考译文] TDA4VM:如何使用 FFTlib 在 C7X 上运行 FFT 算法

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1530231/tda4vm-how-to-run-an-fft-algorithm-on-c7x-with-fftlib

器件型号:TDA4VM
主题中讨论的其他部件:FFTLIB

工具/软件:

尊敬的 TI:  

我要实施 FFT 算法 在上 C7x DSP 直接连接。 为此、我使用的是中的代码 FFTlib BSL 代码。 但是、在确定可以使用哪些代码来运行 FFT 算法时遇到问题。 根据我的理解、大部分代码仅适用于 针对 FFT 算法配置内核 但它本身不包含 FFT 算法。

有人能告诉我可以使用 TI 提供的哪些文件来满足我的需求吗?

此致、  

M é lanie

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

    但是、仍然存在一些与 d.c 和您的最后一个代码相关的灰色区域。


    首先、 numPoints 变量的值代表什么?  

    const uint32_t numPoints = 64;

    是 FFT 的点数吗? 我认为这是 PX 数组元素的数量? 我的值不是 64、而是 168。 在我们的情况下、这不会产生问题、因为我刚刚为不同的指针分配了过多的空间。  

    然后、您为什么放入  numPoints * 2 * sizeof (int16_t) numPoints * 2 * sizeof (int16_t)  中的第二个字段  ti_memalign ()  函数、如下所示:
     pY     = (int16_t *) TI_memalign (64, numPoints * 2 * sizeof (int16_t));
     
    为什么会有 2 因素 除了:  numPoints * sizeof (int16_t )?  为什么不把:  
    (int16_t *) TI_memalign (64, numPoints * sizeof (int16_t));

    此致、  

    M é lanie

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

    您好 Melanie、  

    很高兴知道这一点、感谢您的更新。 上述共享代码在 J784S4 EVM 上验证、并可正常工作。

    [引述 userid=“647126" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1530231/tda4vm-how-to-run-an-fft-algorithm-on-c7x-with-fftlib/5934220

    -我想我是以错误的方式声明 1D 缓冲区的。 事实上,我看到了这个警告:“缓冲区 bufParamsData 在其值被设置之前被使用“。 因此、我使用了中使用的方法 D.C 文件 。 这是你最后一次给我的方法。 您是否认为问题 可能来自该问题?  

    -而且,我对缓冲区的 data_type 字段输入了错误的数据类型: “bufParamsY"。“。  

    [/报价]

    是的、没错。  

    现在、包括 checkParams() 和 kernel() 函数在内的所有函数都在工作。  不再存在 代码在循环中运行的任何问题、因此非常棒。  [/报价]

    如果我们启用前面提到的宏、它应该可以正常工作。 默认情况下不是。

    此致、

    Betsy Varughese.

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

    您好 Melanie、

    上面提供的代码是针对一个示例场景实现的。

    是 FFT 点数吗?

    就是 FFTsize。

    希望您已经浏览过本用户指南。

    那么、您为什么这么说呢  numPoints * 2 * sizeof (int16_t) numPoints * 2 * sizeof (int16_t)  中的第二个字段  ti_memalign ()  函数、如下所示:

    当您处理复杂数据类型时。(请参阅 d.c)

    Py =(int16_t *) TI_memalign (64numPoints * 2 * sizeof (int16_t));
    PW =(int16_t *) TI_memalign (64numPoints * 2 * sizeof (int16_t));
    PShift =(uint32_t *) TI_memalign (64numShifts * sizeof (uint32_t));
    此致、
    Betsy Varughese.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Betsy、  

    好的、很酷、很高兴来到这里。 感谢您对该代码部分的帮助!

    是的、我已经浏览过用户指南、但信息的详细程度不是我想要的。 让我解释一下我的意思:


    -首先、 我们是否同意这样一个事实,即 FFT 大小等于输入数据的值数(我们的例子中存储在 PX 中)? 根据内核函数 ci.cpp 文件中的代码、对我来说、答案是肯定的

    -然后,对我来说,因为 FFT 算法的目的是快速计算 DFT , 存储输入数据的数据 (PX)  映射 实值。  所以对我来说,不需要在 TI_memalign () 函数的第二个字段中放置 2 个系数。 对我来说, 这样定义 PX 指针就足够了:  

    int16_t *pX = (int16_t *) TI_memalign (64, numPoints * sizeof (int16_t));  

    对于其他参数、我同意您对 py、pw 和 pShift 的定义。

    此致、  

    M é lanie  

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

    您好 Melanie、

    那么、对我来说、由于 FFT 算法的目的是快速计算 DFT、 存储输入数据的数据 (PX)  映射 实值。  所以对我来说,不需要在 TI_memalign () 函数的第二个字段中放置 2 个系数。 对我来说, 定义 PX 指针就足够了:

    numPoints 的值= 128、则不需要因子 2。

    此致、

    Betsy Varughese.

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

    好的、

    最后一个问题是、我想用 2048 点扩展 FFT 算法。 因此,我做了一些修改,并实施了该代码:  
    e2e.ti.com/.../8625.main.cpp

    但是、我不传递 checkParameters funciton。 使用 TI_memalign () 分配空间是否有一些限制?

    我认为还有另一个问题。老实说,我并不真正理解这个问题,因为你确认了我的意见 PX 参数“数值的 numPoints = 128,那么没有必要的因素 2。“
    定义  

       FFTLIB_bufParams1D_t bufParamsX;
        bufParamsX.dim_x     = numPoints;             // QUESTION !!! PQ SI JE RETIRE FACTEUR 2 CA FAIT UNE ERREUR
        bufParamsX.data_type = FFTLIB_INT16;
      
    FFTLIB_bufParams1D_t bufParamsX;
    bufParamsX.dim_x     = numPoints*2;             // QUESTION !!! PQ SI JE RETIRE FACTEUR 2 CA FAIT UNE ERREUR
    bufParamsX.data_type = FFTLIB_INT16;
    checkParams 函数发送错误、而不是  

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

    您好 Melanie、

    我们正在处理复杂的节点 代码用于 64 点复数 FFT、此处的 numPoints 为 64。

    输入数包含实部和虚部、因此“dimx"应为“应为 输入数组 pX 的长度、即 128。 I.e、numPoints * 2.请参阅以下代码、了解 64 点复数 FFT。

    #include <fftlib.h>
    #include <c7x.h>
    #include "common/FFTLIB_bufParams.h"
    #include "common/FFTLIB_types.h"
    #include <cmath>
    #include <math.h>
    #include "common/TI_memory.h"
    #include <iostream>
    #include <cstring>
    #include <tw_gen.h>
     
    using namespace std;
     
    extern void tw_gen (int16_t *pW, uint32_t numPoints);
     
    uint8_t FFTLIB_fft1d_i16sc_c16sc_o16sc_pBlock[FFTLIB_FFT1D_I16SC_C16SC_O16SC_PBLOCK_SIZE];
     
    int16_t pX[] = {
          -108, -126, 109,  86,   56,  62,   -46, 8,    -88, -101, -78, -127, 67,   -33, -12, 97,  117, 109,  32,   91,  -44, -118, 117,  72,  20,  -43,
          -66,  -77,  82,   19,   31,  -84,  -22, -115, -46, -114, -30, -73,  -115, 25,  118, 25,  -18, 92,   61,   90,  67,  -39,  -21,  88,  11,  85,
          -72,  86,   34,   -107, -11, -113, -54, 125,  -37, 3,    86,  38,   -124, 89,  12,  90,  9,   -13,  -12,  22,  14,  17,   -109, 84,  22,  -16,
          2,    -79,  128,  76,   52,  -53,  -38, -105, 113, 106,  63,  -110, -85,  -68, -50, -82, 71,  -124, 93,   -16, 42,  -122, 78,   -70, -64, -45,
          -118, 57,   -127, 124,  -17, -65,  117, -40,  12,  68,   -70, -76,  6,    -18, -96, -3,  -70, -113, -111, 51,  92,  -8,   104,  -108};
     
    const uint32_t pShift[] = {0, 0, 0};
     
    const uint32_t numPoints = 64;
     
    const uint32_t numShifts = 3;
     
    int main(){
        int16_t *pY, *pW;
        FFTLIB_STATUS status = FFTLIB_SUCCESS;
     
        pY     = (int16_t *) TI_memalign (64, numPoints * 2 * sizeof (int16_t));
        pW     = (int16_t *) TI_memalign (64, numPoints * 2 * sizeof (int16_t));
        FFTLIB_bufParams1D_t bufParamsData;
        FFTLIB_bufParams1D_t bufParamsShift;
     
        bufParamsData.dim_x     = numPoints * 2;
        bufParamsData.data_type = FFTLIB_INT16;
     
        bufParamsShift.dim_x     = numShifts;
        bufParamsShift.data_type = FFTLIB_UINT32;
     
        tw_gen (pW, numPoints);
    
        status = FFTLIB_fft1d_i16sc_c16sc_o16sc_checkParams (
                (int16_t *) pX, &bufParamsData, (int16_t *) pW, &bufParamsData,
                (int16_t *) pY, &bufParamsData, (uint32_t *) pShift,
                &bufParamsShift, FFTLIB_fft1d_i16sc_c16sc_o16sc_pBlock);
     
        if(status == FFTLIB_SUCCESS){
            status = FFTLIB_fft1d_i16sc_c16sc_o16sc_init (
                 (int16_t *) pX, &bufParamsData, (int16_t *) pW, &bufParamsData,
                 (int16_t *) pY, &bufParamsData, (uint32_t *) pShift,
                 &bufParamsShift, FFTLIB_fft1d_i16sc_c16sc_o16sc_pBlock);
        }
        if(status == FFTLIB_SUCCESS){
            status = FFTLIB_fft1d_i16sc_c16sc_o16sc_kernel (
                 (int16_t *) pX, &bufParamsData, (int16_t *) pW, &bufParamsData,
                 (int16_t *) pY, &bufParamsData, (uint32_t *) pShift,
                 &bufParamsShift, FFTLIB_fft1d_i16sc_c16sc_o16sc_pBlock);
        }
     
        return 0;
     
    }

    此致、

    Betsy Varughese.

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

    您好 Melanie、

    那么、对我来说、由于 FFT 算法的目的是快速计算 DFT、 存储输入数据的数据 (PX)  映射 实值。  所以对我来说,不需要在 TI_memalign () 函数的第二个字段中放置 2 个系数。 对我来说, 定义 PX 指针就足够了:

    在此环境中 numPoints 的值是正确的。 但算法是针对复数实现的(从内核名称本身中可以清楚地看出)。

    请您检查上述代码、如果您有任何进一步的疑问、请告诉我。

    此致、

    Betsy Varughese.

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

    因此、如果我理解 corredy、因为我们的输入数据在我们的代码中很复杂、而不是实值、所以在我们的例子中没有 FFT Size 等于我们输入数据的值数量。  
    因此,我们有这样的关系: 输入数据的数量= 2 * numPoints ,与 numPoints 的 FFT 大小,纠正我,如果我错 Betsy  

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

    您好 Melanie、

    是的,就像我们有实数和虚数一样。

    如果您浏览一些示例代码、您将更清楚地了解这些代码。

    此致、

    Betsy Varughese.

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

    只是,关于我们的 jnput 数组的内容,视觉上,它里面有复杂的数据是不明显的。 我知道您告诉我、根据文件名背后的含义、我们有这些信息  ffTLib_fft1d_i16sc_c16sc_o16sc、带  i16sc、用于短复数输入数据。 只是通过好奇,在数组内,我们有例如第一个值,一个实值,然后一个虚值,然后一个实值,然后一个虚值,然后一个虚值, etccc .. ?  

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

    您好 Betsy、  

    感谢您帮助我解决这个问题! 你是一个女王!

    此致、  

    M é lanie ESTEVES

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

    您好 Melanie、

    从内核名称和 kernel() 可以清楚地理解它。

    如果您有任何疑问、请重新访问 kernel()。

    此致、

    Betsy Varughese.

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

    您好 Melanie、

    非常感谢。

    我们可以关闭这个主题吗?

    此致、

    Betsy Varughese.

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

    您好 Melanie、

    请参考以下代码。 我们从我们这边测试并验证了代码 。

    您能尝试一下我与您分享的代码吗?

    此致、

    Betsy Varughese.

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

    我尝试过、  

    我收到了与代码相同的错误消息。

    我刚刚添加在 main 的最后一行 (return 0;) 和 staticRefOutput10 数组的声明之前

        int val_res_FF = memcmp(pY,staticRefOutput10,numPoints * 2 * sizeof (int16_t));
        assert(val_res_FF !=0);
        cout << " Les valeurs de sorties obtenues sont correctes " << endl;


    [C71X_0] Assertion failed, (val_res_FF !=0), file ../main.cpp, line 449

    这是奇怪的,因为我们有正确的输出值之前的情况下,我没有错误,我得到了相同的数据,如在 referenceoutput4 数组..  staticRefOutput10 数组的某些值可能出错吗?  

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

    我不明白你做了什么以及如何做

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

    您好 Melanie、

    请尝试使用此代码而不做任何更改。

    请参考以下代码。 我们从我们这边测试并验证了代码 。

    此致、

    Betsy Varughese.

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

    是 RefOutput 吗? 为什么您不从 idat.c 文件中获取该文件?

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

    我告诉过您我做到了、但 FFT 的输出与 idat.c 的 refoutput 并不匹配

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

    您好 Melanie、

    是的,我们与 idat.c 中提到的 Refoutput 比较,它的匹配。 请参阅随附的屏幕截图。

    此致、

    Betsy Varughese.

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

    这是我的输出、您能告诉我您的设备是否有任何区别吗?
     e2e.ti.com/.../4606.sortiepYcalculee.txt

    谢谢

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

    您好 Melanie、

    只是一样。

    此致、

    Betsy Varughese.

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

    好的,所以很明显我们有正确的输出值,但由于一个神秘的原因, memcmp () 没有返回 0 ... ? 你有什么想法为什么?

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

    您好 Melanie、

    可能是。我认为 memcmp 会逐字节比较、而不是作为int16_t值比较。 如果有负数(由于)int16_t、它们在解释为无符号字节时可能在内存中显示不同。 但我对此不太确定。

    既然与 FFT 相关的所有问题都已解决、我们能否关闭该主题?

    此致、

    Betsy Varughese.

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

    您好 Betsy、  

    是的,我们可以,再次感谢你!

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

    您好 Betsy、  

    我发现了这个问题,不用担心! 实际上, memcmp() 返回一个 0 值(这意味着 py 和 RefOutPout 是相同的)。 我只是在 assert() 函数中设置了错误的条件、这就是为什么我看到断言失败的原因。 我纠正了这一点,现在一切都正常!

    此致、  

    M é lanie

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

    您好 Melanie、

    是的、明白了。 条件检查错误。 好的、谢谢。

    此致、

    Betsy Varughese.