c-在FMCW雷达中,将一维阵列分配为二维矩阵,以获得距离和速度信息



我使用fmcw雷达,使用stm32l476微控制器查找移动物体的距离和速度信息。

首先,为了得到文具对象的范围,我将ADC值存储到"0"中;fft_ in";通过使用";"HAL_ADC_ConvCpltCallback";作用在这里我已经初始化了";is_data_ready_for_fft=1";如下所示:

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc1) {
is_data_ready_for_fft = 1;
}

并使用fft计算该范围。现在,我需要将ADC值的1d阵列存储在2d阵列中,以计算啁啾指数上的多普勒频率。

以下是将adc值复制到fft_in数组和范围计算中的代码:

while (1)
{
if (is_data_ready_for_fft == 1) {
for (size_t i = 0; i < ADC_BUF_LENGTH; i++) {
fft_in[i] = (float32_t) adcResultsDMA[i];
}
is_data_ready_for_fft = 0;
arm_rfft_fast_f32(&fft_handler, fft_in, fft_out, 0);
arm_cmplx_mag_f32(fft_out, fft_out2, ADC_BUF_LENGTH);

fft_out2[0] = 0;

arm_max_f32(fft_out2, ADC_BUF_LENGTH/2, &Result, &Index);

R = (300000000 * 0.004064* Index)/500000000;
}
}

上面的代码将该值复制到fft_in数组中。此处,ADC_BUF_LENGTH=512;现在我的问题是如何将这个fft_in缓冲区添加到矩阵中,如下所示:假设fft_in数组每秒都在变化:所以这里的fft_in(0(,fft_in(1(,fft_in(2(,。。。。。。fft_ in(20(是在该特定时间具有ADC_。

[0,0]=fft_in(0)[0]   [0,1]=fft_in(0)[1]..............[0,512]=fft_in(0)[512]
[1,0]=fft_in(1)[0]   [1,1]=fft_in(1)[1]..............[1,512]=fft_in(1)[512]
[2,0]=fft_in(2)[0]   [2,1]=fft_in(2)[1]..............[2,512]=fft_in(2)[512]
.
.
.
.
[19,0]=fft_in(19)[0]  [19,1]=fft_in(19)[1].............[19,512]=fft_in(19)[512]

(Chirp指数为20,样本数量为512。行间fft产生范围,列间fft产生速度(

我认为您正在寻找一个二维数组。您可以声明一个类似的float32_t fftIn2D[NBR_CHIRPS_PER_FRAME][NBR_SAMPLES_PER_CHIRP];NBR_SAMPLES_PER_CHIRP是在一个啁啾期间(在您的情况下为512个采样(放置采样值的列。NBR_CHIRPS_PER_FRAME是一帧中啁啾的行数,在您的情况下为20。

要访问数组的一个元素,需要两个嵌套的for循环。以下是用于此目的的代码片段。

for (uint32_t chirpIdx = 0; chirpIdx < NBR_CHIRPS_PER_FRAME; chirpIdx++)
{
for (uint32_t sampleIdx = 0; sampleIdx < NBR_SAMPLES_PER_CHIRP; sampleIdx++)
{
/*acess the element*/
fftIn2D[chirpIdx][sampleIdx] = (float32_t) adcResultsDMA[i]
}
}

对于您的代码,这可能会像这样锁定:

float32_t fftIn2D[NBR_CHIRPS_PER_FRAME][NBR_SAMPLES_PER_CHIRP];
fftInDoppler[NBR_CHIRPS_PER_FRAME];
uint32_t chirpIdxGlobal = 0;

while (1)
{
if (is_data_ready_for_fft == 1) {
is_data_ready_for_fft = 0;

for (uint32_t sampleIdx = 0; sampleIdx < NBR_SAMPLES_PER_CHIRP; sampleIdx++)
{
fftIn2D[chirpIdxGlobal][sampleIdx] = (float32_t) adcResultsDMA[i];
}

chirpIdxGlobal++;
if(chirpIdxGlobal == (NBR_CHIRPS_PER_FRAME - 1)){
is_data_ready_for_doppler_fft = 1;
}

arm_rfft_fast_f32(&fft_handler, &fftIn2D[sampleIdx][0], fft_out, 0);

arm_cmplx_mag_f32(fft_out, fft_out2, ADC_BUF_LENGTH);

fft_out2[0] = 0;

arm_max_f32(fft_out2, ADC_BUF_LENGTH/2, &Result, &Index);

R = (300000000 * 0.004064* Index)/500000000;

}

if (is_data_ready_for_doppler_fft){
chirpIdxGlobal = 0;
is_data_ready_for_doppler_fft = 0;

for (uint32_t sampleIdx = 0; sampleIdx < NBR_SAMPLES_PER_CHIRP; sampleIdx++)
{
/* bring the data in the right order for the fft */
for (uint32_t chirpIdx = 0; chirpIdx < NBR_CHIRPS_PER_FRAME; chirpIdx++)
{
fftInDoppler[chirpIdx] = fftIn2D[chirpIdx][sampleIdx];
}

arm_rfft_fast_f32(&fft_handler, &fftInDoppler[0], fft_out_doppler, 0);

arm_cmplx_mag_f32(fft_out_doppler, fft_out2_doppler, ADC_BUF_LENGTH);

fft_out2_doppler[0] = 0;

arm_max_f32(fft_out2_doppler, ADC_BUF_LENGTH/2, &Result, &Index);
}

}
}

在我的片段中,您还可以计算在范围FFT(第一次FFT(中检测到目标的样本的第二次FFT,而不是在每个样本上。

请记住,fft需要一些计算时间,在计算之前,可能需要对一帧的所有数据进行采样。

相关内容

  • 没有找到相关文章

最新更新