- 发布日期
WRSP6TK 雷达 TR 测试软件源码精讲(2):内校准——接收与发射
作者
M先生
WRSP6TK 雷达 TR 测试软件源码精讲(2):内校准——接收与发射
本篇详解模式 0(内接收校准)与模式 1(内发射校准)。这两者是理解其余模式的"钥匙"——它们用到了校准系数计算、通道控制、系数下发三大核心机制。
一、为什么要做"内校准"?
相控阵雷达的性能根基是各通道幅度相位一致性:所有单元的信号要同相叠加,波束才又窄又低副瓣。但实际硬件存在:
- 每个 TR 组件功放/LNA 增益不一致(制造公差)
- 移相器、衰减器、馈线的相位/幅度误差
- 温度漂移、器件老化
校准的目标:测出每个通道相对"标准"的幅度误差和相位误差,生成校正系数,让各通道"拉平"。
内校准 vs 外校准:
| 内校准 | 外校准 | |
|---|---|---|
| 信号来源 | 机内信号源(内建校准网络) | 外部信号源(天线口注入) |
| 优点 | 快速、随时可做、不受环境限制 | 经过完整天线链路,更真实 |
| 缺点 | 不含天线影响 | 需要外部设备、环境 |
术语注释:
- 校准(Calibration):用已知参考测量系统误差并修正的过程。
- 幅相一致性:多通道间幅度(增益)和相位(时延)的一致程度,直接决定波束副瓣和指向精度。
- 校准网络:雷达内部的信号分配/耦合网络,用于把测试信号注入各接收通道或从各发射通道取样。
二、模式 0:内接收校准(RecvAdjust)
2.1 完整流程(时序图)
┌─ RecvAdjustInit(初始化)───────────────────────────────┐
│ 1. 检查参数文件是否加载成功(m_InnerRecv...CmdFlag) │
│ 2. 关所有 TR 通道(UART0 发 0x00) │
│ 3. 关所有发射波束系数(TRBEAM 发 0xffffffff mask) │
│ 4. 设置 DIFR 波束/校正系数为"零衰减零相位" │
│ (m_DifrBeamData/CalibData = 0x7fff0000) │
│ 5. 设置 DBF 波束系数默认值(0x7400) │
│ 6. 下发"内接收校准 Difr 参数"到 DSP │
│ 7. 下发"内接收校准 Calibtate 参数"到 DSP(开校准网络) │
│ 8. 下发接收波束系数 → RXBEAMPORT │
│ 9. 下发校正系数 → TRCORRPORT(按 m_CalibDataAmp/Phase) │
│ 10. 开所有 DIFR 接收通道(UART0 发 0xff) │
│ 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 输入:每个通道的测量值(复数)
其中 、 是第 通道的幅度、相位,、 是 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 校准系数公式
对每个通道 :
其中 是基准幅度,。
代码对应:
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];
}
数学推导:
- 测量值 ,其共轭
- 正常通道系数: —— 幅度拉平到 、相位取反
- 弱通道系数: —— 只校正相位(因为弱通道增益不可靠,不动幅度,避免噪声放大)
相位取反()的物理意义:通道有正相位误差 ,校正系数补偿 ,两者相乘 ,相位误差被抵消。
3.4 为什么分两档?
| 情况 | 处理 | 原因 |
|---|---|---|
| 通道功率 ≥ 基准 | 幅度校正到基准 + 相位取反 | 通道正常,可以校正幅度 |
| 通道功率 < 基准(异常) | 只校相位,幅度不动 | 弱通道幅度不可信,强行拉高会放大噪声 |
工程智慧:坏通道不硬校——如果某通道真的坏了(增益塌陷),把它强行"拉"到正常水平只会把噪声一起放大,得不偿失。让异常通道保持低增益,仅修正相位,至少不引入新的污染。这正是
m_ChanErrorReduce参数存在的意义。
四、模式 1:内发射校准(SendAdjust)
4.1 与接收校准的差异
发射校准的物理场景不同:发射信号从各 TR 组件功放出来,经耦合网络取样,回到接收机测量。所以:
- 逐通道扫描:一次只开一个发射通道(
m_CurrentHDifrId/ChlId或 V),测完一个切下一个 m_NeedScanArrayNum = g_BeamArrayNum >> 1:发射校准只需要一半通道数(H/V 各半)- 每个通道测量后
m_CurScanArrayNum++,直到全部扫完才统一计算系数
4.2 关键流程(SendAdjustInit)
1. 关 TR、关波束系数
2. 设置 DIFR 直通系数 + DBF 默认系数
3. 下发内发射校准参数到 DSP
4. 下发发射波束系数(全关)→ TRBEAMPORT
5. 下发接收波束/校正系数(直通)→ RXBEAM/TRCORR
6. 打开第一个待测发射通道(m_TestHOrV 决定 H 或 V):
- 波束系数只给该通道 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);
为什么发射要多取一次反? 校准系数的相位符号取决于信号的传播方向:
- 接收链路:信号从天线→接收机,误差相位 在"接收方向"累积,补偿
- 发射链路:信号从发射机→天线,误差相位同样累积,但校准系数量化打包时的参考方向与接收相反(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);
公式:
- 幅度:dB → 线性()再乘 Q15 满刻度 32767
- 相位:度 → 弧度 → 三角函数分解为 I/Q
- 打包:I 放高 16 位、Q 放低 16 位
计算机知识:这是"极坐标→直角坐标→定点打包"的完整链路,也是 Q15 定点数的实际工程应用(详见《Q15 定点数格式完全指南》)。
六、内校准结果文件
%.3fGHz_内标定发射幅度相位值_20260807123000.txt
当前频率:9.100GHz
单元数:40
0.123456 45.678
...
- 第一行:频点(校准系数与频率强相关,不同频点必须分别校准)
- 第二行:单元数
- 每行:幅度(线性值)+ 相位(度)
七、一句话总结
内校准 = 用机内已知信号测出每个通道的幅相误差,用"幅度归一化 + 相位取反"生成校正系数,坏通道只校相位不校幅度。 发射校准额外做了逐通道扫描和相位反号处理。理解这两点,后面的外校准、暗室、远场测试都是它的变体。
WRSP6TK 雷达 TR 测试软件源码精讲(2):内校准——接收与发射
评论加载中…
