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

【C6678FFT】关于C64X与C66X DSPLIB中FFT的问题

TI工程师:

你们好,关于C6678的FFT小弟有以下几个问题请教,求解答!

====================================================

DSP板:自己开发的DSP板,板上芯片TMS320C6678ACYP25

OS:win xp win32

CCS:CCS V5.3.0.0.00090

DSPLIB: 

dsplib_c66x_3_2_0_1_Win32

dsplib_c64Px_3_2_0_1_Win32

仿真器:Wintech XDS560V2

===============================================

1. C6678是否支持浮点FFT/IFFT运算,为什么C66X的DSPLIB中的FFT/IFFT函数仍然采用的是整数计算;

2.C64X DSPLIB中的FFT/IFFT 与 C66X DSPLIB中的FFT/IFFT 有何不同?

   根据源文件中的注释看来,C64X DSPLIB中IFFT程序同时支持基2和基4运算,而C66X DSPLIB中IFFT程序只支持基4,是这样的吗?

为何同样的输入数据,使用C64X DSPLIB中的IFFT32*32的源文件编译计算 得到的结果与 使用 C66X DSPLIB中的IFFT32*32的源文件编译计算 得到的结果 不同?

   输入数据为64*32的实部和虚部紧邻依次排列的复整数矩阵。程序先按行作64次32点IFFT,转置后再作32次64点IFFT。

3. 使用C64X DSPLIB IFFT32*32时,与使用C66X DSPLIB IFFT32*32时,使用的旋转因子是相同的吧,因为从代码来看,两者并没有差别。

Allen35065:

C66X支持定点也支持浮点,这里DSPLIB实现的是定点FFT/IFFT,对于C64X的不同是这里用C66X的指令做了更多的优化,性能比C64X上更好。

旋转因子相同。

我没有在C64X上测试IFFT,但是我对比过C66X的IFFT输出和FFTC模块的输出,应该是没有问题的,你可以检查一下是否是别的原因引起的。

Zhan Xiang:

1. DSPF_sp_fftSPxSP 是用来做单精度浮点的fft的,你可以参考对应的源码

2. 由于C64x和C66x是两代不同的DSP core,C66x的运算能力更强,所以C66x的lib是根据C66的指令做了优化,dsplib的文档中写到了是支持基4的ifft运算。

3.dsplib中有旋转因子的生产代码,您可以对比一下,因为该代码是C语言实现的,所以结果应该是相同的。

4. C66在实现时计算中间结果时有一些饱和操作,这些实现有可能造成结果不一致,建议在使用中避免出现混用的情况。

chen xie:

LZ好

1、支持,您对整数计算的定义是啥,我记得手册里写的做的都是小数乘法,这样不会有溢出;

2、c66x也支持基2啊,只不过是在最后一级,前面都是基4;

       如果全部基2,好像没有示例程序;

      64*32是什么意思,64次????32*32的意思应该是蝶形因子32bit 输出32bit的意思吧。为什么还要转置??

3、没用过c64+;

顺便询问一下16*16r这个示例您用了么,我按照手册做得不到正确答案。

chen xie:

回复 Allen35065:

您好!

想询问一下,按照c64+的那个dsplib中文fft手册,做16*16r对cache有优化的fft函数是,把一个函数分开写后,程序得不到正确结果。反而是直接用_r这个函数,memory显示是以前的一半,这个有可能是我才使用2048点的原因,但是我不确定。

在c66上如果要对cache优化的话,如果N大于2048时,是否还有必要把这个函数分开写成5个函数。

谢谢

Tim Zhang:

回复 chen xie:

1. 整数计算,就是输入输出都是整数。定点DSP做FFT要进行Q定标,FFT函数中输入输出都是int型。我指的是这个。我原来看的DSP_ifft32*32是采用整数运算的,TI工程师说的对,DSPLIB里的dspf_ifftsp*sp是浮点型运算的程序。

2. 我这里的64*32就是一个64行32列的二维数组,因为我做二维FFT,所以需要先作一次,转置后再作一次。

3.这个我没用啊。我刚才用了下dspf_ifftsp*sp,结果貌似不对,明天再研究。

我的QQ:(邮箱账号)jinzhang@vip.qq.com

欢迎加好友,有问题一起讨论方便些!

Tim Zhang:

回复 chen xie:

chen xie

您好!

想询问一下,按照c64+的那个dsplib中文fft手册,做16*16r对cache有优化的fft函数是,把一个函数分开写后,程序得不到正确结果。反而是直接用_r这个函数,memory显示是以前的一半,这个有可能是我才使用2048点的原因,但是我不确定。

在c66上如果要对cache优化的话,如果N大于2048时,是否还有必要把这个函数分开写成5个函数。

谢谢

chen xie:

回复 Tim Zhang:

这个函数DSP_fft16x16r (8192, &x[0],   &w[0],   y, 4,   0,  8192); 手册上说写成:

同样的功能可以分解成以下函数调用: DSP_fft16x16r(8192, &x[0], &w[0] , y, 2048, 0, 8192);DSP_fft16x16r(2048, &x[0], &w[2*6144], y, 4, 0, 8192);DSP_fft16x16r(2048, &x[2*2048],&w[2*6144], y, 4, 1*2048, 8192);DSP_fft16x16r(2048, &x[4*2048],&w[2*6144], y, 4, 2*2048, 8192);DSP_fft16x16r(2048, &x[6*2048],&w[2*6144], y, 4, 3*2048, 8192);

由于FFT运算过程中有三个数组需同时访问,在基于Cache访问的系统,如C64x+,这可能会导致Cache冲突,从而明显的降低效率。这样分开写可以避免Cache冲突。

但是目前c66下,我这样用数不对。

jianwen tong:

回复 chen xie:

你好,我在做6455的FFT时,调用库函数16X16r-i那个,结果老是不对,其他几个库函数结果也不对。我觉得可能是我调用方式或者输入数据有问题。能否发一个例程给我参考下,谢谢。我的原始输入数据是8比特整型的。调用库函数之前转换成了小数并用库函数转为Q.15格式了。

jianwen tong:

你好,我在做6455的FFT时,调用库函数16X16r-i那个,结果老是不对,其他几个库函数结果也不对。我觉得可能是我调用方式或者输入数据有问题。能否发一个例程给我参考下,谢谢。我的原始输入数据是8比特整型的。调用库函数之前转换成了小数并用库函数转为Q.15格式了。

赞(0)
未经允许不得转载:TI中文支持网 » 【C6678FFT】关于C64X与C66X DSPLIB中FFT的问题
分享到: 更多 (0)