我使用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需要一些计算时间,在计算之前,可能需要对一帧的所有数据进行采样。