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格式了。