- 发布日期
WRSP6TK 雷达 TR 测试软件源码精讲(3):外校准——接收与发射
作者
M先生
WRSP6TK 雷达 TR 测试软件源码精讲(3):外校准——接收与发射
本篇详解模式 2(外接收校准)与模式 3(外发射校准)。外校准与内校准的数学核心完全一样(GetCalibrationFactor),差别在信号怎么进来/出去、怎么扫描。
一、外校准 vs 内校准的本质区别
内校准:信号在雷达内部走
机内信号源 ──► 校准网络 ──► 各接收通道(或从发射通道取样)
外校准:信号从天线口进出
外部信号源 ──► 天线 ──► 各接收通道 (模式2 外接收)
各发射通道 ──► 天线 ──► 外部接收设备 (模式3 外发射)
外校准的特点:
- 经过完整天线链路(含天线本身),校准结果更真实
- 需要外部仪器(信号源、频谱仪等)
- 需要转台/扫描机构配合——测不同单元时,转台或信号源移动到不同位置(这就是为什么外校准要开 UART 串口)
- 需要微波暗室或外场(避免多径干扰)
术语注释:
- 微波暗室:四壁贴吸波材料的房间,消除反射,模拟自由空间。
- 远场条件:天线测试距离需满足 ( 为口径, 为波长),此时天线处于平面波照射下。
二、模式 2:外接收校准(AntRecvAdjust)
2.1 完整流程
┌─ AntRecvAdjustInit ─────────────────────────────────────┐
│ 1. 检查外接收校准参数文件 │
│ 2. 关所有 TR、波束系数 │
│ 3. 设 DIFR/DBF 直通系数 │
│ 4. 打开 UART 串口(TRTestOpenUart,发 0x5a 握手) │
│ —— 外校准必须知道转台位置,所以需要串口同步 │
│ 5. 下发外接收校准 Difr/Calibtate 参数到 DSP │
│ 6. 下发波束/校正系数(直通) │
│ 7. 开所有 DIFR 接收通道 │
│ 8. m_StartTrTest = TRUE(等待 UART 位置帧驱动) │
└──────────────────────────────────────────────────────────┘
│ UART 位置帧到达(OnComm)→ 位置有效 → 定时器 → 取数
▼
┌─ AntRecvAdjustDataProcess(每帧)───────────────────────┐
│ 按当前扫描位置(m_ArrayScanDir 正/反向)计算 DIFR/Chl │
│ 提取该单元 I/Q → m_AdjustSrcIQ[m_CurScanArrayNum] │
│ m_CurScanArrayNum++;SetEvent │
└──────────────────────────────────────────────────────────┘
│
▼
┌─ AntRecvAdjustDataProc ─────────────────────────────────┐
│ if (m_CurScanArrayNum >= m_NeedScanArrayNum) │
│ { // 所有单元扫完 │
│ 1. 关 TR/波束、关 UART │
│ 2. 若反向扫描 → 数据反转(m_AdjustSrcIQ 前后对调) │
│ 3. GetCalibrationFactor 计算系数 │
│ 4. 保存"外校准H/V校准系数 + 源数据"文件 │
│ 5. 刷新显示,弹窗完成 │
│ } │
└──────────────────────────────────────────────────────────┘
2.2 扫描方向与数据反转(重点)
// 正向扫描
m_CurrentHDifrId = g_ArrayMapDIFR[m_CurScanArrayNum];
m_CurrentHChlId = g_ArrayMapChannel[m_CurScanArrayNum];
// 反向扫描
m_CurrentHDifrId = g_ArrayMapDIFR[m_NeedScanArrayNum - 1 - m_CurScanArrayNum];
m_CurrentHChlId = g_ArrayMapChannel[m_NeedScanArrayNum - 1 - m_CurScanArrayNum];
为什么反向扫描后要反转数据?
if(m_ArrayScanDir) // 反向
{
HalfBeamArrayNum = m_NeedScanArrayNum>>1;
for(i=0; i<HalfBeamArrayNum; i++)
{
// 交换 i 与 N-1-i 的 I/Q
tmpI = m_AdjustSrcIQ[i][0];
...
m_AdjustSrcIQ[i][0] = m_AdjustSrcIQ[m_NeedScanArrayNum-i-1][0];
...
}
}
物理原理:转台从 1 号单元扫到 N 号(正向),数据顺序是 1,2,...,N。反向扫时,数据按 N,N-1,...,1 到达。而后续计算(GetCalibrationFactor、保存文件)都假设"第 i 个数据 = 第 i 个单元"。所以反向扫描必须在处理前把数据反转回正向顺序,保证"数据索引 = 单元编号"的约定不变。
工程要点:扫描方向反转(蛇形扫描)能节省转台往返时间,但必须配对"数据重排"。这类"物理顺序 → 逻辑顺序"的转换,是运动控制+数据采集系统最常见的隐藏 bug 源。
2.3 接收数据偏移
if(m_TestHOrV) // V
DataOff = m_CurrentVDifrId * g_ValidChannelNum + m_CurrentVChlId;
else // H
DataOff = m_CurrentHDifrId * g_ValidChannelNum + m_CurrentHChlId;
m_AdjustSrcIQ[m_CurScanArrayNum][0] = tmpIQ[DataOff<<1];
m_AdjustSrcIQ[m_CurScanArrayNum][1] = tmpIQ[(DataOff<<1)+1];
外接收每次只取一个单元(当前扫描位置的 DIFR×通道),与内接收"一次取所有波束"不同。
三、模式 3:外发射校准(AntSendAdjust)
3.1 与模式 2 的对称性
模式 3 与模式 2 结构对称,区别在发射侧:
AntSendAdjustInit
├─ 逐单元扫描发射:
│ ├─ 波束系数:全 0,只给当前单元 0x7fff0000
│ │ m_BeamData[i][m_CurrentHChlId] = 0x7fff0000;
│ └─ TR 通道:UART0 只开当前单元
├─ 接收侧固定用校准通道取样(m_ReceiveDataOffsetI/Q)
│ m_AdjustSrcIQ[..] = tmpIQ[m_ReceiveDataOffsetI/Q]
└─ 扫完 → 数据反转(如反向)→ GetCalibrationFactor → 保存
3.2 发射波束系数的"只开一路"
// 全 0 = 全关
m_TmpBeamData[i][j] = 0;
m_BeamData[i][j] = 0;
// 只给当前通道 1.0 幅度
m_BeamData[i][m_CurrentHChlId] = 0x7fff0000;
为什么发射校准要"只开一路"? 发射通道同时开多个,外部接收设备收到的是多路信号的矢量叠加,无法分离每路的贡献。逐路开启,一次测一路,干净利落。
3.3 发射校准的相位符号(与接收相反)
// 发射:相位取 -1 倍
I = (int)(rat*cos(m_CalibDataPhase[..]*(-1.0f)*normal_pi));
Q = (int)(rat*sin(m_CalibDataPhase[..]*(-1.0f)*normal_pi));
与内发射校准相同(见第 2 篇 §4.4),收发互易性要求符号相反。
四、外校准的 UART 串口流程
TRTestOpenUart:
├─ InitPort(COM号, 波特率) → 打开串口
├─ StartMonitoring() → 启动接收线程
└─ WriteToPort(0x5a) → 发握手,请求位置帧
OnComm(每字节到达):
0xa5 帧头 → 收 3 字节计数 → 拼完一帧
├─ Stm32Count == m_DataCount(位置连续)→ 有效 → SetTimer
└─ 否则 → m_UartErrorCount++
位置帧的作用:转台/扫描机构每到一个新位置发一帧计数,软件据此知道"可以取下一个单元的数据了"。计数连续性校验是关键的可靠性设计——丢一帧就错位,必须有检测。
五、外校准结果文件
%.3fGHz_外校准H校准系数_20260807....txt
当前频率:9.100GHz
单元数:40
0.987654 12.345
...
同时保存"源数据"文件(校准前的原始幅相),便于事后分析。
六、一句话总结
外校准把信号引到天线口,用转台逐单元扫描,数学计算与内校准完全相同,但多了两件事:UART 位置同步和扫描方向的数据反转。 它校准的是"含天线在内的完整通道",比内校准更真实,代价是需要暗室/外场和外部仪器。
WRSP6TK 雷达 TR 测试软件源码精讲(3):外校准——接收与发射
评论加载中…
