Part Number:AWR1843BOOST
我使用的是demo是levelsense,我想把adc采样数据补0然后做fft。adc采样点我修改了64点,我补0到512点,然后对其进行FFT,我想着只需要修改其twiddle,就可以。我将附上没有修改前的代码和我修改后的代码,还有consolo报错日志。
1.修改前的代码:(twiddle初始化+使用FFT函数)
handle->twiddle = (float *)radarOsal_memAlloc((uint8_t) RADARMEMOSAL_HEAPTYPE_LL2, 0, 2 * handle->fft1DSize * sizeof(float), 8);
if (handle->twiddle == NULL)
{
*errorCode = RADARDEMO_HIGHACCURANGEPROC_FAIL_ALLOCATE_LOCALINSTMEM;
return (handle);
}
tw_gen_float(handle->twiddle, handle->fft1DSize);
void RADARDEMO_highAccuRangeProc_rangeEst(IN RADARDEMO_highAccuRangeProc_handle *highAccuRangeHandle,
OUT float * estRange,
OUT float * estRange1,
OUT float * estRange2,
OUT float * deltaPhaseEst,
OUT float * estLinearSNR)
{
int32_t i, j, k, rad1D, coarseRangeInd;
unsigned char * brev = NULL;
float totalPower, max, ftemp, sigPower, * RESTRICT powerPtr;
__float2_t f2input, * RESTRICT inputPtr, * RESTRICT inputPtr1;
int32_t zoomStartInd, zoomEndInd, itemp, tempIndFine1, tempIndFine2, tempIndCoarse, indMask, shift;
int32_t fineRangeInd, tempFineSearchIdx, tempCoarseSearchIdx;
__float2_t *RESTRICT wncPtr, wncoarse, *RESTRICT wnfPtr, wnfine1, sigAcc, f2temp;
double freqFineEst, fdelta, interpIndx;
floatcurrP, prevP, maxPrevP, maxNextP;
j = 30 - _norm(highAccuRangeHandle->fft1DSize);
if ((j & 1) == 0)
rad1D = 4;
else
rad1D = 2;
/* copy to scratch is needed because FFT function will corrupt the input. We need to preserve if for zoom-in FFT */
inputPtr = (__float2_t *) highAccuRangeHandle->inputSig;
inputPtr1 = (__float2_t *) &highAccuRangeHandle->scratchPad[2 * highAccuRangeHandle->fft1DSize];
for (i = 0; i < (int32_t)highAccuRangeHandle->fft1DSize; i++ )
{
f2input = _amem8_f2(inputPtr);
_amem8_f2(inputPtr1++) = f2input;
_amem8_f2(inputPtr)= _ftof2(_lof2(f2input), _hif2(f2input));
inputPtr++;
}
/* Do 1D FFT*/
inputPtr1 = (__float2_t *) &highAccuRangeHandle->scratchPad[2 * highAccuRangeHandle->fft1DSize];
DSPF_sp_fftSPxSP (
highAccuRangeHandle->fft1DSize,
(float*) inputPtr1,
(float *)highAccuRangeHandle->twiddle,
highAccuRangeHandle->fft1DOutSig,
brev,
rad1D,
0,
highAccuRangeHandle->fft1DSize);
2.修改后的代码:(twiddle初始化+使用FFT函数)
handle->twiddle = (float *)radarOsal_memAlloc((uint8_t) RADARMEMOSAL_HEAPTYPE_LL2, 0, 2 * 512 * sizeof(float), 8);
if (handle->twiddle == NULL)
{
*errorCode = RADARDEMO_HIGHACCURANGEPROC_FAIL_ALLOCATE_LOCALINSTMEM;
return (handle);
}
tw_gen_float(handle->twiddle, 512);
extern cplx16_t fftinput[512*10];
extern cplx16_t fftoutput[512*10];
extern int16_t* doptwi;
void RADARDEMO_highAccuRangeProc_rangeEst(IN RADARDEMO_highAccuRangeProc_handle *highAccuRangeHandle,
OUT float * estRange,
OUT float * estRange1,
OUT float * estRange2,
OUT float * deltaPhaseEst,
OUT float * estLinearSNR)
{
int32_t i, j, k, rad1D, coarseRangeInd;
unsigned char * brev = NULL;
float totalPower, max, ftemp, sigPower, * RESTRICT powerPtr;
__float2_t f2input, * RESTRICT inputPtr, * RESTRICT inputPtr1;
int32_t zoomStartInd, zoomEndInd, itemp, tempIndFine1, tempIndFine2, tempIndCoarse, indMask, shift;
int32_t fineRangeInd, tempFineSearchIdx, tempCoarseSearchIdx;
__float2_t *RESTRICT wncPtr, wncoarse, *RESTRICT wnfPtr, wnfine1, sigAcc, f2temp;
double freqFineEst, fdelta, interpIndx;
floatcurrP, prevP, maxPrevP, maxNextP;
j = 30 - _norm(512);
if ((j & 1) == 0)
rad1D = 4;
else
rad1D = 2;
/* copy to scratch is needed because FFT function will corrupt the input. We need to preserve if for zoom-in FFT */
inputPtr = (__float2_t *) highAccuRangeHandle->inputSig;
inputPtr1 = (__float2_t *) &highAccuRangeHandle->scratchPad[2 * highAccuRangeHandle->fft1DSize];
for (i = 0; i < (int32_t)highAccuRangeHandle->fft1DSize; i++ )
{
f2input = _amem8_f2(inputPtr);
_amem8_f2(inputPtr1++) = f2input;
_amem8_f2(inputPtr)= _ftof2(_lof2(f2input), _hif2(f2input));
inputPtr++;
}
int tempfft1dsize=highAccuRangeHandle->fft1DSize;
highAccuRangeHandle->fft1DSize=512;
/* Do 1D FFT*/cplx16_t inputtest[512];
//inputPtr1 = (__float2_t *) &highAccuRangeHandle->scratchPad[2 * highAccuRangeHandle->fft1DSize];
for(j=0;j<10;j++)
{for(k=0;k<512;k++){inputtest[k]=fftinput[j*512+k];//我的测试数据,类型为复数}DSPF_sp_fftSPxSP ((int)512,(float*) inputtest,(float *)highAccuRangeHandle->twiddle,(float*)&fftoutput[j*512],//测试输出位置brev,rad1D,0,highAccuRangeHandle->fft1DSize);
}
3.consolo报错
Debug: MMWDemoMSS Launched the Initialization Task
Debug: MMWDemoMSS mmWave Control Initialization was successful
[C674X_0] Debug: MMWDemoDSS ADCBUF Instance(0) @0080fdb0 has been opened successfully
Debug: MMWDemoDSS Data Path init succeeded
[Cortex_R4_0] Debug: CLI is operational
[C674X_0] Debug: MMWDemoDSS initTask exit
[Cortex_R4_0] numRangeBinZoomIn=2,left=0,right=0
enableRangeLimit=1,skipMin=1.000000,skipMax=3.000000
Debug: MMWDemoMSS Received CLI sensorStart Event
Debug: System Heap (TCM): Size: 65536, Used = 33376, Free = 32160 bytes
Debug: MMWDemoMSS mmWave config succeeded
[C674X_0] DSS:enableRangeLimit=1,skipMin=1.00,skipMax=3.00,rangeResolution=0.0586,skipLeft=17,skipRight=13
DDR Heap : size 65536 (0x10000), used 8248 (0x2038)
LL2 Heap : size 20480 (0x5000), used 7868 (0x1ebc)
LL2 Scratch : size 8192 (0x2000), used 1024 (0x400)
LL1 Scratch : size 16384 (0x4000), used 4096 (0x1000)
HSRAM Heap : size 8192 (0x2000), used 0 (0x0)
A0=0xffffffff A1=0x3d7c92b6
A2=0x80fb0c A3=0xe018bc
A4=0x7efe50 A5=0x0
A6=0x0 A7=0x7fffffff
A8=0x7fffffff A9=0x7f1bd4
A10=0x7fce24 A11=0x80f418
A10=0x7fce24 A11=0x80f418
{module#8}: "../dss/dss_main.c", line 200: error {id:0x10000, args:[0x80e16c, 0x80e16c]}
xdc.runtime.Error.raise: terminating execution
[Cortex_R4_0] xdc.runtime.Main: "../mss/mss_main.c", line 990: assertion failure
xdc.runtime.Error.raise: terminating execution
jian zhang:
我尝试把输出的数组设置在执行FFT的函数内,其代码和报错如下,希望能够有所参考
cplx16_t inputtest[512]; cplx16_t outputtest[512]; //inputPtr1 = (__float2_t *) &highAccuRangeHandle->scratchPad[2 * highAccuRangeHandle->fft1DSize]; for(j=0;j<10;j++) { for(k=0;k<512;k++) { inputtest[k]=fftinput[j*512+k];//我的测试数据,类型为复数 } DSPF_sp_fftSPxSP ( (int)512, (float*) inputtest, (float*)highAccuRangeHandle->twiddle, (float*)outputtest,//测试输出位置 brev, rad1D, 0, highAccuRangeHandle->fft1DSize); }
报错:Debug: MMWDemoMSS Launched the Initialization Task[C674X_0] Debug: MMWDemoDSS ADCBUF Instance(0) @0080fdb0 has been opened successfullyDebug: MMWDemoDSS Data Path init succeededDebug: MMWDemoDSS initTask exit[Cortex_R4_0] Debug: MMWDemoMSS mmWave Control Initialization was successfulDebug: CLI is operationalnumRangeBinZoomIn=2,left=0,right=0enableRangeLimit=1,skipMin=1.000000,skipMax=3.000000Debug: MMWDemoMSS Received CLI sensorStart EventDebug: System Heap (TCM): Size: 65536, Used = 33376, Free = 32160 bytesDebug: MMWDemoMSS mmWave config succeeded [C674X_0] DSS:enableRangeLimit=1,skipMin=1.00,skipMax=3.00,rangeResolution=0.0586,skipLeft=17,skipRight=13DDR Heap : size 65536 (0x10000), used 8248 (0x2038)LL2 Heap : size 20480 (0x5000), used 7868 (0x1ebc)LL2 Scratch : size 8192 (0x2000), used 1024 (0x400)LL1 Scratch : size 16384 (0x4000), used 4096 (0x1000)HSRAM Heap : size 8192 (0x2000), used 0 (0x0){module#8}: "../dss/dss_main.c", line 200: error {id:0x10000, args:[0x80e16c, 0x80e16c]}xdc.runtime.Error.raise: terminating execution[Cortex_R4_0] xdc.runtime.Main: "../mss/mss_main.c", line 990: assertion failurexdc.runtime.Error.raise: terminating execution
,
Cherry Zhou:
您好,我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!
,
Cherry Zhou:
您好,
当您follow到错误来源:
{module#8}: "../dss/dss_main.c", line 200: error {id:0x10000, args:[0x80e16c, 0x80e16c]}
此处给您的信息是什么?
然后跟您确认下,您是用64个数据点,然后用512 – 64 = 448补0填充该数据点,用来获取512点 FFT。 对吗? FFT 大小应为2的幂。
,
jian zhang:
是的,我是采用新建512大小的数组,然后把数组置0,然后把前64个点覆盖到前64个元素,然后送入FFT
,
Cherry Zhou:
好的了解。
,
Cherry Zhou:
请问您是怎样在修改后的代码中分配 fftinput的?
TI中文支持网

