使用DSP进行FFT运算,发现FFT利用库函数很快,主要是其他操作拖慢了时间,主要在这几个地方
在代码声明了4个全局变量
float fft_data[1024]; float ff_out[2048]; float fft_out_img[1024] float fft_out_real[1024];
1. 使用的数据放在存放在DDR上,利用memcpy把数据移动到fft_data,比较慢
float *p = (float*)(data_ddr_base + offset) memcpy(fft_data, p, 4*range_gate);
然后做了一个fft运算,结果存到fft_out里面,这里很快
2. 需要对结果的每个复数做如下计算, abs = sqrt(real * real + img * img),把fft_out中每个复数的实部和虚部分开,这里也比较慢
for(i=0;i<FFT_DATA_NUMBERS;i+=2) {fft_out_real[i/2] = fft_out[i];fft_out_img[i/2] = fft_out[i+1]; }
3. 最后要把结果做累加,存储在DDR里面,这里也比较慢
float *p = (float*) result_addr DSPF_sp_vecadd(p, fft_out, p, FFT_RESULT_NUMBERS);
请问这几个地方该如何优化啊?
Shine:
1. memcpy函数是CPU搬数据,速度比较慢,建议用EDMA搬数据。
2. 打开-o3优化选项编译。
3. 用EDMA搬移到DDR里面。
4. 还可以打开cache。
,
dejian wei:
谢谢,请问打开cache和使用edma,有相关教程么,有参考的例子程序么?
,
Shine:
请问使用的是哪款DSP芯片?通常processor SDK软件包里有例程。
,
dejian wei:
使用的是C6678那一款,例程在PDK里面找到了,教程有么?cache是不是看 SPRUGY8,edma是不是看SPRUGS5B。
,
Shine:
是的,结合例程看这两篇文档。