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.

[参考译文] TMS320F28377D:使用示例工程的 FFT 输出不正确?

Guru**** 2544160 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/595235/tms320f28377d-incorrect-fft-output-using-example-project

器件型号:TMS320F28377D
Thread 中讨论的其他器件:controlSUITE

我不明白为什么在使用 TI FFT 库时会获得意外结果。  使用2837x_vcu2_rfft_512示例项目(来自 controlSUITE 3.4.6中的 v2_10_00_00)。  以下是重现问题的步骤:

1) 1)加载 CCS 7.1.0.00016。

2) 2)加载调试器、而不对示例工程进行任何修改。

3) 3)在 I the init()调用上设置一个断点并运行到该行。

4) 4)使用存储器浏览器的"加载存储器"功能将附加的输入文件加载到 buffer1Q15、然后在此处绘制图形:

5) 5)继续运行几行,直到 unpack()调用之后。  buffer2Q15中的输出如下:

输入是使用硬件信号发生器生成的、因此并不完美、但人们不会期望在第一个信号发生器之外看到任何实质性尖峰。  (实际上、相同输入数据上的 Matlab FFT 类似于所述。)  我没有进行过广泛的实验、但在我的原始应用中、当采样率为100KHz 且正弦波为3KHz 时、我会看到奇次谐波是什么样的;在100KHz 和4KHz 的情况下、看起来额外的尖峰是偶次谐波。

我是忽略某些内容、还是这是与 FFT 库相关的错误?  谢谢。

戴维

e2e.ti.com/.../example_5F00_code_5F00_input.dat

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

    David、

    我使用您的数据运行了示例、并得到了基波。

    步骤1:我按照您描述的方式加载数据

    步骤2:我设置一个双图来显示512个无符号整型点、顶部图中的 buffer1Q15、底部图中的 buffer2Q15

    步骤3:运行后()

    步骤4:解压缩后()

    在 buffer1Q15中、我看到了复频谱、如果我们采用幅度、您会在第15个单元中看到基频、其结果为15*(100e3/512)= 2929.6875 ~ 3KHz、加上基频周围的一些泄漏。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、感谢您的帮助。 因此,关键似乎是我看到了错误的缓冲区,这当然现在看起来很简单。 :)对于它的价值,我建议使文件更清晰是值得的。 CFFT_unpack()在用户指南和代码中用"这是一种就地算法;例程将输出写入输入缓冲器本身"来描述;这充其量是误导性的。

    为清楚起见、您说第15个纸槽时、您的意思是~第31个纸槽、对吧? 据我所知、当输出未镜像时、它应为31*(((100e3 / 2)/512)=~3KHz。

    此外、您能否分享一下您如何获取显示全部512个点的图形?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="dDuncan">对于它的价值、我建议使文档更清晰。 CFFT_unpack()在用户指南和代码中用"这是一种就地算法;例程将输出写入输入缓冲器本身"来描述;这充其量是误导性的。

    实际上,虽然我所引用的语句可能有点不清楚,但我现在可能更好地理解了---- RUN()函数可能也被认为是"就地"(尽管它使用了另一个缓冲区)。  我想、虽然文档可能更清晰、但这是合理的、我的错也同样重要、因为我在回来的时候不会为自己留下更好的评论、因为我最初的实施很好。

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

    run()函数可能也被视为"就地"(尽管它使用了另一个缓冲区)。  [/报价]

    run()就地。 它需要两个缓冲器、每个 FFT 的两个级切换输入和输出缓冲器、因此最终会丢失 buffer1Q15中的原始输入。 FFT 结构保持两个点引脚和 PoUT、以跟踪每个级的输入和输出; 为了避免跟踪最终输出的麻烦、PoUT 应始终指向输出所在的位置(可以是 buffer1Q15或 buffer2Q15、具体取决于 FFT 的大小)。

    现在,unpack()就位了。 它将 run()中的输出(无论 pout 指向哪个 run()之后)作为输入,并在该缓冲区上执行它的操作。

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

    谢谢、这似乎是一个很好的解释。  我没有意识到重要的舞台数量,我想,乒声只是连续调用图书馆的时间。