TI中文支持网
TI专业的中文技术问题搜集分享网站

关于C66x FFT库函数DSPF_sp_fftSPxSP()运算结果不对的问题,求指教

我用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。

赞(0)
未经允许不得转载:TI中文支持网 » 关于C66x FFT库函数DSPF_sp_fftSPxSP()运算结果不对的问题,求指教
分享到: 更多 (0)