主题中讨论的其他部件:FFTLIB
工具/软件:
尊敬的 TI:
我要实施 FFT 算法 在上 C7x DSP 直接连接。 为此、我使用的是中的代码 FFTlib BSL 代码。 但是、在确定可以使用哪些代码来运行 FFT 算法时遇到问题。 根据我的理解、大部分代码仅适用于 针对 FFT 算法配置内核 但它本身不包含 FFT 算法。
有人能告诉我可以使用 TI 提供的哪些文件来满足我的需求吗?
此致、
M é lanie
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.
工具/软件:
尊敬的 TI:
我要实施 FFT 算法 在上 C7x DSP 直接连接。 为此、我使用的是中的代码 FFTlib BSL 代码。 但是、在确定可以使用哪些代码来运行 FFT 算法时遇到问题。 根据我的理解、大部分代码仅适用于 针对 FFT 算法配置内核 但它本身不包含 FFT 算法。
有人能告诉我可以使用 TI 提供的哪些文件来满足我的需求吗?
此致、
M é lanie
但是、仍然存在一些与 d.c 和您的最后一个代码相关的灰色区域。
首先、 numPoints 变量的值代表什么?
const uint32_t numPoints = 64;
pY = (int16_t *) TI_memalign (64, numPoints * 2 * sizeof (int16_t));
(int16_t *) TI_memalign (64, numPoints * sizeof (int16_t));
此致、
M é lanie
您好 Melanie、
很高兴知道这一点、感谢您的更新。 上述共享代码在 J784S4 EVM 上验证、并可正常工作。
[引述 userid=“647126" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1530231/tda4vm-how-to-run-an-fft-algorithm-on-c7x-with-fftlib/5934220-我想我是以错误的方式声明 1D 缓冲区的。 事实上,我看到了这个警告:“缓冲区 bufParamsData 在其值被设置之前被使用“。 因此、我使用了中使用的方法 D.C 文件 。 这是你最后一次给我的方法。 您是否认为问题 可能来自该问题?
-而且,我对缓冲区的 data_type 字段输入了错误的数据类型: “bufParamsY"。“。
[/报价]是的、没错。
现在、包括 checkParams() 和 kernel() 函数在内的所有函数都在工作。 不再存在 代码在循环中运行的任何问题、因此非常棒。 [/报价]如果我们启用前面提到的宏、它应该可以正常工作。 默认情况下不是。
此致、
Betsy Varughese.
您好 Melanie、
上面提供的代码是针对一个示例场景实现的。
是 FFT 点数吗?
就是 FFTsize。
希望您已经浏览过本用户指南。

那么、您为什么这么说呢 numPoints * 2 * sizeof (int16_t) numPoints * 2 * sizeof (int16_t) 中的第二个字段 ti_memalign () 函数、如下所示:
当您处理复杂数据类型时。(请参阅 d.c)
您好 Betsy、
好的、很酷、很高兴来到这里。 感谢您对该代码部分的帮助!
是的、我已经浏览过用户指南、但信息的详细程度不是我想要的。 让我解释一下我的意思:
-首先、 我们是否同意这样一个事实,即 FFT 大小等于输入数据的值数(我们的例子中存储在 PX 中)? 根据内核函数 ci.cpp 文件中的代码、对我来说、答案是肯定的
-然后,对我来说,因为 FFT 算法的目的是快速计算 DFT , 存储输入数据的数据 (PX) 映射 实值。 所以对我来说,不需要在 TI_memalign () 函数的第二个字段中放置 2 个系数。 对我来说, 这样定义 PX 指针就足够了:
int16_t *pX = (int16_t *) TI_memalign (64, numPoints * sizeof (int16_t));
此致、
M é lanie
好的、
最后一个问题是、我想用 2048 点扩展 FFT 算法。 因此,我做了一些修改,并实施了该代码:
e2e.ti.com/.../8625.main.cpp
但是、我不传递 checkParameters funciton。 使用 TI_memalign () 分配空间是否有一些限制?
我认为还有另一个问题。老实说,我并不真正理解这个问题,因为你确认了我的意见 PX 参数“数值的 numPoints = 128,那么没有必要的因素 2。“
定义
FFTLIB_bufParams1D_t bufParamsX;
bufParamsX.dim_x = numPoints; // QUESTION !!! PQ SI JE RETIRE FACTEUR 2 CA FAIT UNE ERREUR
bufParamsX.data_type = FFTLIB_INT16; FFTLIB_bufParams1D_t bufParamsX; bufParamsX.dim_x = numPoints*2; // QUESTION !!! PQ SI JE RETIRE FACTEUR 2 CA FAIT UNE ERREUR bufParamsX.data_type = FFTLIB_INT16;checkParams 函数发送错误、而不是
您好 Melanie、
我们正在处理复杂的节点 代码用于 64 点复数 FFT、此处的 numPoints 为 64。
输入数包含实部和虚部、因此“dimx"应为“应为 输入数组 pX 的长度、即 128。 I.e、numPoints * 2.请参阅以下代码、了解 64 点复数 FFT。
#include <fftlib.h>
#include <c7x.h>
#include "common/FFTLIB_bufParams.h"
#include "common/FFTLIB_types.h"
#include <cmath>
#include <math.h>
#include "common/TI_memory.h"
#include <iostream>
#include <cstring>
#include <tw_gen.h>
using namespace std;
extern void tw_gen (int16_t *pW, uint32_t numPoints);
uint8_t FFTLIB_fft1d_i16sc_c16sc_o16sc_pBlock[FFTLIB_FFT1D_I16SC_C16SC_O16SC_PBLOCK_SIZE];
int16_t pX[] = {
-108, -126, 109, 86, 56, 62, -46, 8, -88, -101, -78, -127, 67, -33, -12, 97, 117, 109, 32, 91, -44, -118, 117, 72, 20, -43,
-66, -77, 82, 19, 31, -84, -22, -115, -46, -114, -30, -73, -115, 25, 118, 25, -18, 92, 61, 90, 67, -39, -21, 88, 11, 85,
-72, 86, 34, -107, -11, -113, -54, 125, -37, 3, 86, 38, -124, 89, 12, 90, 9, -13, -12, 22, 14, 17, -109, 84, 22, -16,
2, -79, 128, 76, 52, -53, -38, -105, 113, 106, 63, -110, -85, -68, -50, -82, 71, -124, 93, -16, 42, -122, 78, -70, -64, -45,
-118, 57, -127, 124, -17, -65, 117, -40, 12, 68, -70, -76, 6, -18, -96, -3, -70, -113, -111, 51, 92, -8, 104, -108};
const uint32_t pShift[] = {0, 0, 0};
const uint32_t numPoints = 64;
const uint32_t numShifts = 3;
int main(){
int16_t *pY, *pW;
FFTLIB_STATUS status = FFTLIB_SUCCESS;
pY = (int16_t *) TI_memalign (64, numPoints * 2 * sizeof (int16_t));
pW = (int16_t *) TI_memalign (64, numPoints * 2 * sizeof (int16_t));
FFTLIB_bufParams1D_t bufParamsData;
FFTLIB_bufParams1D_t bufParamsShift;
bufParamsData.dim_x = numPoints * 2;
bufParamsData.data_type = FFTLIB_INT16;
bufParamsShift.dim_x = numShifts;
bufParamsShift.data_type = FFTLIB_UINT32;
tw_gen (pW, numPoints);
status = FFTLIB_fft1d_i16sc_c16sc_o16sc_checkParams (
(int16_t *) pX, &bufParamsData, (int16_t *) pW, &bufParamsData,
(int16_t *) pY, &bufParamsData, (uint32_t *) pShift,
&bufParamsShift, FFTLIB_fft1d_i16sc_c16sc_o16sc_pBlock);
if(status == FFTLIB_SUCCESS){
status = FFTLIB_fft1d_i16sc_c16sc_o16sc_init (
(int16_t *) pX, &bufParamsData, (int16_t *) pW, &bufParamsData,
(int16_t *) pY, &bufParamsData, (uint32_t *) pShift,
&bufParamsShift, FFTLIB_fft1d_i16sc_c16sc_o16sc_pBlock);
}
if(status == FFTLIB_SUCCESS){
status = FFTLIB_fft1d_i16sc_c16sc_o16sc_kernel (
(int16_t *) pX, &bufParamsData, (int16_t *) pW, &bufParamsData,
(int16_t *) pY, &bufParamsData, (uint32_t *) pShift,
&bufParamsShift, FFTLIB_fft1d_i16sc_c16sc_o16sc_pBlock);
}
return 0;
}
此致、
Betsy Varughese.
您好 Melanie、
那么、对我来说、由于 FFT 算法的目的是快速计算 DFT、 存储输入数据的数据 (PX) 映射 实值。 所以对我来说,不需要在 TI_memalign () 函数的第二个字段中放置 2 个系数。 对我来说, 定义 PX 指针就足够了:
在此环境中 numPoints 的值是正确的。 但算法是针对复数实现的(从内核名称本身中可以清楚地看出)。
请您检查上述代码、如果您有任何进一步的疑问、请告诉我。
此致、
Betsy Varughese.
我尝试过、
我收到了与代码相同的错误消息。
我刚刚添加在 main 的最后一行 (return 0;) 和 staticRefOutput10 数组的声明之前
int val_res_FF = memcmp(pY,staticRefOutput10,numPoints * 2 * sizeof (int16_t));
assert(val_res_FF !=0);
cout << " Les valeurs de sorties obtenues sont correctes " << endl;[C71X_0] Assertion failed, (val_res_FF !=0), file ../main.cpp, line 449
这是奇怪的,因为我们有正确的输出值之前的情况下,我没有错误,我得到了相同的数据,如在 referenceoutput4 数组.. staticRefOutput10 数组的某些值可能出错吗?
这是我的输出、您能告诉我您的设备是否有任何区别吗?
e2e.ti.com/.../4606.sortiepYcalculee.txt
谢谢