您好,我使用的是:D:\zj\AutomotiveToolbox\AutomotiveToolbox4.11\new\mmwave_industrial_toolbox_4_11_0\labs\Level_Sensing\src\16xx
我在其下属high_accuracy_16xx_dss/RADARDEMO_highAccuRangeProc_priv.c这个文件中,为了实现补0提高测距精度,我在其开头定义了两个数组,如下图

并在后续对其进行了初始化,将ADC的512个点赋予第一个数组addzeros111,然后将后续的初始化为0。然后调用dft函数对其进行运算。奇怪的是,只有这个数组大小为2*512,也就是和DEMO原来数组大小一样的时候才能正常运行,一旦超出这个大小,都会出现以下错误

我不能理解是为什么,我已经查看过DFT函数,其是根据输入的数组大小自适应调整其内部函数变量的,不存在锁定某一个值的情况,困扰了我很久了,希望有专家可以跟进一下,我将我的代码附在下面以供调用,我只修改了这一个文件,因此您可以在您的Automotive工具箱中替换它以分析。希望有人可以给出我一个可以运行的补0fft的数组代码,我的需求是将其补到4500个点左右,如果是复数采样则需要2*4500=9000个float数组。需要两个这样的数组,一个用来放原始数据,一个用来放dft之后的数据。
/*!
* \file RADARDEMO_highAccuRangeProc_priv.c
*
* \brief Windowing functions for range processing.
*
* Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "RADARDEMO_highAccuRangeProc_priv.h"
#ifdef _TMS320C6X
#include "c6x.h"
#endif
#ifdef ARMVERSION
extern void dft(int size, float * input, float * output);
#endif
#ifndef ARMVERSION
#pragma DATA_SECTION(addzeros111,".l3data");
float addzeros111[4*512];
#pragma DATA_SECTION(addzerosoutput122,".l3data");
float addzerosoutput122[4*512];
/*!
\fn RADARDEMO_highAccuRangeProc_accumulateInput
\brief Accumulate signals from all chirps and convert to floating-point format with 1D windowing.
\param[in] nSamplesPerChirp
Number of samples per chirp.
\param[in] fftSize1D
1D FFT size.
\param[in] nChirpPerFrame
Number of chirps per frame.
\param[in] fftWin1D
Input pointer to 1D window function.
\param[in] fftWin1DSize
Number of ADC bits.
\param[in] inputPtr
Pointer to input signal.
\param[in] chirpInd
Flag to enable DC adjustment for ADC samples when set to 1. Otherwise, no preprocessing for ADC samples.
\param[out] outputPtr
Pointer to the output signal.
\pre none
\post none
*/
void RADARDEMO_highAccuRangeProc_accumulateInput(
IN uint32_t nSamplesPerChirp,
IN uint32_t fftSize1D,
IN uint32_t nChirpPerFrame,
IN float * RESTRICT fftWin1D,
IN int16_t fftWin1DSize,
IN cplx16_t * RESTRICT inputPtr,
IN int32_t chirpInd,
OUT float * outputPtr)
{
int32_t i;
float * tempOutputPtr;
if (chirpInd == 0)
{
for( i = (int32_t)nSamplesPerChirp - 1; i >= 0; i--)
{
*outputPtr++ = (float)inputPtr->real;
*outputPtr++ = (float)inputPtr->imag;
inputPtr++;
}
}
else
{
tempOutputPtr = outputPtr;
for( i = (int32_t)nSamplesPerChirp - 1; i >= 0; i--)
{
*tempOutputPtr++ += (float)inputPtr->real;
*tempOutputPtr++ += (float)inputPtr->imag;
inputPtr++;
}
if (chirpInd == ((int32_t)nChirpPerFrame - 1))
{
float fwin1D;
float *tempOutputPtr;
tempOutputPtr = &outputPtr[2*nSamplesPerChirp - 1];
for( i = fftWin1DSize - 1; i >= 0; i--)
{
fwin1D = *fftWin1D++;
*outputPtr = *outputPtr * fwin1D;
outputPtr++;
*outputPtr = *outputPtr * fwin1D;
outputPtr++;
*tempOutputPtr = *tempOutputPtr * fwin1D;
tempOutputPtr--;
*tempOutputPtr = *tempOutputPtr * fwin1D;
tempOutputPtr--;
}
if (((int32_t)fftSize1D - (int32_t)nSamplesPerChirp) > 0)
{
tempOutputPtr = &outputPtr[2*nSamplesPerChirp];
for( i = 0; i < ((int32_t)fftSize1D - (int32_t)nSamplesPerChirp); i++);
{
*tempOutputPtr++ = 0.f;
*tempOutputPtr++ = 0.f;
}
}
}
}
}
/*!
\fn RADARDEMO_highAccuRangeProc_rangeEst
\brief Windowing function for 2D FFT and prepare for the input.
\param[in] highAccuRangeHandle
Handle to the module.
\param[out] estRange
Estimated range.
\param[out] deltaPhaseEst
Estimated delta phase.
\param[out] estLinearSNR
Estimated SNR.
\pre none
\post none
*/
void RADARDEMO_highAccuRangeProc_rangeEst(
IN RADARDEMO_highAccuRangeProc_handle *highAccuRangeHandle,
OUT float * estRange,
OUT float * deltaPhaseEst,
OUT float * estLinearSNR)
{
int32_t i, j, rad1D, coarseRangeInd;
unsigned char * brev = NULL;
float totalPower, max, ftemp, sigPower, * RESTRICT powerPtr;
float finput, * RESTRICT inputPtr, * RESTRICT inputPtr1,* RESTRICT inputPtr3,* RESTRICT inputPtr4;
int32_t i1, j1, k1, coarseRangeInd1 = highAccuRangeHandle->coarseRangeInd;
float max1, ftemp1;
int32_t zoomStartInd2, zoomEndInd2, itemp2, tempIndFine1, tempIndFine2, tempIndCoarse, indMask, shift;
int32_t fineRangeInd, tempFineSearchIdx, tempCoarseSearchIdx;
float *RESTRICT inputPtr2, *RESTRICT wncPtr, *RESTRICT wnfPtr, sigAccReal, sigAccImag;
float freqFineEst, fdelta, finputReal, finputImag, tempReal, tempImag;
j = highAccuRangeHandle->log2fft1DSize;
if ((j & 1) == 0)
rad1D = 4;
else
rad1D = 2;
#if(1)
/* copy to scratch is needed because FFT function will corrupt the input. We need to preserve if for zoom-in FFT */
inputPtr = (float *) highAccuRangeHandle->inputSig;
inputPtr1 = (float *) &addzeros111[0];
inputPtr4=(float *) &addzerosoutput122[0];
for (i = 0; i <((int32_t)highAccuRangeHandle->fft1DSize)*2; i++ )
{
if(i<(int32_t)highAccuRangeHandle->fft1DSize)
{
*inputPtr1++ = *inputPtr++;
*inputPtr1++ = *inputPtr++;
*inputPtr4++ = 0;
*inputPtr4++ = 0;
}
else
{
*inputPtr1++ = 0 ;
*inputPtr1++ = 0 ;
*inputPtr4++ = 0 ;
*inputPtr4++ = 0;
}
}
inputPtr1 = (float *) &addzeros111[0];
inputPtr4=(float *) &addzerosoutput122[0];
dft(2*highAccuRangeHandle->fft1DSize, (float*) inputPtr1, (float *)addzerosoutput122);
#if(0)
inputPtr1 = (float *) &highAccuRangeHandle->fft1DOutSig[0];
for( i = 0; i < (int32_t)highAccuRangeHandle->skipLeft; i++ )
{
*inputPtr1++ = 0.f;
*inputPtr1++ = 0.f;
}
inputPtr1 = (float *) &highAccuRangeHandle->fft1DOutSig[2*((int32_t)highAccuRangeHandle->fft1DSize- (int32_t)highAccuRangeHandle->skipRight)];
for( i = (int32_t)highAccuRangeHandle->fft1DSize- (int32_t)highAccuRangeHandle->skipRight; i < (int32_t)highAccuRangeHandle->fft1DSize; i++ )
{
*inputPtr1++ = 0.f;
*inputPtr1++ = 0.f;
}
max = 0.f;
totalPower = 0.f;
coarseRangeInd = 0;
inputPtr = (float *)highAccuRangeHandle->fft1DOutSig;
powerPtr = (float *)highAccuRangeHandle->scratchPad;
for( i = 0; i < (int32_t)highAccuRangeHandle->fft1DSize; i++ )
{
finput = (*inputPtr) * (*inputPtr);
inputPtr++;
finput += (*inputPtr) * (*inputPtr);
inputPtr++;
ftemp = finput;
powerPtr[i] = ftemp;
totalPower += ftemp;
if( max < ftemp )
{
max = ftemp;
coarseRangeInd = i;
}
}
#endif
#endif
highAccuRangeHandle->coarseRangeInd = 1;
i = coarseRangeInd;
sigPower = 1;
*estLinearSNR = ((float)((int32_t)highAccuRangeHandle->fft1DSize - (int32_t)highAccuRangeHandle->skipLeft - (int32_t)highAccuRangeHandle->skipRight- 5) * sigPower) / (totalPower - sigPower);
// else if (procStep == 2)
#if(0)
/* zoom in FFT: assuming always size of fft1DSize x fft1DSize */
zoomStartInd2 = coarseRangeInd1 - highAccuRangeHandle->numRangeBinZoomIn;
zoomEndInd2 = coarseRangeInd1 + highAccuRangeHandle->numRangeBinZoomIn;
indMask = highAccuRangeHandle->fft1DSize - 1;
shift = highAccuRangeHandle->log2fft1DSize;
inputPtr2 = (float *)highAccuRangeHandle->inputSig;
wncPtr = (float *)highAccuRangeHandle->wnCoarse;
wnfPtr = (float *)highAccuRangeHandle->wnFine;
max1 = 0.0;
itemp2 = 0;
for( i1 = zoomStartInd2; i1 < zoomEndInd2; i1++)
{
for( j1 = 0; j1 < (int32_t)highAccuRangeHandle->fft1DSize; j1 ++)
{
tempFineSearchIdx = j1;
sigAccReal = 0.f;
sigAccImag = 0.f;
tempCoarseSearchIdx = 0;
for( k1 = 0; k1 < (int32_t)highAccuRangeHandle->nSamplesPerChirp; k1 ++)
{
tempIndFine1 = tempFineSearchIdx & indMask;
tempIndFine2 = tempFineSearchIdx >> shift;
tempFineSearchIdx += j1;
tempIndCoarse = (tempCoarseSearchIdx + tempIndFine2) & indMask;
tempCoarseSearchIdx += i1;
finputReal = inputPtr2[2 * k1];
finputImag = inputPtr2[2 * k1 + 1];
tempReal = wncPtr[2 * tempIndCoarse + 1] * finputReal - wncPtr[2 * tempIndCoarse] * finputImag;
tempImag = wncPtr[2 * tempIndCoarse] * finputReal + wncPtr[2 * tempIndCoarse + 1] * finputImag;
sigAccReal += wnfPtr[2 * tempIndFine1 + 1] * tempReal - wnfPtr[2 * tempIndFine1] * tempImag;
sigAccImag += wnfPtr[2 * tempIndFine1] * tempReal + wnfPtr[2 * tempIndFine1 + 1] * tempImag;
}
ftemp1 = sigAccReal * sigAccReal + sigAccImag * sigAccImag;
if( max1 < ftemp1)
{
max1 = ftemp1;
fineRangeInd = itemp2;
}
itemp2++;
}
}
#endif
fdelta = (highAccuRangeHandle->maxBeatFreq) / ((float)highAccuRangeHandle->fft1DSize * (float)highAccuRangeHandle->fft1DSize);
freqFineEst = 1;
*estRange = 1;
#if 0
if (highAccuRangeHandle->enablePhaseEst)
{
float phaseCoarseEst1, phaseCoarseEst2, phaseInitial;
double PI = 3.14159265358979323846f;
double real, imag, denom, initReal, initImag, dtemp1, dtemp2, dtemp;
float phaseEst, totalPhase = 0.f, phaseCorrection, rangePhaseCorrection;
__float2_t demodSig, corrSig;
inputPtr = (__float2_t *)highAccuRangeHandle->inputSig;
phaseCoarseEst1 = 2 * (float)PI * highAccuRangeHandle->fc * (divsp(2 * (*estRange), (float)3e8) + highAccuRangeHandle->adcStartTimeConst);
phaseCoarseEst2 = (float)PI * highAccuRangeHandle->chirpSlope * (divsp(2 * (*estRange), (float)3e8) + highAccuRangeHandle->adcStartTimeConst) * (divsp(2 * (*estRange), (float)3e8) + highAccuRangeHandle->adcStartTimeConst);
phaseInitial = phaseCoarseEst1 - phaseCoarseEst2;
denom = divdp(1.0, (double)highAccuRangeHandle->fft1DSize);
#if 0
dtemp1 = cos((double)phaseInitial);
dtemp2 = sin(-(double)phaseInitial);
initReal = cos(2.0 * PI * highAccuRangeHandle->chirpRampTime * (double) freqFineEst * denom) ;
initImag = sin(-2.0 * PI * highAccuRangeHandle->chirpRampTime * (double) freqFineEst * denom);
#else
dtemp1 = cosdp_i((double)phaseInitial);
dtemp2 = sindp_i(-(double)phaseInitial);
initReal = cosdp_i(2.0 * PI * highAccuRangeHandle->chirpRampTime * (double) freqFineEst * denom) ;
initImag = sindp_i(-2.0 * PI * highAccuRangeHandle->chirpRampTime * (double) freqFineEst * denom);
#endif
//sample @ t = 0;
corrSig = _ftof2((float)dtemp1, (float)dtemp2);
demodSig = _complex_mpysp(_amem8_f2(inputPtr++), corrSig);
RADARDEMO_atan((cplxf_t *)&demodSig, &phaseEst);
totalPhase += phaseEst;
if ((highAccuRangeHandle->enableFilter == 0) && (highAccuRangeHandle->enableLinearFit == 0))
{
//sample @ t = 1;
dtemp = dtemp1 * initReal - dtemp2 * initImag;
imag = dtemp1 * initImag + dtemp2 * initReal;
real = dtemp;
corrSig = _ftof2((float)real, (float)imag);
demodSig = _complex_mpysp(_amem8_f2(inputPtr++), corrSig);
RADARDEMO_atan((cplxf_t *)&demodSig, &phaseEst);
totalPhase += phaseEst;
for( j = 2; j < (int32_t)highAccuRangeHandle->fft1DSize; j ++)
{
dtemp = real * initReal - imag * initImag;
imag = real * initImag + imag * initReal;
real = dtemp;
corrSig = _ftof2((float)real, (float)imag);
demodSig = _complex_mpysp(_amem8_f2(inputPtr++), corrSig);
RADARDEMO_atan((cplxf_t *)&demodSig, &phaseEst);
totalPhase += phaseEst;
}
phaseCorrection = totalPhase * (float)denom;
rangePhaseCorrection= divsp((phaseCorrection*(float)3e8), (4.f * (float) PI * highAccuRangeHandle->fc));
*estRange += rangePhaseCorrection;
}
else
{
//Not implemented yet
}
}
#endif
return;
}
#endif
/*!
\fn RADARDEMO_highAccuRangeProc_accumulateInputGeneric
\brief Accumulate signals from all chirps and convert to floating-point format with 1D windowing.
\param[in] nSamplesPerChirp
Number of samples per chirp.
\param[in] fftSize1D
1D FFT size.
\param[in] nChirpPerFrame
Number of chirps per frame.
\param[in] fftWin1D
Input pointer to 1D window function.
\param[in] fftWin1DSize
Number of ADC bits.
\param[in] inputPtr
Pointer to input signal.
\param[in] chirpInd
Flag to enable DC adjustment for ADC samples when set to 1. Otherwise, no preprocessing for ADC samples.
\param[out] outputPtr
Pointer to the output signal.
\pre none
\post none
*/
void RADARDEMO_highAccuRangeProc_accumulateInputGeneric(
IN uint32_t nSamplesPerChirp,
IN uint32_t fftSize1D,
IN uint32_t nChirpPerFrame,
IN float * RESTRICT fftWin1D,
IN int16_t fftWin1DSize,
IN cplx16_t * RESTRICT inputPtr,
IN int32_t chirpInd,
OUT float * outputPtr)
{
int32_t i;
float * tempOutputPtr;
if (chirpInd == 0)
{
for( i = (int32_t)nSamplesPerChirp - 1; i >= 0; i--)
{
*outputPtr++ = (float)inputPtr->real;
*outputPtr++ = (float)inputPtr->imag;
inputPtr++;
}
}
else
{
tempOutputPtr = outputPtr;
for( i = (int32_t)nSamplesPerChirp - 1; i >= 0; i--)
{
*tempOutputPtr++ += (float)inputPtr->real;
*tempOutputPtr++ += (float)inputPtr->imag;
inputPtr++;
}
if (chirpInd == ((int32_t)nChirpPerFrame - 1))
{
float fwin1D;
float *tempOutputPtr;
tempOutputPtr = &outputPtr[2*nSamplesPerChirp - 1];
for( i = fftWin1DSize - 1; i >= 0; i--)
{
fwin1D = *fftWin1D++;
*outputPtr = *outputPtr * fwin1D;
outputPtr++;
*outputPtr = *outputPtr * fwin1D;
outputPtr++;
*tempOutputPtr = *tempOutputPtr * fwin1D;
tempOutputPtr--;
*tempOutputPtr = *tempOutputPtr * fwin1D;
tempOutputPtr--;
}
if (((int32_t)fftSize1D - (int32_t)nSamplesPerChirp) > 0)
{
tempOutputPtr = &outputPtr[2*nSamplesPerChirp];
for( i = 0; i < ((int32_t)fftSize1D - (int32_t)nSamplesPerChirp); i++);
{
*tempOutputPtr++ = 0.f;
*tempOutputPtr++ = 0.f;
}
}
}
}
}
/*!
\fn RADARDEMO_highAccuRangeProc_rangeEstGeneric
\brief Windowing function for 2D FFT and prepare for the input.
\param[in] procStep
processing step, if 1, do preprocessing of the estimation, up to coarse range estimation, if 2, do the rest of estimation (fine freq and phase).
\param[in] highAccuRangeHandle
Handle to the module.
\param[out] estRange
Estimated range.
\param[out] deltaPhaseEst
Estimated delta phase.
\param[out] estLinearSNR
Estimated SNR.
\pre none
\post none
*/
void RADARDEMO_highAccuRangeProc_rangeEstGeneric(
IN int8_t procStep,
IN RADARDEMO_highAccuRangeProc_handle *highAccuRangeHandle,
OUT float * estRange,
OUT float * deltaPhaseEst,
OUT float * estLinearSNR)
{
if (procStep == 1)
{
int32_t i, j, rad1D, coarseRangeInd;
unsigned char * brev = NULL;
float totalPower, max, ftemp, sigPower, * RESTRICT powerPtr;
float finput, * RESTRICT inputPtr, * RESTRICT inputPtr1;
j = highAccuRangeHandle->log2fft1DSize;
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 = (float *) highAccuRangeHandle->inputSig;
inputPtr1 = (float *) &highAccuRangeHandle->scratchPad[2 * highAccuRangeHandle->fft1DSize];
for (i = 0; i < (int32_t)highAccuRangeHandle->fft1DSize; i++ )
{
*inputPtr1++ = *inputPtr++;
*inputPtr1++ = *inputPtr++;
}
inputPtr1 = (float *) &highAccuRangeHandle->scratchPad[2 * highAccuRangeHandle->fft1DSize];
#if 0
DSPF_sp_fftSPxSP_cn (
highAccuRangeHandle->fft1DSize,
(float*) inputPtr1,
(float *)highAccuRangeHandle->twiddle,
highAccuRangeHandle->fft1DOutSig,
brev,
rad1D,
0,
highAccuRangeHandle->fft1DSize);
#endif
dft(highAccuRangeHandle->fft1DSize, (float*) inputPtr1, highAccuRangeHandle->fft1DOutSig);
inputPtr1 = (float *) &highAccuRangeHandle->fft1DOutSig[0];
for( i = 0; i < (int32_t)highAccuRangeHandle->skipLeft; i++ )
{
*inputPtr1++ = 0.f;
*inputPtr1++ = 0.f;
}
inputPtr1 = (float *) &highAccuRangeHandle->fft1DOutSig[2*((int32_t)highAccuRangeHandle->fft1DSize- (int32_t)highAccuRangeHandle->skipRight)];
for( i = (int32_t)highAccuRangeHandle->fft1DSize- (int32_t)highAccuRangeHandle->skipRight; i < (int32_t)highAccuRangeHandle->fft1DSize; i++ )
{
*inputPtr1++ = 0.f;
*inputPtr1++ = 0.f;
}
max = 0.f;
totalPower = 0.f;
coarseRangeInd = 0;
inputPtr = (float *)highAccuRangeHandle->fft1DOutSig;
powerPtr = (float *)highAccuRangeHandle->scratchPad;
for( i = 0; i < (int32_t)highAccuRangeHandle->fft1DSize; i++ )
{
finput = (*inputPtr) * (*inputPtr);
inputPtr++;
finput += (*inputPtr) * (*inputPtr);
inputPtr++;
ftemp = finput;
powerPtr[i] = ftemp;
totalPower += ftemp;
if( max < ftemp )
{
max = ftemp;
coarseRangeInd = i;
}
}
highAccuRangeHandle->coarseRangeInd = coarseRangeInd;
i = coarseRangeInd;
sigPower = powerPtr[i-2] + powerPtr[i-1] + powerPtr[i] + powerPtr[i+1] + powerPtr[i+2];
*estLinearSNR = ((float)((int32_t)highAccuRangeHandle->fft1DSize - (int32_t)highAccuRangeHandle->skipLeft - (int32_t)highAccuRangeHandle->skipRight- 5) * sigPower) / (totalPower - sigPower);
}
// else if (procStep == 2)
int32_t i1, j1, k1, coarseRangeInd1 = highAccuRangeHandle->coarseRangeInd;
float max1, ftemp1;
int32_t zoomStartInd2, zoomEndInd2, itemp2, tempIndFine1, tempIndFine2, tempIndCoarse, indMask, shift;
int32_t fineRangeInd, tempFineSearchIdx, tempCoarseSearchIdx;
float *RESTRICT inputPtr2, *RESTRICT wncPtr, *RESTRICT wnfPtr, sigAccReal, sigAccImag;
float freqFineEst, fdelta, finputReal, finputImag, tempReal, tempImag;
/* zoom in FFT: assuming always size of fft1DSize x fft1DSize */
zoomStartInd2 = coarseRangeInd1 - highAccuRangeHandle->numRangeBinZoomIn;
zoomEndInd2 = coarseRangeInd1 + highAccuRangeHandle->numRangeBinZoomIn;
indMask = highAccuRangeHandle->fft1DSize - 1;
shift = highAccuRangeHandle->log2fft1DSize;
inputPtr2 = (float *)highAccuRangeHandle->inputSig;
wncPtr = (float *)highAccuRangeHandle->wnCoarse;
wnfPtr = (float *)highAccuRangeHandle->wnFine;
max1 = 0.0;
itemp2 = 0;
for( i1 = zoomStartInd2; i1 < zoomEndInd2; i1++)
{
for( j1 = 0; j1 < (int32_t)highAccuRangeHandle->fft1DSize; j1 ++)
{
tempFineSearchIdx = j1;
sigAccReal = 0.f;
sigAccImag = 0.f;
tempCoarseSearchIdx = 0;
for( k1 = 0; k1 < (int32_t)highAccuRangeHandle->nSamplesPerChirp; k1 ++)
{
tempIndFine1 = tempFineSearchIdx & indMask;
tempIndFine2 = tempFineSearchIdx >> shift;
tempFineSearchIdx += j1;
tempIndCoarse = (tempCoarseSearchIdx + tempIndFine2) & indMask;
tempCoarseSearchIdx += i1;
finputReal = inputPtr2[2 * k1];
finputImag = inputPtr2[2 * k1 + 1];
tempReal = wncPtr[2 * tempIndCoarse + 1] * finputReal - wncPtr[2 * tempIndCoarse] * finputImag;
tempImag = wncPtr[2 * tempIndCoarse] * finputReal + wncPtr[2 * tempIndCoarse + 1] * finputImag;
sigAccReal += wnfPtr[2 * tempIndFine1 + 1] * tempReal - wnfPtr[2 * tempIndFine1] * tempImag;
sigAccImag += wnfPtr[2 * tempIndFine1] * tempReal + wnfPtr[2 * tempIndFine1 + 1] * tempImag;
}
ftemp1 = sigAccReal * sigAccReal + sigAccImag * sigAccImag;
if( max1 < ftemp1)
{
max1 = ftemp1;
fineRangeInd = itemp2;
}
itemp2++;
}
}
fdelta = (highAccuRangeHandle->maxBeatFreq) / ((float)highAccuRangeHandle->fft1DSize * (float)highAccuRangeHandle->fft1DSize);
freqFineEst = fdelta * (float)(zoomStartInd2 * highAccuRangeHandle->fft1DSize + fineRangeInd);
*estRange = (freqFineEst * (float)3e8 * highAccuRangeHandle->chirpRampTime) / (2.f * highAccuRangeHandle->chirpBandwidth);
#if 0
if (highAccuRangeHandle->enablePhaseEst)
{
float phaseCoarseEst1, phaseCoarseEst2, phaseInitial;
double PI = 3.14159265358979323846f;
double real, imag, denom, initReal, initImag, dtemp1, dtemp2, dtemp;
float phaseEst, totalPhase = 0.f, phaseCorrection, rangePhaseCorrection;
__float2_t demodSig, corrSig;
inputPtr = (__float2_t *)highAccuRangeHandle->inputSig;
phaseCoarseEst1 = 2 * (float)PI * highAccuRangeHandle->fc * (divsp(2 * (*estRange), (float)3e8) + highAccuRangeHandle->adcStartTimeConst);
phaseCoarseEst2 = (float)PI * highAccuRangeHandle->chirpSlope * (divsp(2 * (*estRange), (float)3e8) + highAccuRangeHandle->adcStartTimeConst) * (divsp(2 * (*estRange), (float)3e8) + highAccuRangeHandle->adcStartTimeConst);
phaseInitial = phaseCoarseEst1 - phaseCoarseEst2;
denom = divdp(1.0, (double)highAccuRangeHandle->fft1DSize);
#if 0
dtemp1 = cos((double)phaseInitial);
dtemp2 = sin(-(double)phaseInitial);
initReal = cos(2.0 * PI * highAccuRangeHandle->chirpRampTime * (double) freqFineEst * denom) ;
initImag = sin(-2.0 * PI * highAccuRangeHandle->chirpRampTime * (double) freqFineEst * denom);
#else
dtemp1 = cosdp_i((double)phaseInitial);
dtemp2 = sindp_i(-(double)phaseInitial);
initReal = cosdp_i(2.0 * PI * highAccuRangeHandle->chirpRampTime * (double) freqFineEst * denom) ;
initImag = sindp_i(-2.0 * PI * highAccuRangeHandle->chirpRampTime * (double) freqFineEst * denom);
#endif
//sample @ t = 0;
corrSig = _ftof2((float)dtemp1, (float)dtemp2);
demodSig = _complex_mpysp(_amem8_f2(inputPtr++), corrSig);
RADARDEMO_atan((cplxf_t *)&demodSig, &phaseEst);
totalPhase += phaseEst;
if ((highAccuRangeHandle->enableFilter == 0) && (highAccuRangeHandle->enableLinearFit == 0))
{
//sample @ t = 1;
dtemp = dtemp1 * initReal - dtemp2 * initImag;
imag = dtemp1 * initImag + dtemp2 * initReal;
real = dtemp;
corrSig = _ftof2((float)real, (float)imag);
demodSig = _complex_mpysp(_amem8_f2(inputPtr++), corrSig);
RADARDEMO_atan((cplxf_t *)&demodSig, &phaseEst);
totalPhase += phaseEst;
for( j = 2; j < (int32_t)highAccuRangeHandle->fft1DSize; j ++)
{
dtemp = real * initReal - imag * initImag;
imag = real * initImag + imag * initReal;
real = dtemp;
corrSig = _ftof2((float)real, (float)imag);
demodSig = _complex_mpysp(_amem8_f2(inputPtr++), corrSig);
RADARDEMO_atan((cplxf_t *)&demodSig, &phaseEst);
totalPhase += phaseEst;
}
phaseCorrection = totalPhase * (float)denom;
rangePhaseCorrection= divsp((phaseCorrection*(float)3e8), (4.f * (float) PI * highAccuRangeHandle->fc));
*estRange += rangePhaseCorrection;
}
else
{
//Not implemented yet
}
}
#endif
return;
}
谢谢。


这个是我的DSS优化界面,请问该如何统计具体的处理事件
您好,我使用的是clock函数,来获得运行时间,但是我的printf没有正确输出请问是为什么?


我这样输出来的数字他的单位是什么?