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.

[参考译文] DSPLIB:DSPF_sp_fftSPxSP 问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/576918/dsplib-dspf_sp_fftspxsp-issue

你(们)好

我想我正在使用 DSPF_sp_fftSPxSP (DSPLIB_c66x_3_4_0_0)获得意外结果

伪代码:

#define N_FFT 64

#pragma DATA_ALIGN (inputFFT、8);
float inputFFT [2*N_FFT];

#pragma DATA_ALIGN (outputFFT、8);
float outputFFT [2*N_FFT];


对于(I = 0;I < N_FFT;I++)

inputFFT[2*i]= sinWaveMag *(float) cos (sinWaveIncFreq*i);
inputFFT[2*I +1]= 0.0;

dSPF_sp_fftSPxSP (N_FFT、inputFFT、w_sp、outputFFT、bev、4、0、N_FFT);

这是可以的、我得到的结果如下图(OK)

第二项测试:


我使用16个样本输入函数、通过添加64-16 = 48个零在时域中填充零

伪代码

/*清除输入浮点数组*/
对于(I = 0;I < N_FFT;I++)

inputFFT[2*i]=(float) 0.0;
inputFFT[2*I +1]=(float) 0.0;

对于(I = 0;I < 16;I++)

inputFFT[2*i]= sinWaveMag *(float) cos (sinWaveIncFreq*i);
inputFFT[2*I +1]= 0.0;

我得到意外结果、请参阅下图

预期结果(使用另一个 DFT 函数)如下:


我有什么问题吗?

谢谢你
Fabio

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

    RTOS 团队已收到通知。 他们的反馈将在此处发布。

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

    无反馈... 请帮助

    Fabio
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    据我所知、FFT 运行良好、您的伪代码看起来正常。 问题可能出在 Twiddle w_sp 中。 如何声明数组并生成它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    W_sp 声明为

    #pragma DATA_ALIGN (w_sp、8);
    float w_sp [2*64];

    我使用函数生成它:

    gen_twidle_FFT_sp (w_sp、64);

    请参阅下面的代码

    void gen_twiddle FFT_sp (float *w、int n)

    int i、j、k;
    double x_t、y_t、theta1、theta2、theta3;

    对于(j = 1、k = 0;j <= n >> 2;j = j << 2)

    对于(I = 0;I < n >> 2;I += j)

    theta1 = 2 * pi * I / n;
    x_t = cos (theta1);
    y_t = sin (theta1);
    w[k]=(float) x_t;
    w[k + 1]=(float) y_t;

    theta2 = 4 * pi * I / n;
    x_t = cos (theta2);
    y_t = sin (theta2);
    w[k + 2]=(float) x_t;
    w[k + 3]=(float) y_t;

    theta3 = 6 * pi * I / n;
    x_t = cos (theta3);
    y_t = sin (theta3);
    w[k + 4]=(float) x_t;
    w[k + 5]=(float) y_t;
    k +=6;






    Brev 数组如下所示

    unsigned char brev[64]={
    0x0、0x20、0x10、0x30、0x8、 0x28、0x18、0x38、
    0x4、0x24、0x14、0x34、0xc、 0x2C、0x1c、0x3c、
    0x2、0x22、0x12、0x32、0xA、 0x2a、0x1a、0x3a、
    0x6、0x26、0x16、0x36、0xe、 0x2E、0x1E、0x3E、
    0x1、0x21、0x11、0x31、0x9、 0x29、0x19、0x39、
    0x5、0x25、0x15、0x35、0xd、 0x2D、0x1d、0x3D、
    0x3、0x23、0x13、0x33、0xb、 0x2b、0x1b、0x3b、
    0x7、0x27、0x17、0x37、0xF、 0x2F、0x1f、0x3f
    };

    谢谢你

    Fabio
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    你的 gen 函数与我的函数不同。 尝试将 x_t 与 y_t 交换:
    w[k]=(float) y_t;
    w[k + 1]=(float) y_t;
    … 因此在位置+2、+3和+4、+5。
    由于我看到了不同之处、所以我尝试一下、使用此版本、结果似乎是可以的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉出错了:
    w[k]=(float) y_t;
    w[k + 1]=(float) x_t;//不再是 y_t
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    谢谢、您的 gen 函数工作正常

    顺便说一下、我从 TI 示例中复制了我的函数
    [INSTALL DIR]\DSPLIB_c66x_3_4_0_0\examples\FFT_sp_ex\FFT_example_sp.c

    谢谢你

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

    在我看来、该示例仅适用于大端字节序。 在之前的3.1.0.0版本中、在示例中有一个显式 gen_twidedle_fft32x32.c、用于在小端/大端字节序的情况下反转正弦/余弦顺序。

    我建议您使用的版本仅适用于小端字节序。

    如果您查看 FFT 的实现、您可以看到 FFT 也会根据字节序反转某些操作数。

    问题的起源是 CPU 对乘法复数的汇编器指令(4 mul x 一条指令)使用的操作数顺序。 由于图像/真实零件顺序根据字节序而变化、因此旋转顺序也应..

    顺便说一下、C6678实现不需要 brev 数组(您可以传递0)、因为它具有专用的汇编器指令。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢大家

    Fabio