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.

C6670的fft



C6670的DSP_fft16x16怎么用呀,输入是short x[NUM_INPUTS][2*N + 2*PAD] ={},然后,short x_cn[NUM_INPUTS][2*N + 2*PAD];和short x_i[NUM_INPUTS][2*N + 2*PAD];分别是什么,short y_cn[NUM_INPUTS][2*N + 2*PAD];和short y_i[NUM_INPUTS][2*N + 2*PAD];分别是什么呢,fft计算的结果在哪里,请大神指教。

哪个大神可以给我说明一下,这个函数的输入和输出分别在哪里?

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <limits.h>

/* Defines */
#if defined(__TI_EABI__)
#define kernel_size _kernel_size
#endif

extern char kernel_size;
#define CYCLE_FORMULA_NX_PT1  128
#define CYCLE_FORMULA_NX_PT2  256
#define FORMULA_SIZE          2
int     form_cycle [FORMULA_SIZE];

#include "DSP_fft16x16_cn.h"
#include "DSP_fft16x16.h"
#include "gen_twiddle_fft16x16.h"

/* ======================================================================== */
/*  Kernel-specific alignments                                              */
/* ======================================================================== */
#pragma DATA_ALIGN(w, 8);

#pragma DATA_ALIGN(x, 8);
#pragma DATA_ALIGN(x_cn, 8);
#pragma DATA_ALIGN(x_i, 8);

#pragma DATA_ALIGN(y_cn, 8);
#pragma DATA_ALIGN(y_i, 8);

/* ======================================================================== */
/*  Parameters of fixed dataset.                                            */
/* ======================================================================== */
#define N   (256)
#define PAD (16)

/* ======================================================================== */
/*  Number of input arguments:                                              */
/* ======================================================================== */
#define NUM_INPUTS (1)

/* ======================================================================== */
/*  Initialized arrays with fixed test data.                                */
/* ======================================================================== */
short x[NUM_INPUTS][2*N + 2*PAD] =
{
/* Input Number: 0 */

{
     0x393D,  0x144A,  0x0F1F, -0x72ED, -0x5689, -0x64C1,  0x6193,  0x54CD,
     0x7E16, -0x2016, -0x6AEF,  0x4922, -0x5368,  0x0897,  0x54EB,  0x0084,

     0x1FAE,  0x1489,  0x1EC9, -0x6F5E,  0x5BE8, -0x024A,  0x75B7,  0x2217,
    -0x2EB6,  0x4D81,  0x0757,  0x254F, -0x7FCC, -0x6A05,  0x65AE, -0x5AC9,
     0x5D3B,  0x4219, -0x47E8,  0x4A2C, -0x03AD,  0x6576,  0x00D7,  0x7AA6,
    -0x0016, -0x2FEE,  0x55CB,  0x1E2C, -0x32AC,  0x2494, -0x4F3C, -0x6FFF,
     0x0826,  0x4087, -0x4C0A,  0x2E16,  0x4CEB, -0x6DE1, -0x03EC,  0x0BC2,
    -0x484A, -0x2E04,  0x7E82,  0x4FAD, -0x55DF, -0x6293,  0x5530, -0x4875,
     0x5E20,  0x7DB6, -0x516A, -0x47EE, -0x4EC0, -0x3429,  0x2649, -0x3754,
    -0x3F41, -0x00AD,  0x37BA,  0x5271, -0x3CFA, -0x1F8B,  0x2494, -0x371C,
    -0x51F4,  0x1E9F, -0x0CCB,  0x59E3,  0x180D, -0x38F2, -0x2132, -0x2B94,
    -0x17D1,  0x31A9, -0x275A,  0x2993,  0x417D, -0x49B1, -0x750B,  0x123F,
     0x3CCC, -0x18E2,  0x61E9,  0x5E28, -0x1D06, -0x68BA,  0x1647,  0x6698,
    -0x18EE,  0x50D8,  0x4231,  0x2468, -0x4A2F, -0x4FED,  0x7584,  0x6DC2,
     0x3008,  0x23BA,  0x5366, -0x2ADE, -0x379A, -0x751F,  0x3367, -0x4DE8,
     0x4A1C,  0x42C4, -0x3A38, -0x34B1, -0x031A,  0x161B,  0x3F68,  0x244D,
     0x75F3, -0x7695, -0x7439,  0x797D, -0x3AD0,  0x18E2, -0x0248, -0x2D0D,
     0x5974, -0x31D6,  0x0D25, -0x3A8C,  0x2907, -0x343B, -0x6A7F, -0x24C1,
    -0x56E9,  0x2A61,  0x1653, -0x66E7, -0x0081, -0x3549, -0x7E9C, -0x52ED,
     0x0077, -0x7C9D,  0x0411, -0x3E67,  0x6FA9,  0x3843,  0x5D37,  0x7640,
     0x021C,  0x52D1,  0x3649, -0x0232, -0x5179,  0x2204, -0x06FF, -0x20F1,
    -0x4878, -0x59D2, -0x42CF,  0x5DE2,  0x0334,  0x305C, -0x5CC4,  0x0208,
     0x338C,  0x74B7,  0x4AA6, -0x2CC7,  0x0256, -0x7E98, -0x46AF, -0x5D0B,
     0x6BD0,  0x1578,  0x5DCD,  0x0E96,  0x0CCB, -0x23C8,  0x7A56, -0x5FD6,
     0x5AA2,  0x13A3, -0x4913, -0x6E7F,  0x0E97,  0x1045,  0x1310, -0x4AF4,
     0x6109,  0x2E24,  0x0194,  0x09EE, -0x7CEC, -0x5FDA, -0x13D6,  0x68D8,
    -0x1CF3, -0x5984, -0x3410, -0x1BDF, -0x50A2, -0x5676,  0x3DBA,  0x45A4,
     0x2648, -0x412D, -0x5694,  0x2AD7,  0x2202,  0x0767, -0x2503,  0x54AD,
     0x72B7, -0x7AB2, -0x516B, -0x6D54,  0x74ED, -0x4088,  0x4054, -0x2C2A,
     0x71C3, -0x2056,  0x1932, -0x2341,  0x4799, -0x5911, -0x157C,  0x2875,
    -0x336D, -0x34F4,  0x43A4,  0x669B, -0x7B82,  0x456D, -0x25CD,  0x1E52,
     0x0D98, -0x15E3, -0x337B,  0x025A, -0x2145,  0x0537,  0x6CA7,  0x58F5,
    -0x42A1,  0x455D,  0x1087,  0x130F, -0x75F6, -0x6A54,  0x66C3,  0x0B25,
    -0x3D68,  0x58B8, -0x2E70, -0x2196,  0x49EA, -0x7203,  0x4449, -0x0D4E,
     0x006E,  0x545F,  0x291A,  0x239D, -0x64EF,  0x5A21, -0x36AE, -0x7482,
     0x390C, -0x5420, -0x4630, -0x0778,  0x4816,  0x660F, -0x30ED, -0x7944,
     0x2971, -0x288A,  0x176E, -0x25EA,  0x1B62,  0x792E,  0x55D6, -0x7A84,
    -0x1682,  0x5CA4,  0x7FDC,  0x0AED, -0x1EA0,  0x6813, -0x31C6,  0x0C70,
    -0x74C0,  0x150B, -0x3E70,  0x1F4C, -0x551A, -0x0990, -0x4C4C, -0x410F,
    -0x027E, -0x4782,  0x6F2C, -0x1CC9,  0x47E7, -0x01B2,  0x4D47, -0x31B9,
     0x229D, -0x5EA5,  0x5057,  0x65DB,  0x0A61, -0x237A, -0x3476, -0x41D3,
     0x3A7E, -0x2BE0,  0x0CE4,  0x5334, -0x3A76,  0x1070, -0x7421,  0x5099,
     0x7900,  0x483E,  0x1C26, -0x6E0C,  0x0741,  0x28DE, -0x530A, -0x403D,
    -0x1390,  0x6D37, -0x0467,  0x10A9, -0x5E49, -0x16AC, -0x1F75,  0x3668,
    -0x6C9F, -0x0D13, -0x6D49, -0x1ADE,  0x5D62, -0x4F88,  0x7560, -0x74AC,
    -0x3848, -0x2FC7, -0x15E4, -0x5EE8,  0x072C,  0x21D0, -0x567F,  0x2F26,
    -0x2D06, -0x7038,  0x1AE2, -0x19ED, -0x5B26,  0x08B0,  0x38BD,  0x6C56,
    -0x2A22, -0x36D8,  0x773F,  0x428D, -0x0B3D, -0x7A88,  0x2C6A, -0x2783,
    -0x1DEB, -0x04DB,  0x0265,  0x435E,  0x34B9,  0x6F06, -0x15A2,  0x11DB,
     0x5D5D, -0x7CA5,  0x199E, -0x2FA2,  0x183B, -0x0196, -0x7BD1, -0x53E6,
    -0x6332, -0x12EF,  0x65AC, -0x40B1,  0x10DC, -0x4D1C,  0x45B1,  0x7759,
    -0x3898,  0x7549,  0x0967, -0x5103, -0x3E04,  0x7912, -0x7A49, -0x1A90,
    -0x0C1F, -0x2AE4,  0x139B,  0x19AB, -0x3354,  0x176B, -0x4DF2, -0x318A,
    -0x774C,  0x474C,  0x2825, -0x4E4A, -0x3B1D, -0x300C, -0x5944,  0x6485,
    -0x2692, -0x32E1,  0x7752, -0x0C84,  0x76E9,  0x4535,  0x307E,  0x67C8,
     0x093F, -0x4492, -0x187F,  0x0280,  0x6307, -0x518D, -0x1579, -0x5F48,
     0x28C4,  0x7C05, -0x7B06, -0x442B, -0x7F8C,  0x2C22,  0x3F7F, -0x695A,
    -0x6FE8, -0x67D2,  0x3112,  0x0CBE,  0x3684, -0x7F64, -0x3A40, -0x797B,
    -0x76DC, -0x006D, -0x6979, -0x6F65, -0x5DEB, -0x16E5, -0x3B2D, -0x6416,
     0x2528, -0x72B7,  0x511F,  0x600A,  0x133F,  0x53EA,  0x0832,  0x6556,
     0x5F8F, -0x2DD1,  0x6285,  0x2F50, -0x36BE, -0x4921, -0x0CBE, -0x7045,
     0x7CF9,  0x1B81, -0x2396, -0x6102, -0x0A4E, -0x3CF0, -0x396A, -0x29BE,
    -0x5575, -0x4855, -0x2921, -0x2929, -0x0518, -0x3637,  0x3766,  0x4454,
    -0x2183,  0x7F66, -0x6708,  0x5EF9, -0x184F, -0x213F,  0x3B57, -0x5C25,
    -0x0B16, -0x60F7,  0x08A5,  0x3140,  0x3C37,  0x4495,  0x1A70,  0x36CD,
     0x0FDA, -0x67E1,  0x60D7,  0x17EC, -0x18CC,  0x1078, -0x46A2, -0x4F0F,

     0x3694, -0x6FBD,  0x18D6,  0x3D8A, -0x7E9F,  0x162E,  0x2EF0,  0x6AE5,
     0x372C, -0x30D1,  0x16E8,  0x081A, -0x2DE1,  0x0940, -0x7429, -0x209F
},

};

short x_cn[NUM_INPUTS][2*N + 2*PAD];
short x_i[NUM_INPUTS][2*N + 2*PAD];

short y_cn[NUM_INPUTS][2*N + 2*PAD];
short y_i[NUM_INPUTS][2*N + 2*PAD];

short w[NUM_INPUTS][2*N + 2*PAD];

/* ======================================================================== */
/*  Prototypes for timing functions.                                        */
/* ======================================================================== */
clock_t time_cn(int cur_input, int n);
clock_t time_i(int cur_input, int n);

/* ======================================================================== */
/*  MAIN -- Top level driver for the test.                                  */
/* ======================================================================== */
int main()
{
    clock_t t_overhead, t_start, t_stop;
    clock_t t_cn, t_i;
    int i, j, k, m, n, radix, fail, p, q;
    short diff, diff_max;

    /* -------------------------------------------------------------------- */
    /*  Compute the overhead of calling clock() twice to get timing info.   */
    /* -------------------------------------------------------------------- */
    t_start = clock();
    t_stop = clock();
    t_overhead = t_stop - t_start;

    for (j = 0; j < NUM_INPUTS; j++) {
        for (i = 0; i < 2*N + 2*PAD; i++)
            x[j][i] = x[j][i] >> 4;
    }

    for (j = 16, k = 1, fail = 0; j <= N; k++, j *= 2) {
        for (n = 31, m = 1; (j & (1 << n)) == 0; n--, m++)
            ;
        radix = m & 1 ? 2 : 4;

        /* -------------------------------------------------------------------- */
        /*  Generate twiddle factors for fft of size 'j'                        */
        /* -------------------------------------------------------------------- */
        gen_twiddle_fft16x16(&w[0][PAD], j);

        /* -------------------------------------------------------------------- */
        /*  Copy vector to all inputs.                                          */
        /* -------------------------------------------------------------------- */
        memcpy(x_cn, x, sizeof(x_cn));
        memcpy(x_i, x, sizeof(x_i));

        memcpy(y_i, y_cn, sizeof(y_i));
        /* -------------------------------------------------------------------- */
        /*  Check the results arrays, and report any failures.                  */
        /* -------------------------------------------------------------------- */
        for(i = 0; i < NUM_INPUTS; i++) {
            t_cn = time_cn(i, j) - t_overhead;
            t_i  = time_i(i, j) - t_overhead;
        }

        printf("DSP_fft16x16\tIter#: %d\t", k);

        diff_max = 0;
        for (p = 0; p < NUM_INPUTS; p++) {
            for (q = 0; q < 2*N + 2*PAD; q++) {
                diff = y_cn[p][q] - y_i[p][q];
                if (diff < 0)
                    diff = -diff;
                if (diff > diff_max)
                    diff_max = diff;
            } 
        }
 
        if (diff_max > 15) {
            fail++;
            printf("Result Failure (y_i) ");
        }
        else
            printf("Result Successful (y_i) ");

        printf("\tRadix = %d\tN = %d\tnatC: %d\tintC: %d\n", radix, j, t_cn, t_i);

        if (j == CYCLE_FORMULA_NX_PT1)
          form_cycle[0] = t_i;
        if (j == CYCLE_FORMULA_NX_PT2)
          form_cycle[1] = t_i;
    }

    /* Provide memory information */
    printf("Memory:  %d bytes\n", &kernel_size);

    /* Provide profiling information */
    printf("Cycles:  %d (N=128) %d (N=256)\n", form_cycle[0], form_cycle[1]);

    return (fail);
}

/* ======================================================================== */
/*  TIME_CN  -- Measure elapsed time for natural C version.                 */
/* ======================================================================== */
clock_t time_cn(int cur_input, int n)
{
    clock_t t_start, t_stop;

    t_start = clock();
    DSP_fft16x16_cn(&w[cur_input][PAD], n, &x_cn[cur_input][PAD], &y_cn[cur_input][PAD]);
    t_stop  = clock();
    return  t_stop - t_start;
}

/* ======================================================================== */
/*  TIME_I   -- Measure elapsed time for intrinsic C version.               */
/* ======================================================================== */
clock_t time_i(int cur_input, int n)
{
    clock_t t_start, t_stop;

    t_start = clock();
    DSP_fft16x16(&w[cur_input][PAD], n, &x_i[cur_input][PAD], &y_i[cur_input][PAD]);
    t_stop  = clock();
    return  t_stop - t_start;
}
  • 函数原型 C:\ti\dsplib_c66x_3_4_0_0\packages\ti\dsplib\src\DSP_fft16x16\c66

    API 手册C:\ti\dsplib_c66x_3_4_0_0\docs

  • DSP_fft16x16_cn和DSP_fft16x16,两个函数有什么区别呀,我看到写的是 Measure elapsed time for natural C version. 和Measure elapsed time for intrinsic C version.  不知道是什么意思?

    /* ======================================================================== */
    /*  TIME_CN  -- Measure elapsed time for natural C version.                 */
    /* ======================================================================== */
    clock_t time_cn(int cur_input, int n)
    {
        clock_t t_start, t_stop;
    
        t_start = clock();
        DSP_fft16x16_cn(&w[cur_input][PAD], n, &x_cn[cur_input][PAD], &y_cn[cur_input][PAD]);
        t_stop  = clock();
        return  t_stop - t_start;
    }
    
    /* ======================================================================== */
    /*  TIME_I   -- Measure elapsed time for intrinsic C version.               */
    /* ======================================================================== */
    clock_t time_i(int cur_input, int n)
    {
        clock_t t_start, t_stop;
    
        t_start = clock();
        DSP_fft16x16(&w[cur_input][PAD], n, &x_i[cur_input][PAD], &y_i[cur_input][PAD]);
        t_stop  = clock();
        return  t_stop - t_start;
    }
    
    /* ======================================================================== */
    /*  End of file:  DSP_fft16x16_d.c                                          */

  • DSP_fft16x16_cn所使用的是natural C可以在任何C compiler下执行

    而DSP_fft16x16经过优化将部分指令取代成DSP指令(intrinsic C), 在执行结果下DSP_fft16x16要来的快速

    另外, 可以看到DSPF_xxxx.sa是使用汇编语言, 这又更为快速

     

    前面你所提问到的输入通常是x, 输出是y

    x_i为DSP_fft16x16的输入

    y_i为DSP_fft16x16的输出

    x_cn为DSP_fft16x16_cn的输入

    y_cn为DSP_fft16x16_cn的输出

    diff是在比较精准度(误差)

  • short x[NUM_INPUTS][2*N + 2*PAD] 

    这个输入x定义为什么是[2*N + 2*PAD],后边的2*PAD是做什么用的?

  • 之前执行DSPF_sp_ifftSPxSP(DSPF_sp_ifftSPxSP_d.c)也有相同的问题, 没有PAD也并不影响结果

    从名称看来应该是buffer的考虑, 但不清楚真正用途

    这里找到可能的答案

    http://e2e.ti.com/support/dsp/tms320c6000_high_performance_dsps/f/115/t/220132

  • 做信号处理时,信号首和尾要补上一定长度的数据,PAD就是要补充的数据。