😊Forward
发布日期

WRSP6TK 雷达 TR 测试软件源码精讲(2):内校准——接收与发射

作者

M先生

WRSP6TK 雷达 TR 测试软件源码精讲(2):内校准——接收与发射

本篇详解模式 0(内接收校准)与模式 1(内发射校准)。这两者是理解其余模式的"钥匙"——它们用到了校准系数计算、通道控制、系数下发三大核心机制。

一、为什么要做"内校准"?

相控阵雷达的性能根基是各通道幅度相位一致性:所有单元的信号要同相叠加,波束才又窄又低副瓣。但实际硬件存在:

  • 每个 TR 组件功放/LNA 增益不一致(制造公差)
  • 移相器、衰减器、馈线的相位/幅度误差
  • 温度漂移、器件老化

校准的目标:测出每个通道相对"标准"的幅度误差和相位误差,生成校正系数,让各通道"拉平"。

内校准 vs 外校准

内校准外校准
信号来源机内信号源(内建校准网络)外部信号源(天线口注入)
优点快速、随时可做、不受环境限制经过完整天线链路,更真实
缺点不含天线影响需要外部设备、环境

术语注释

  • 校准(Calibration):用已知参考测量系统误差并修正的过程。
  • 幅相一致性:多通道间幅度(增益)和相位(时延)的一致程度,直接决定波束副瓣和指向精度。
  • 校准网络:雷达内部的信号分配/耦合网络,用于把测试信号注入各接收通道或从各发射通道取样。

二、模式 0:内接收校准(RecvAdjust)

2.1 完整流程(时序图)

┌─ RecvAdjustInit(初始化)───────────────────────────────┐
1. 检查参数文件是否加载成功(m_InnerRecv...CmdFlag)2. 关所有 TR 通道(UART00x00)                       │
3. 关所有发射波束系数(TRBEAM0xffffffff mask)       │
4. 设置 DIFR 波束/校正系数为"零衰减零相位"│    (m_DifrBeamData/CalibData = 0x7fff0000)             │
5. 设置 DBF 波束系数默认值(0x7400)                     │
6. 下发"内接收校准 Difr 参数"DSP7. 下发"内接收校准 Calibtate 参数"DSP(开校准网络)   │
8. 下发接收波束系数 → RXBEAMPORT9. 下发校正系数 → TRCORRPORT(按 m_CalibDataAmp/Phase)10. 开所有 DIFR 接收通道(UART00xff)                │
11. 启动定时器 m_GetDataTime,开始取数                   │
└─────────────────────────────────────────────────────────┘
        │ 每次数据到达
┌─ RecvAdjustDataProcess(数据回调)──────────────────────┐
│ 从 globalBuf 按 DIFR×通道 提取各通道 I/Q│ → m_AdjustSrcIQ[i](校准源数据)                          │
│ → 计算幅度/相位 m_AdjustSrcAP[i]│ → SetEvent 通知处理线程                                   │
└─────────────────────────────────────────────────────────┘
┌─ RecvAdjustDataProc(处理线程)─────────────────────────┐
1.TR 通道、关波束系数(测试结束保护)                 │
2. GetCalibrationFactor(srcIQ → FactIQ)│    计算各通道校准系数(核心!见下)                       │
3. 幅度/相位提取 → m_AdjustFactAP                        │
4. 保存校准系数文件 + 原始数据文件                       │
5. 刷新显示(源 vs 系数对比图)                          │
└─────────────────────────────────────────────────────────┘

2.2 初始化细节(RecvAdjustInit)

关键语句解读

// 设置 DIFR 波束/校正系数为"零衰减零相位"
memset(m_DifrCalibData, 0, sizeof(m_DifrCalibData));
for (j=0; j<MAXFREQDIVBEAM; j++)
  for(k=0; k<g_ValidChannelNum; k++)
  {
    m_DifrBeamData[j][k] = 0x7fff0000;   // 幅度1.0 + 相位0
    m_DifrCalibData[j][k] = 0x7fff0000;  // 直通
  }

0x7fff0000 是什么? 32 位打包:高 16 位 = Q15 幅度(0x7FFF = 32767 ≈ 1.0,零衰减),低 16 位 = 相位(0 = 零相位)。详见本博客《Q15 定点数格式完全指南》。

为什么要先设"直通"? 校准的第一步必须让所有通道"不偏不倚"地直通,才能测到真实的通道误差。如果带着旧系数测量,测到的是"新误差+旧系数残留"的混合结果,无法分离。

2.3 数据提取(RecvAdjustDataProcess)

// 每波束(DIFR×通道)的数据偏移
DataOff = g_ArrayMapDIFR[i] * g_ValidChannelNum + g_ArrayMapChannel[i];
m_AdjustSrcIQ[i][0] = tmpIQ[DataOff<<1];     // I
m_AdjustSrcIQ[i][1] = tmpIQ[(DataOff<<1)+1]; // Q

计算机知识g_ArrayMapDIFR[i] / g_ArrayMapChannel[i]地址映射表——逻辑波束号 i 到物理 DIFR 号和通道号的映射。因为硬件布线和逻辑编号不一定对应,必须查表转换。这是嵌入式/雷达软件常见模式:逻辑-物理映射层

三、核心:GetCalibrationFactor 的数学原理

这是整个校准的灵魂。输入各通道源 I/Q,输出校准系数 I/Q。

3.1 输入:每个通道的测量值(复数)

s~i=aiejφi=sIi+jsQi\tilde{s}_i = a_i e^{j\varphi_i} = s_{Ii} + j s_{Qi}

其中 aia_iφi\varphi_i 是第 ii 通道的幅度、相位,sIis_{Ii}sQis_{Qi} 是 I/Q 分量。

3.2 归一化基准的选择

代码逻辑:

Average = 所有通道功率的平均值;
ErrorAmp = pow(10, m_ChanErrorReduce * -0.005f);  // 异常阈值
MinAmp = 功率 ≥ Average*ErrorAmp 的通道中的最小功率;
minPower = sqrt(MinAmp);   // 基准幅度

物理意义:把通道按功率分档。m_ChanErrorReduce 是"通道异常缩减"阈值(默认 100,即 -0.5dB×100/10 = ...),低于平均功率一定比例的通道视为异常通道(坏通道),不参与基准计算,避免坏通道把基准拉低。

公式推导ErrorAmp = 10^{-0.005 × ChanErrorReduce}。若 ChanErrorReduce=100,则 ErrorAmp = 10^{-0.5} ≈ 0.316——即功率低于平均功率约 -5dB 的通道被排除。m_ChanErrorReduce 以 0.1dB 为单位(界面显示 *0.1f),100 表示 10.0dB?看代码 value.Format("%.1f", m_ChanErrorReduce*0.1f),所以 100 → 10.0dB。即功率低于平均值 10dB 的通道判为异常

3.3 校准系数公式

对每个通道 ii

Ci={sIijsQisi=ejφi若 PiPmin(弱通道,归一化到单位圆)(sIijsQi)Aminsi2=Aminaiejφi其他(校正到基准幅度)C_i = \begin{cases} \dfrac{s_{Ii} - j s_{Qi}}{|s_i|} = e^{-j\varphi_i} & \text{若 } P_i \le P_{min} \text{(弱通道,归一化到单位圆)}\\[1.2em] \dfrac{(s_{Ii} - j s_{Qi}) \cdot A_{min}}{|s_i|^2} = \dfrac{A_{min}}{a_i} e^{-j\varphi_i} & \text{其他(校正到基准幅度)} \end{cases}

其中 Amin=PminA_{min} = \sqrt{P_{min}} 是基准幅度,Pi=si2P_i = |s_i|^2

代码对应

if(MinAmp > PowrIQ[i])   // 通道功率 < 基准 → 弱通道
{
    FactIQ[i][0] = srcIQ[i][0]/sqrt(PowrIQ[i]);   // I/|s| = cosφ
    FactIQ[i][1] = -srcIQ[i][1]/sqrt(PowrIQ[i]);  // -Q/|s| = -sinφ
}
else                      // 正常通道
{
    FactIQ[i][0] = srcIQ[i][0]*minPower/PowrIQ[i]; // I·Amin/|s|²
    FactIQ[i][1] = -srcIQ[i][1]*minPower/PowrIQ[i];
}

数学推导

  • 测量值 si=aiejφis_i = a_i e^{j\varphi_i},其共轭 si=aiejφis_i^* = a_i e^{-j\varphi_i}
  • 正常通道系数:Ci=siAminai2=AminaiejφiC_i = \dfrac{s_i^* \cdot A_{min}}{a_i^2} = \dfrac{A_{min}}{a_i}e^{-j\varphi_i} —— 幅度拉平到 AminA_{min}、相位取反
  • 弱通道系数:Ci=siai=ejφiC_i = \dfrac{s_i^*}{a_i} = e^{-j\varphi_i} —— 只校正相位(因为弱通道增益不可靠,不动幅度,避免噪声放大)

相位取反(ejφie^{-j\varphi_i})的物理意义:通道有正相位误差 φi\varphi_i,校正系数补偿 φi-\varphi_i,两者相乘 ejφiejφi=1e^{j\varphi_i} \cdot e^{-j\varphi_i} = 1相位误差被抵消

3.4 为什么分两档?

情况处理原因
通道功率 ≥ 基准幅度校正到基准 + 相位取反通道正常,可以校正幅度
通道功率 < 基准(异常)只校相位,幅度不动弱通道幅度不可信,强行拉高会放大噪声

工程智慧:坏通道不硬校——如果某通道真的坏了(增益塌陷),把它强行"拉"到正常水平只会把噪声一起放大,得不偿失。让异常通道保持低增益,仅修正相位,至少不引入新的污染。这正是 m_ChanErrorReduce 参数存在的意义。

四、模式 1:内发射校准(SendAdjust)

4.1 与接收校准的差异

发射校准的物理场景不同:发射信号从各 TR 组件功放出来,经耦合网络取样,回到接收机测量。所以:

  1. 逐通道扫描:一次只开一个发射通道(m_CurrentHDifrId/ChlId 或 V),测完一个切下一个
  2. m_NeedScanArrayNum = g_BeamArrayNum >> 1:发射校准只需要一半通道数(H/V 各半)
  3. 每个通道测量后 m_CurScanArrayNum++,直到全部扫完才统一计算系数

4.2 关键流程(SendAdjustInit)

1.TR、关波束系数
2. 设置 DIFR 直通系数 + DBF 默认系数
3. 下发内发射校准参数到 DSP
4. 下发发射波束系数(全关)→ TRBEAMPORT
5. 下发接收波束/校正系数(直通)→ RXBEAM/TRCORR
6. 打开第一个待测发射通道(m_TestHOrV 决定 HV):
   - 波束系数只给该通道 0x7fff0000(其余 0=关)
   - UART0 打开对应 TR 通道
7. 启动定时器 → 每周期取一次数据(SendAdjustDataProcess)
   → m_AdjustSrcIQ[m_CurScanArrayNum] = 该通道 I/Q
   → m_CurScanArrayNum++
SetEvent

4.3 通道切换(SendAdjustDataProc)

if (m_CurScanArrayNum == m_NeedScanArrayNum)  // 全部扫完
{
    // 1. 关所有 TR/波束
    // 2. GetCalibrationFactor 计算系数(同接收)
    // 3. 保存 H 或 V 的系数文件 + 原始数据
    // 4. 刷新显示
}
else  // 切到下一个通道
{
    // 计算下一个 H/V 通道的 DIFR/Chl
    // 关掉旧的,打开新的(波束系数 + TR 通道)
    // 重启定时器
}

通道切换的"先关后开"顺序很重要:先关旧通道(发全 0 波束系数、UART0 发 0x00),再开新通道,避免新旧通道同时发射造成串扰。

4.4 发射校准的相位符号

对比接收和发射校准的系数计算:

// 接收:相位取反(正常)
I = rat*cos(m_CalibDataPhase[i]*normal_pi);
Q = rat*sin(m_CalibDataPhase[i]*normal_pi);

// 发射:相位再取一次反(负号)
I = rat*cos(m_CalibDataPhase[i]*(-1.0f)*normal_pi);
Q = rat*sin(m_CalibDataPhase[i]*(-1.0f)*normal_pi);

为什么发射要多取一次反? 校准系数的相位符号取决于信号的传播方向:

  • 接收链路:信号从天线→接收机,误差相位 φ\varphi 在"接收方向"累积,补偿 φ- \varphi
  • 发射链路:信号从发射机→天线,误差相位同样累积,但校准系数量化打包时的参考方向与接收相反(DSP 处理约定),所以取反

物理本质:收发互易性(reciprocity)要求发射和接收的校正符号相反——同一个通道的相位误差,在发射和接收两个方向上对波束的影响是相反的。这是相控阵收发校准中极易出错、也最常见的 bug 来源。

五、系数下发打包(0x7fff0000 的兄弟)

校准完成后,系数要打包成硬件格式下发:

rat = 32767 * powf(10, m_CalibDataAmp[i] * 0.05f);   // 幅度dB → 线性 × Q15满刻度
I   = (int)(rat * cos(m_CalibDataPhase[i] * π/180));  // 相位 → I 分量
Q   = (int)(rat * sin(m_CalibDataPhase[i] * π/180));  // 相位 → Q 分量
m_DifrCalibData[0..4][j] = ((I<<16)&0xffff0000) | (Q&0x0000ffff);

公式

I=3276710AdB/20cosφ,Q=3276710AdB/20sinφI = \lfloor 32767 \cdot 10^{A_{dB}/20} \cdot \cos\varphi \rfloor, \quad Q = \lfloor 32767 \cdot 10^{A_{dB}/20} \cdot \sin\varphi \rfloor
  • 幅度:dB → 线性(10A/2010^{A/20})再乘 Q15 满刻度 32767
  • 相位:度 → 弧度 → 三角函数分解为 I/Q
  • 打包:I 放高 16 位、Q 放低 16 位

计算机知识:这是"极坐标→直角坐标→定点打包"的完整链路,也是 Q15 定点数的实际工程应用(详见《Q15 定点数格式完全指南》)。

六、内校准结果文件

%.3fGHz_内标定发射幅度相位值_20260807123000.txt
当前频率:9.100GHz
单元数:40
0.123456   45.678
...
  • 第一行:频点(校准系数与频率强相关,不同频点必须分别校准)
  • 第二行:单元数
  • 每行:幅度(线性值)+ 相位(度)

七、一句话总结

内校准 = 用机内已知信号测出每个通道的幅相误差,用"幅度归一化 + 相位取反"生成校正系数,坏通道只校相位不校幅度。 发射校准额外做了逐通道扫描和相位反号处理。理解这两点,后面的外校准、暗室、远场测试都是它的变体。

下一篇:WRSP6TK 雷达 TR 测试软件源码精讲(3):外校准——模式 2 外接收校准与模式 3 外发射校准

WRSP6TK 雷达 TR 测试软件源码精讲(2):内校准——接收与发射

评论加载中…