關於使用HWA嘗試運行FFT遭遇困難

Other Parts Discussed in Thread: IWRL1432

你好,我正在嘗試使用iwrl1432 BSD 的板子,運行一段調用HWA來完成FFT的測試。我嘗試了好幾天,始終遇到同樣的問題。我已經在main裡面,open_HWA 並且將參數完整填入,進行HWA_enable。雖然有看到輸出結果(我有透過Uart打印出來) 但結果始終不符合預期。我輸入的測試data是一個振福100的sin wave,以int16為大小 sample = 128 輸入,輸出我預期是一個集中在某個bin的頻譜值。但不論我怎麼調整,輸出的內容,始終都是大量飽和的random值 (飽和意味著充斥的大量的 +32767 與 -32767) 。我不知道我哪裡出錯了,這是我第一次嘗試自己調用HWA。 以下是我的代碼:

{
HWA_ParamConfig paramCfg;
HWA_CommonConfig commonCfg;
uint32_t paramIdx;
uint32_t numSamples = 128U; //based on h_NumOfAdcSamples in common_full.c
int32_t status = SystemP_SUCCESS;

/* Open HWA driver */
gHwaHandle = HWA_open(0, NULL, &status);

if(gHwaHandle == NULL)
{
CLI_write("Error: Unable to open HWA instance. Error: %d\n", status);
DebugP_assert(gHwaHandle == NULL);
}

paramIdx = 0;
memset(&paramCfg , 0, sizeof(HWA_ParamConfig));

paramCfg.triggerMode = HWA_TRIG_MODE_SOFTWARE; 
paramCfg.accelMode = HWA_ACCELMODE_FFT;

int16_t *hwa_src_ptr = (int16_t *)hwa_src;
int16_t *hwa_dst_ptr = (int16_t *)hwa_dst;

for (int i = 0; i < 128; i++)
hwa_src_ptr[i] = (int16_t)(100.0f * sinf(2 * M_PI * i / 128));//(int16_t)(100.0f * sinf(2 * M_PI * i / 128)); //sin wave 

CacheP_wb(hwa_src_ptr, sizeof(int16_t) * 128,CacheP_TYPE_ALL);

paramCfg.source.srcAddr = HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(hwa_src); 
paramCfg.source.srcSign = HWA_SAMPLES_SIGNED;
paramCfg.source.srcAcnt = numSamples - 1U;
paramCfg.source.srcAIdx = sizeof(int16_t);
paramCfg.source.srcBcnt = 0U;
paramCfg.source.srcBIdx = 0U; /* dont care as bcnt is 0 */
paramCfg.source.srcWidth = HWA_SAMPLES_WIDTH_16BIT;
paramCfg.source.srcScale = 0x0; //0x8
paramCfg.source.srcRealComplex = HWA_SAMPLES_FORMAT_REAL;
paramCfg.source.srcConjugate = HWA_FEATURE_BIT_DISABLE; /* no conjugate */
paramCfg.source.bpmEnable = HWA_FEATURE_BIT_DISABLE;

paramCfg.dest.dstAddr = HWADRV_ADDR_TRANSLATE_CPU_TO_HWA(hwa_dst); 
paramCfg.dest.dstSkipInit = 0U;
paramCfg.dest.dstAcnt = numSamples - 1U;
paramCfg.dest.dstAIdx = 2*sizeof(int16_t); /* x 2 for real and complex output */
paramCfg.dest.dstBIdx = 0U; /* dont care as bcnt is 0 */
paramCfg.dest.dstRealComplex = HWA_SAMPLES_FORMAT_COMPLEX; 
paramCfg.dest.dstWidth = HWA_SAMPLES_WIDTH_16BIT;
paramCfg.dest.dstSign = HWA_SAMPLES_SIGNED;
paramCfg.dest.dstScale = 0U;
paramCfg.dest.dstConjugate = HWA_FEATURE_BIT_DISABLE; /* no conjugate */
paramCfg.accelModeArgs.fftMode.fftEn = HWA_FEATURE_BIT_ENABLE;
paramCfg.accelModeArgs.fftMode.fftSize = mathUtils_ceilLog2(numSamples);
paramCfg.accelModeArgs.fftMode.butterflyScaling = 0x0;//0x3f;
paramCfg.accelModeArgs.fftMode.windowEn = HWA_FEATURE_BIT_DISABLE;
paramCfg.accelModeArgs.fftMode.windowStart = 0U;
paramCfg.accelModeArgs.fftMode.winSymm = HWA_FFT_WINDOW_NONSYMMETRIC;
paramCfg.complexMultiply.mode = HWA_COMPLEX_MULTIPLY_MODE_DISABLE;
paramCfg.accelModeArgs.fftMode.magLogEn = HWA_FFT_MODE_MAGNITUDE_LOG2_DISABLED;
paramCfg.accelModeArgs.fftMode.fftOutMode = HWA_FFT_MODE_OUTPUT_DEFAULT;

#if (abs(hwa_src - hwa_dst) < CSL_APP_HWA_BANK_SIZE)
/* MEMACCESS config params warning */
CUSTOM_WARNING("HWA Param src and dst addresses shall not be from same memory bank");
#endif

status += HWA_configParamSet(gHwaHandle, paramIdx, &paramCfg, NULL);

if(SystemP_SUCCESS != status)
{
CLI_write("Error: HWA_configParamSet failed with error: %d!!\r\n", status);
}

if(SystemP_SUCCESS == status)
{
/* Init Common Params */
memset(&commonCfg, 0, sizeof(HWA_CommonConfig));
commonCfg.configMask = HWA_COMMONCONFIG_MASK_PARAMSTARTIDX |
HWA_COMMONCONFIG_MASK_PARAMSTOPIDX |
HWA_COMMONCONFIG_MASK_NUMLOOPS |
HWA_COMMONCONFIG_MASK_FFT1DENABLE |
HWA_COMMONCONFIG_MASK_TWIDDITHERENABLE |
HWA_COMMONCONFIG_MASK_LFSRSEED;

commonCfg.paramStartIdx = 0U;
commonCfg.paramStopIdx = 0U;
commonCfg.numLoops = 1U;
commonCfg.fftConfig.fft1DEnable = HWA_FEATURE_BIT_ENABLE;
commonCfg.fftConfig.twidDitherEnable = HWA_FEATURE_BIT_DISABLE;
commonCfg.fftConfig.lfsrSeed = 0x1234567;
status = HWA_configCommon(gHwaHandle, &commonCfg);
if(status != SystemP_SUCCESS)
{
CLI_write("Error: HWA_configCommon failed with error: %d\r\n", status);
}
}

if(SystemP_SUCCESS == status)
{
/* Enable done interrupt */
status = SemaphoreP_constructBinary(&gHwaDoneSem, 0);
DebugP_assert(status == SystemP_SUCCESS);
status = HWA_enableDoneInterrupt(gHwaHandle, HWAFFT_doneCallback, &gHwaDoneSem);
if(status != SystemP_SUCCESS)
{
CLI_write("Error: HWA_enableDoneInterrupt failed with error: %d\r\n", status);
}
}

DebugP_assert(status == SystemP_SUCCESS);

/* Enable HWA */
status += HWA_enable(gHwaHandle, 1U);
DebugP_assert(SystemP_SUCCESS == status);

HWA_setSoftwareTrigger(gHwaHandle);

SemaphoreP_pend(&gHwaDoneSem, SystemP_WAIT_FOREVER);
CacheP_inv(hwa_dst_ptr, sizeof(int16_t) * 256, CacheP_TYPE_ALL);

}

}

//這是輸出的內容 通過uart打印:

0 32767 -32767 32767 32767 32767 32767 -32767 32767 -32767 -32767 -32767 -32767 32767 -32767 32767 -32767 32767 -32767 -32767 32767 -32767 32767 32767 32767 32767 0 32767 -32767 32767 -32767 32767 -32767 32767 -32767 32767 32767 32767 -32767 32767 32767 -32767 -32767 32767 -32767 0 -32767 -32767 0 32767 -32767 32767 32767 32767 -32767 -32767 32767 32767 -32767 -32767 -32767 -32767 32767 -32767 -32767 -32767 -32767 32767 32767 -32767 -32767 -32767 -32767 32767 32767 -32767 32767 -32767 -32767 32767 -32767 32767 32767 32767 32767 -32767 -32767 32767 -32767 -32767 -32767 32767 -32767 -32767 32767 32767 32767 32767 32767 -32767 32767 -32767 32767 32767 32767 32767 32767 -32767 32767 32767 32767 -32767 -32767 32767 32767 32767 32767 32767 -32767 -32767 32767 -32767 -32767 32767 32767 -32767 32767 32767 0 32767 32767 0 -32767 -32767 32767 32767 -32767 32767 0 -32767 -32767 32767 -32767 32767 32767 32767 -32767 -32767 -32767 32767 -32767 -32767 -32767 32767 -32767 -32767 -32767 -32767 -32767 -32767 -32767 32767 -32767 32767 32767 0 32767 32767 32767 -32767 -32767 32767 -32767 -32767 -32767 32767 32767 32767 32767 32767 0 -32767 -32767 -32767 32767 32767 -32767 -32767 -32767 -32767 32767 32767 32767 -32767 -32767 -32767 0 -32767 32767 -32767 -32767 32767 -32767 32767 -32767 32767 32767 32767 0 32767 32767 -32767 32767 0 -32767 32767 -32767 -32767 32767 32767 32767 32767 32767 32767 32767 32767 -32767 32767 32767 32767 0 32767 -32767 32767 32767 32767 -32767 -32767 32767 32767 32767 32767 32767 32767 32767 32767 32767 -32767 -32767 32767 -32767 -32767 -32767 32767 32767 32767 (總共有256個 裡面充斥大量飽和數值)