我使用的是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