This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Starterware/TMDSLCDK6748:DSLIB 中的 DSPF_sp_fftSPxSP 产生错误结果

Guru**** 2575385 points
Other Parts Discussed in Thread: TMDSLCDK6748

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/628007/starterware-tmdslcdk6748-dspf_sp_fftspxsp-in-dslib-produces-wrong-results

器件型号:TMDSLCDK6748
Thread 中讨论的其他器件: OMAPL138

工具/软件:Starterware

您好!

DSPLIB 中的 FFT 函数 DSPF_sp_fftSPxSP 产生错误的结果。 我使用以下硬件和软件:

  • TMDSLCDK6748
  • CCS 版本:7.2.0.00013
  • PROCESSOR_SDK_RTOS_Omapl138_4_00_00_04 (RTOS 4)
  • DSPLIB_C674x_3_4_0_0

我正在使用提供的 FFT 示例: RTOS 4附带的 Benchmark FFT_lcdkOMAPL138_c674ExampleProject、并进行了以下更改:

/*------------------------------------ *
/*暂时初始化输入矢量。 *
/*------------------------------------ *
对于(I = 0;I < N;I++)
{
// X_CN[焊盘+ 2 * I] = sin (2 * 3.1415 * 50 * i /(double) N);//old
// X_CN[PAD + 2 * I + 1]= sin (2 * 3.1415 * 100 * I /(double) N);//old
X_CN[焊盘+ 2 * I] = sin (2.0 * pi *(double)(i))/(double)(8));//新建
X_CN[PAD + 2 * I + 1]= 0; //new
#if defined (_TMS320C6600)
X_SA[焊盘+ 2 * I] = x_CN[PAD + 2 * I];
X_SA[PAD + 2 * I + 1]= x_CN[PAD + 2 * I + 1];
#endif
X_I [PAD + 2 * I] = x_CN[PAD + 2 * I];
X_I [PAD + 2 * I + 1]= x_CN[PAD + 2 * I + 1];
}

如果(N <= 16) //新建
{ //新建
audio_log ("\n\nDSPF_sp_fftSPxSP、N=%d、基数=%d\n"、//new
N、rad); //新建
对于(I = 0;I <(2 * N);I++) //新建
{ //新建
AUDIO_LOG ("输入 x_i[%3D]=%14.6f\n"、 //新建
i、ptR_x_i[i]); //新建
} //新建
} //新建
DSPF_sp_fftSPxSP (N、&PTR_x_i[0]、&PTR_w[0]、PTR_y_I_I、Brev、 rad、0、N);
如果(N <= 16) //新建
{ //新建
对于(I = 0;I <(2 * N);I++) //新建
{ //新建
audio_log ("输出 y_i[%3D]=%14.6f\n"、 //新建
i、ptR_y_i[i]); //新建
} //新建
} //新建

现在、N=8的程序输出为:

[C674x_0]/*----------------------------------------
针对 N 个样本的*//*单精度 FFT 基准 */
///*-------------------------------------------------------------------------------------------- //
DSPF_sp_fftSPxSPIter#:1

DSPF_sp_fftSPxSP、N=8、基数=2
输入 x_i[0] 0.000000
输入 x_i[1]= 0.000000
输入 x_i[2]= 0.707107
输入 x_i[3]= 0.000000
输入 x_i[4]= 1.000000
输入 x_i[5]= 0.000000
输入 x_i[6]= 0.707107
输入 x_i[7]= 0.000000
输入 x_i[8]= 0.000000
输入 x_i[9]= 0.000000
输入 x_i[10]= -0.707107
输入 x_i[11]= 0.000000
输入 x_i[12]= -1.000000
输入 x_i[13]= 0.000000
输入 x_i[14]= -0.707107
输入 x_i[15]= 0.000000
输出 y_i[0]= 0.000000
输出 y_i[1]= 0.000000
输出 y_i[2]= -2.000000
输出 y_i[3]= -2.000000
输出 y_i[4]= 0.000000
输出 y_i[5]= -0.000000
输出 y_i[6]= 2.000000
输出 y_i[7]= 2.000000
输出 y_i[8]= 0.000000
输出 y_i[9]= 0.000000
输出 y_i[10]= -2.000000
输出 y_i[11]= 2.000000
输出 y_i[12]= 0.000000
输出 y_i[13]= -0.000000
输出 y_i[14]= 2.000000
输出 y_i[15]= -2.000000
内在函数成功N = 8、基数= 2、natc:310optC:199465
DSPF_sp_fftSPxSPIter#:2.

输入为实数信号:频率= f_sample/8的正弦信号。 频率的选择方式应确保我们获得准确的结果:在频率 f_sample/8和 7 * f_sample/8处、我们应得到大于0的值、所有其他频率应为0。 这意味着、如果 N=8且具有复数输出数组、则索引2和3以及14和15的值应大于0、所有其他索引应为0。 但情况并非如此:索引6和7以及10和11也有值(频率3 * f_sample / 8和5 * f_sample / 8)。

出什么问题了?

我意识到在真实信号上有更有效的 FFT 方法、但是、复杂信号的 FFT 也应该适用于真实信号。

备注:还有另一个问题,当添加的 print 语句使程序变慢时,就会发生这种情况。 需要在 main 的开头添加以下指令:

/*
*清除 CSR 和 IER 寄存器。 这是禁止中断所必需的
*无法启用中断、无法为中断提供服务。
*
_asm ("\t zero\t\t B0");
_asm ("\t mvc\t\t b0、IER);
_asm ("\t mvc\t\t b0、csr");

有关更多详细信息、请参阅文章"TMDSLCDK6748:从新 CCS 工程挂起中进行程序"。

此致、

广告

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已通知 RTOS 团队。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您提供详细信息。 让我尝试重现此问题、然后我会回来。

    此致、
    Rahul
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Rahul、

    您是否能够重现问题?
    此致、
    广告