第三章 ADC数据采集与预处理

好,咱们进入第三章。ADC数据采集与预处理,说白了就是雷达信号处理的第一道关卡。你想想看,天线接收回来的模拟信号,得先变成数字信号,我们才能用处理器去折腾它。这一步要是没做好,后面算法再牛也白搭。我在项目里见过太多人,花大把时间调算法,结果发现是ADC配置出了问题,数据本身就有问题。

3.1 NXP雷达ADC配置要点

NXP的雷达处理器,比如S32R系列,内部集成了高速ADC。我个人习惯,拿到芯片第一件事就是看ADC的参考手册。配置ADC时,有几个关键参数必须盯紧。

参数 说明 我的建议值
采样率 决定了能处理的最大带宽 根据FMCW调频带宽设定,通常几MHz到几十MHz
分辨率 通常12位或14位 12位够用,14位更稳
采样模式 交错采样还是并行采样 多通道场景用并行,减少相位误差
触发源 由FMCW chirp信号触发 硬件触发,别用软件触发

嗯,这里要注意。ADC的采样时钟必须干净。我曾经在一个项目里,发现ADC数据总有周期性噪声,查了三天,最后发现是时钟走线太长,被电源干扰了。所以,硬件设计时,ADC时钟走线要短,要远离开关电源。

避坑指南: 我曾经在配置ADC时,忽略了采样保持时间。结果高速信号进来,采样值还没稳定就被读走了,数据全是乱的。记得检查ADC的采样保持时间是否匹配你的输入信号带宽。

3.2 IQ数据采集

雷达信号处理,IQ数据是核心。为什么?因为IQ数据保留了信号的幅度和相位信息。你想想看,FMCW雷达测距测速,靠的就是相位差。没有IQ数据,你只能测幅度,那精度就差远了。

NXP的ADC通常输出的是实采样数据。要得到IQ数据,有两种方式:

  1. 硬件正交解调:用混频器直接输出I和Q两路模拟信号,然后两路ADC分别采样。好处是实时性好,坏处是硬件成本高,两路ADC的增益和相位要匹配。
  2. 软件正交解调:单路ADC采样中频信号,然后在数字域做希尔伯特变换或正交混频。我比较推荐这种方式,灵活,而且可以后期校准。

软件正交解调的代码,我一般这么写:

// 假设adc_data是单路实采样数据
// 生成正交本振信号
for (int i = 0; i < sample_count; i++) {
    float cos_val = cosf(2 * M_PI * if_freq * i / sample_rate);
    float sin_val = -sinf(2 * M_PI * if_freq * i / sample_rate);
    i_data[i] = adc_data[i] * cos_val;
    q_data[i] = adc_data[i] * sin_val;
}
// 然后低通滤波,滤掉高频分量
// 这里省略滤波器实现

你看,代码不复杂。但有个坑:本振信号的频率必须和实际中频信号的中心频率对齐。否则,IQ数据里会有残余的直流分量,后面处理会出问题。

3.3 直流偏置校正

ADC采集回来的数据,通常会有直流偏置。说白了,就是信号的平均值不是零。为什么会这样?ADC的参考电压有偏差,或者前端放大器有失调电压。

直流偏置的影响有多大?你想想看,如果直流偏置不消除,后面做FFT时,零频处会有一个很大的峰值,把近处的目标信号都淹没了。我遇到过最夸张的一次,直流偏置占了满量程的10%,结果零频附近的目标完全看不见。

校正方法很简单:

  • 静态校正:在没有信号输入时,采集一段数据,计算平均值,然后从后续数据中减去这个平均值。
  • 动态校正:在chirp信号的空白段(比如chirp开始前的空闲时间)采集数据,实时计算直流偏置。

我个人习惯用动态校正。因为温度变化、电源波动都会导致直流偏置漂移。静态校正只能管一时。

小技巧: 计算直流偏置时,不要只采几个点。我一般采1024个点取平均,这样噪声的影响可以忽略。另外,I路和Q路的直流偏置要分别计算,别偷懒。

3.4 幅度归一化

幅度归一化,就是把信号的幅度调整到一个标准范围。为什么需要这一步?因为不同通道的ADC增益可能有差异,或者不同chirp的信号强度不一样。如果不归一化,后面做恒虚警检测(CFAR)时,门限就没法统一设置。

归一化的方法有两种:

  1. 最大值归一化:找到信号的最大绝对值,然后所有数据除以这个最大值。简单粗暴,但容易受噪声尖峰影响。
  2. 均方根归一化:计算信号的均方根值,然后所有数据除以这个均方根值。更稳定,我推荐用这个。

代码示例:

// 计算均方根值
float rms = 0.0f;
for (int i = 0; i < sample_count; i++) {
    rms += i_data[i] * i_data[i] + q_data[i] * q_data[i];
}
rms = sqrtf(rms / sample_count);

// 归一化
for (int i = 0; i < sample_count; i++) {
    i_data[i] /= rms;
    q_data[i] /= rms;
}

嗯,这里要注意。归一化因子要保存下来。因为后面做目标检测时,你可能需要反推目标的真实幅度。我有个项目,归一化后忘了保存因子,结果目标距离算对了,但反射截面积(RCS)怎么算都不对,折腾了两天才发现是归一化因子丢了。

核心要点: ADC数据采集与预处理,看似基础,但决定了整个雷达信号处理链路的成败。直流偏置校正和幅度归一化,是保证后续算法稳定工作的前提。别嫌麻烦,每一步都要做扎实。

好了,这一章就到这里。ADC配置、IQ采集、直流校正、幅度归一化,这四个步骤环环相扣。你想想看,如果ADC采样率没配好,IQ数据就是错的;如果直流偏置没校正,FFT结果就是歪的;如果幅度没归一化,检测门限就是乱的。所以,每一步都要用心。

下一章,我们会进入距离维FFT处理。到时候,你会看到预处理做得好,FFT的结果有多漂亮。