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.

AWR1843BOOST: FFT函数使用失败

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;
	float           currP, 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;
	float           currP, 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

  • 我尝试把输出的数组设置在执行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 successfully
    Debug: MMWDemoDSS Data Path init succeeded
    Debug: MMWDemoDSS initTask exit
    [Cortex_R4_0] Debug: MMWDemoMSS mmWave Control Initialization was successful
    Debug: CLI is operational
    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)
    {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

  • 您好,我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 您好,

    当您follow到错误来源:

    {module#8}: "../dss/dss_main.c", line 200: error {id:0x10000, args:[0x80e16c, 0x80e16c]}

    此处给您的信息是什么?

    然后跟您确认下,您是用64个数据点,然后用512 - 64 = 448补0填充该数据点,用来获取512点 FFT。 对吗? FFT 大小应为2的幂。

  • 是的,我是采用新建512大小的数组,然后把数组置0,然后把前64个点覆盖到前64个元素,然后送入FFT

  • 请问您是怎样在修改后的代码中分配 fftinput的? 

  • 你好,请问你的数组fftinput分配内存空间了吗,是不是没有分配空间导致的