我用6678开发板运行FFT程序,调用C66x库函数DSPF_sp_fftSPxSP(int N, float *ptr_x, float *ptr_w, float *ptr_y, unsigned char *brev, int n_min, int offset, int n_max); 其中N为1024点,ptr_x为输入缓存指针,ptr_w为旋转因子缓存指针,ptr_y为输出缓存指针,brev为64位bit反位表(参考C66x系列DSPLIB_Users_Manual说明为64位)。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
};
以上为函数调用的背景。运算出来发现不对,数据像是搬移了一下。我觉得是不是brev这个bit反位表不对?
下面是比较图,上面图是matlab仿真的结果,中间是DSP6678开发板运行的结果,下面一幅图是两者差值。我分析了一下,觉得DSP运行出来的结果是不是最右边的1/4段和第二个1/4段位置交错了。
请问这个brev参数怎么设置?我查看到是C67x系列DSPlibrary里面的说明,如下图
请给予指导帮助,谢谢各位专家!!
James Li2:
在源代码DSPF_sp_fftSPxSP_opt.c中search了一下发现brev这个参数并没有用到。
会不会是你输入的蝶形系数有问题。。
Kolia Yang:
回复 James Li2:
谢谢,我尝试了一下修改brev值,发现运算结果是一样的,证明这个函数确实与brev无关.
我是在学习之前官方给的Vlfft_OK 程序,里面调用的FFT函数是 void DSPF_sp_radix4_fftSPxSP( Uint32 n, float *pIn, float *pTwiddle, float *pOut, Uint32 log4NMinus1 ); 我在DSPLIB 3.1.1里面找了半天没有找到说明,就用C66x的这个库函数替换掉它,蝶形系数也是采用原来的系数,没想到结果出错了。
请问1)、哪里可以找到这个DSPF_sp_radix4_fftSPxSP这个库函数以及与之对应的IFFT函数?
2)、我看这个蝶形系数好像没有问题,和《基于TMS320C64x+DSP的FFT实现》里面说明的一样的,如下图:
James Li2:
回复 Kolia Yang:
DSPF_sp_fftSPxSP_d.c中就有一个计算蝶形系数的函数 tw_gen(),和你贴出来这个好像有点差异。
lucky2:
回复 James Li2:
您好
在6678的VLFFT工程里:
DSPF_sp_radix4_fftSPxSP( fftSize, &pWorkBuf0Internal[fftSize2*0], &pW1[0], pfftOut, VLFFTparams->log4N_1stIter );
这个函数的最后一个参数是什么意思?我在工程里找到它的值给了3,为何?
lucky2:
回复 Kolia Yang:
您好
留个方式,交流下。谢谢
jimmy cui:
这个旋转因子函数才是对的,你替换试试!
void tw_gen (float *w, int n){ int i, j, k;
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 * 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);#else w[k] = (float) cos (2 * PI * i / n); w[k + 1] = (float) -sin (2 * PI * i / n); w[k + 2] = (float) cos (4 * PI * i / n); w[k + 3] = (float) -sin (4 * PI * i / n); w[k + 4] = (float) cos (6 * PI * i / n); w[k + 5] = (float) -sin (6 * PI * i / n);#endif k += 6; } }}
还需要注意,输入数组要是复数形式(即含实部与虚部)
qian cui:
你好,我也遇到和你一样的问题,结果和matlab不一样,请问你解决了吗
user1212849:
回复 qian cui:
我也遇到与matlab的结果不一致。都搞了一周了。我的联系方式是18610121165,咱们可以交流一下。
user1212849:
回复 user1212849:
为什么没有官方的明确答复呢?官方就那么差钱么?雇些技术大牛解答问题不行么
Xiao Han:
回复 user1212849:
我用的C66x FFT库函数DSPF_sp_fftSPxSP(),确实是旋转因子W的产生有问题,修改了以后就和matlab里的结果一样了。像下面帖子里这样改的,
http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/82038.aspx。