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.

FFT 旋转因子问题



void tw_gen (float *w, int n)
{
int i, j, k;
// const double PI = 3.141592654;

for (j = 1, k = 0; j <= n>> 2; j = j << 2)
{
for (i = 0; i < n>> 2; i += j)
{
#ifdef _LITTLE_ENDIAN
w[k] = (float) sin (2 * 3.141592654 * i / n);
w[k + 1] = (float) cos (2 * 3.141592654 * i / n);
w[k + 2] = (float) sin (4 * 3.141592654 * i / n);
w[k + 3] = (float) cos (4 * 3.141592654 * i / n);
w[k + 4] = (float) sin (6 * 3.141592654 * i / n);
w[k + 5] = (float) cos (6 * 3.141592654 * i / n);

#else
w[k] = (float) cos (2 * 3.141592654 * i / n);
w[k + 1] = (float) -sin (2 * 3.141592654 * i / n);
w[k + 2] = (float) cos (4 * 3.141592654 * i / n);
w[k + 3] = (float) -sin (4 * 3.141592654 * i / n);
w[k + 4] = (float) cos (6 * 3.141592654 * i / n);
w[k + 5] = (float) -sin (6 * 3.141592654 * i / n);
#endif
k += 6;
}
}
}

我查看了例程中的FFT产生旋转因子的代码如上所示,我想请问这个旋转因子为什么都是以6为周期的?是否针对任意2的整数幂的N,都可以用该函数产生旋转因子?

  • 请问您是在哪个处理器上进行测试的?

  • AM572X EVM开发板

  • 这个是starterware裸跑OS的示例代码,还是Linux下的?

    建议你把这个问题和使用的平台、OS、hardware信息post到E2E的这个forum下:https://e2e.ti.com/support/arm/sitara_arm/f/791

    会有产品线相关的研发同事来进行作答。

  • 我简单重新说下我现在遇到的问题:我自己在AM572X EVM上开发一个双核程序,双核通讯我是已经调通的,现在DSP部分代码我想要做一个FFT,首先我就想做一个简单的测试看FFT库的使用是否正确,代码如下:

    define FFTSZ 64

    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
    };

    float x[2*FFTSZ];
    float y[2*FFTSZ];
    float w[2*FFTSZ];
    float w1[2*FFTSZ];
    float z[2*FFTSZ];

    void tw_gen(float *w, int n)
    {
    int i, j, k;
    const double PI = 3.141592654;

    for (j = 1, k = 0; j <= n >> 2; j = j << 2)
    {
    for (i = 0; i < n >> 2; i += j)
    {
    w[k] = (float) sin ( 2 * PI * i / n);
    w[k + 1] = (float) cos ( 2 * PI * i / n);
    w[k + 2] = (float) sin ( 4 * PI * i / n);
    w[k + 3] = (float) cos ( 4 * PI * i / n);
    w[k + 4] = (float) sin (6 * PI * i / n);
    w[k + 5] = (float) cos (6 * PI * i / n);
    k += 6;

    }
    }
    }

    for (i = 0; i < FFTSZ; i++) {
    x[PAD + 2*i] = 2*i;
    x[PAD + 2*i + 1] = 0;
    }

    tw_gen (w, FFTSZ);

    DSPF_sp_fftSPxSP (FFTSZ, x, w, y, brev, 4, 0, FFTSZ);

    这里我已经看明白了w是基4FFT的旋转因子,并且我在MATLAB对相同输入做了FFT比对CCS上调试这段代码得到的fft结果(y),两者一致。

    然而我将该部分代码放入我的双核程序中,得到的fft结果却和CCS上调试的不一致,只有第一个实部是一样的,后面的结果不对。

    结果如下:

    matlab fft 实部:

    4032 -64 -64 -64.0000000000000 -64 -64 -64 -64.0000000000000 -64 -64 -64.0000000000000 -64.0000000000000 -64 -64 -64.0000000000000 -64.0000000000000 -64 -64.0000000000000 -64.0000000000000 -64 -64 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64.0000000000000 -64 -64 -64.0000000000000 -64.0000000000000 -64 -64.0000000000000 -64.0000000000000 -64 -64 -64.0000000000000 -64.0000000000000 -64 -64 -64.0000000000000 -64 -64 -64 -64.0000000000000 -64 -64 ···

    双核程序得到FFT实部:

    4032 2642440192.00000 -162695266304.000 -504451629056.000 347320320 -2.38915960232005e+18 -3.94232585743550e+20 7.58157212632291e+20 -220194242560.000 -5.97797962912975e+19 -4.86599865988547e+17 4.56920300019245e+20 76240519168.0000 4.76261923412662e+20 ···