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.
我需要1024点 FFT (双向)的示例代码、并需要在稳定相应器件用于生产之前评估 CPU 功率是否足以满足产品的 DSP 要求。
TI 文献建议将 VCU0用于 FFT 将使速度提高4倍或5倍、但相关帖子中的计数器示例似乎使这些希望落空。
q1))澄清一下、如果我使用 C28x VCU for FFT、使用 IQmath 所需的格式是什么、或者这只是定点数学的通用术语吗?
Q2)自从我开始使用实数数据,然后处理 iFFT 返回实数数据, RealFFT 是最有效的还是尝试对2组数据执行 ComplexFFT ... ?
Q3)更易混淆:CLA_FFT1024库调用是否与使用 VCU 或实际 CLA 块相同?
Q4)如果我可以在 VCU0中使用16位 IQmath、那么为什么它不应该比在 FPU 上更快?
Q5)、因为 VCU0具有3深(?) 流水线中、使用5级4点 FFT 而不是10级2点 FFT 会更高效吗?
Q6) 从何处可以获取使用 C28x+VCU0+TMU 的1024点 FFT 的代码?
Q7)或者、我是不是一直在使用32位 FPU、如果是、我在哪里可以获得1024采样 FFT (C28x+FPU)的示例代码? 实际上、这两者会更好、因此我可以进行比较。
Q8)为什么库中的示例代码只指向256/512点 FFT? 1024点 FFT 是否不适用于 C28x+VCU0数学或 HW?
Q9)我假设为了获得最佳性能、我需要将 FFT 例程放在 RAM 中。 您能提供一个如何执行此操作的好示例吗?
谢谢、Dan
Dan、您好!
对于问题2、5、6、8、我将邀请 VCU 专家来帮助回答这些问题(因为在美国是一个漫长的周末、下周早些时候会有回复)。
此致、
Omer Amir
Dan、
2.首先对实数数据使用 RFFT,然后对复数 FFT 数据使用 iCFFT。
5.我需要检查一下这个。 实现的是标准实现。
6. VCU0 (例如 F28004x) DSP 库不为1024-pt CFFT 提供 asm 代码。 它最多的是256-pt CFFT。 VCU2 (例如 F2837x) DSP 库确实为1024-pt CFFT 提供 asm 代码。 VCU2具有特定的 CFFT 硬件指令。 通常不需要 TMU、因为 Twiddle 因子是在表中预先计算的。
FPU asm 代码的编写更加通用、而不是特定于 FFT 大小。
8. 不幸的是,这些是10多年前开发的,我们没有背景,为什么他们停止在256-pt CFFT ASM 与 VCU0。 我看不出为什么你不能超越,但这不是我们积极投资的东西。
谢谢。
SIRA
您好 Omar 和 Sira ,感谢您的意见。 我相信我已经找到了正确的例子(埋在各种图书馆中:-),并一直在做很多 选择 FFT 的真实数据。
我现在看到1024pt"仅实数数据"示例(FPU)本身调用512端口复数 FFT、然后执行展开操作。
我正在努力整合工作代码、本周、以确认我的理解。 如果我的计算结果正确、那么对于第一阶段的开发、我应该能够仅使用 FPU 来实现、然后了解可能如何迁移到基于 CLA 的16位 FFT 以实现更快的计算(更慢的时钟)。
q)在理想情况下(我从16位实时域数据开始)、为什么我不能将基于 VCU 的 FFT 用于正向 FFT、然后使用 CLA 转换为单精度浮点、进行一些处理、然后使用主内核的 FPU 来执行 iCFFT 以进行最终的时域步长?
感谢 您(Omar 和 sira)的帮助!
Dan
9.我认为 Dan 的问题是如何在代码从闪存运行时的通用情况下进行设置。 我们的 FFT 示例(至少为 FPU DSP CFFT_F32示例)仅具有 RAM 编译配置、对他没有多大帮助。
因此、您需要考虑在特定用例中哪些功能可以放入 RAM 中
-您能在 RAM 中安装缓冲器吗?
-你能够从 RAM 中运行整个库吗,在这种情况下,你可以修改链接器 cmd 文件,如下所示
培训师
{
.TI.ramfunc
{
-l c28x_vcu0_library_fpu32.lib
}
}LOAD = FLASHC、
RUN = RAMLS1、
RUN_START (RamfuncsRunStart)、
Load_start (RamfuncsLoadStart)、
Load_Size (RamfuncsLoadSize)、
PAGE = 0
-还是只能从 RAM 中运行库的一部分、在这种情况下、你可以 修改链接器 cmd 文件、如下所示(只是一个示例)
.TI.ramfunc:load = FLASHC、
RUN = RAMLS1、
RUN_START (_RamfuncsRunStart)、
Load_start (_RamfuncsLoadStart)、
Load_Size (_RamfuncsLoadSize)、
PAGE = 0
{
-- library=driverlib.lib (.text)
}
Sira、您是对的。 如果我可以从 RAM 运行全部、那么很好、 但我的直觉是、我可能必须优化主要的 FFT 功能以便从 RAM 运行、并将其余部分放在闪存中、因此、最终我可能需要通过一个示例来执行此操作(尤其是当我尝试优化资源以用于选择生产器件时)。
我非常想了解您对使用全部三种资源进行混合计算的最后一大难题的看法:对16位数据使用 VCU 的快速复数数学单元、以及 位于 CLA 和 CPU+FPU 的两个 FPU。
Dan、
我有一些跟进问题:
-为什么要在执行整数 FFT 后转换为浮点? 为什么不坚持使用整数 FFT 和 IFFT?
如果你需要浮点表示、我仍然不明白为什么你需要 CLA 来从 int 转换为 float。 这样做可能效率低下。 您可能最好在 FPU32上运行转换。
谢谢。
SIRA
尊敬的 Sira:
对于最终产品、我认为最好尽快完成计算、然后关闭(进入某种低功耗模式)、直到需要重复为止。 那么、尽可能多地使用计算资源难道没有意义吗?
CPU+FPU 和 CLA 都使用 FPU32。 通过分离步骤、我可以使用所有资源以最快的速度完成工作。 我认为 CLA 的 FPU 可以执行转换、也许可以使用 VCU、因为它有更多的可用时间、但是这在发生转换的情况下并不重要、我可以用全部三种计算资源获得最佳吞吐量。不是吗?
这是一个后续问题。 在 FPU 示例代码中,我认为 FFT 缓冲区必须为地址对齐才能使 FFT 正常工作。 但是、下面的示例定义了一个大小不是2的幂的缓冲器:
#define test_size (256U)
#pragma DATA_SECTION (test_output、"FFT_buffer_2")
float test_output[test_size + 2U];
这怎么可能呢?
Dan、
尽快进行计算绝对是不错的做法、但您建议的方法是使用 VCU0进行 FFT、然后将 CLA 用于某些运算(浮点转换)、然后将 FPU32用于 IFFT。 这都是顺序的、而不是真正利用架构提供的并行性。 通常、我们的客户将在 C28x CPU+FPU 上运行一些操作、并且并行在 CLA 上运行其他操作。
因此、在您的情况下、如果您的应用可以在 FPU32上并行运行其他东西、并且如果您在 CLA 上仍有更多要并行执行的操作、那么使用 VCU 作为 FFT、然后使用 VCU 作为 IFFT 可能是有意义的。
这取决于您的应用和用例要求、而我不知道这一点。 在此基础上、您可以调用最适合您需求的 C2000器件。
我认为对齐限制在闪存中的输入缓冲器(是2的幂)、而不是输出缓冲器。
#if defined (FFT_ALIGN)
FFT_BUFFER_1:>RAMLS、ALIGN = FFT_ALIGN
FFT_BUFFER_2 :> RAMLS
谢谢。
SIRA
尊敬的 Sira:
当然、我会并行执行操作、因为我的处理可以进行流水线处理、可以容忍一点流水线延迟。 我认为这是显而易见的。 :-)
我现在正在编写代码、如果有任何其他问题、我们会回来解答。 感谢您的帮助。
Dan
Dan、
边界的问题。 缓冲区的长度不是一个因素。 align ()的输入必须是2的幂。
谢谢。
SIRA