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_SIZE2 intform_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) ");}elseprintf("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; }
Allen35065:
函数原型 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
chao zhang7:
回复 Allen35065:
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();returnt_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();returnt_stop - t_start; }/* ======================================================================== */ /*End of file:DSP_fft16x16_d.c*/
Lin Jia-Hung:
回复 chao zhang7:
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是在比较精准度(误差)
chao zhang7:
回复 Lin Jia-Hung:
short x[NUM_INPUTS][2*N + 2*PAD]
这个输入x定义为什么是[2*N + 2*PAD],后边的2*PAD是做什么用的?
Lin Jia-Hung:
回复 chao zhang7:
之前执行DSPF_sp_ifftSPxSP(DSPF_sp_ifftSPxSP_d.c)也有相同的问题, 没有PAD也并不影响结果
从名称看来应该是buffer的考虑, 但不清楚真正用途
这里找到可能的答案
http://e2e.ti.com/support/dsp/tms320c6000_high_performance_dsps/f/115/t/220132
Lucas Chen:
回复 chao zhang7:
做信号处理时,信号首和尾要补上一定长度的数据,PAD就是要补充的数据。