- 发布日期
WRSP6TK 雷达 TR 测试软件源码精讲(7):数据后处理原理
作者
M先生
WRSP6TK 雷达 TR 测试软件源码精讲(7):数据后处理原理
本篇讲解测试数据离线处理:暗室采集的"单元幅相矩阵"如何变成方向图?波束宽度和副瓣怎么自动提取?校准系数文件怎么生成和打包?这是把"原始数据"变成"测试结论"的关键一环。
一、方向图合成:从单元幅相到波瓣图
1.1 数据读取(ReadTrData)
// 文件格式:[测试方式说明][阵列信息][阵列数据]
// 阵列数据:每行 "幅度(dB) 相位(度)"
Amp = pow(10, Amp * 0.05); // dB → 线性
Phase = Phase * pi/180.0f; // 度 → 弧度
DataIQ[i][j][0] = Amp*cos(Phase); // I = A cosφ
DataIQ[i][j][1] = Amp*sin(Phase); // Q = A sinφ
还原复数:文件里存的是"幅度(dB)+ 相位(度)",读回来先转线性幅度、弧度相位,再合成复数 。
1.2 方向图合成(OnBnClickedButtonTrdatacalculate 核心)
WaveLRecip = Freq / 300.0f; // 1/λ(频率 GHz → 波长 cm)
MulFactU = 2*pi*WaveLRecip*HInterval; // 2π/λ × 水平间距
MulFactV = 2*pi*WaveLRecip*VInterval; // 2π/λ × 垂直间距
// 方位扫描(固定俯仰角 HViewAngle)
sinTheta = sin(HViewAngle); cosTheta = cos(HViewAngle);
for (j=0; j<TRSitaPointNum; j++) // 方位角遍历
{
sinFai = sin(startAngle + j*datAngle);
u = MulFactU * cosTheta * sinFai; // 波数域 u 分量
v = MulFactV * sinTheta; // 波数域 v 分量
sumI = 0; sumQ = 0;
for (k=0; k<HSampleNum; k++) // 行
for (l=0; l<VSampleNum; l++) // 列
{
kulv = k*u + l*v; // 相位差 = k·u + l·v
sumI += DataIQ[l][k][0]*cos(kulv) - DataIQ[l][k][1]*sin(kulv);
sumQ += DataIQ[l][k][0]*sin(kulv) + DataIQ[l][k][1]*cos(kulv);
}
AMP = 10*log10(sumI*sumI + sumQ*sumQ); // 功率 → dB
HLobeData[j] = AMP; // 方位方向图
}
// 俯仰扫描同理(固定方位角 EViewAngle)
1.3 数学本质:阵列方向图公式
标准阵列方向图( 平面阵):
其中波数域变量:
代码对照:
kulv = k*u + l*v对应指数里的 (MulFactU/V已含 )sumI/sumQ的递推式 = 复数乘法 的实部/虚部展开:
AMP = 10lg(|Σ|²)把合成场强转成功率(dB)
这就是相控阵天线方向图的"定义式"——每个单元贡献一个带空间相位差的复矢量,矢量求和再取模。软件在 (或 )方向逐点扫描,把方向图"扫"出来。
1.4 例子
一个 8×8 阵、单元间距 cm、GHz:
- cm, rad/cm
- 方向相邻单元相位差
- 波束指向 (如 10°)时,主瓣出现在 处
验证: 时所有单元同相(),主瓣峰值;偏离后相位散开、求和变小,形成方向图的波束形状。
二、波束宽度提取(GetBeamWidth)
2.1 算法流程
1. 从主瓣最大值位置向两侧扫描:
- 若下降超过 10dB → 停(认为出了主瓣区)
- 若遇局部上升 → 更新最大值、继续(越过小的起伏)
2. 记录主瓣左/右边界(HLeftStart/HRightStart)
3. 在边界内找 3dB 点:
- 从边界向最大值方向移动,找"幅度降到 Max-3dB"的位置
- 用线性插值精确定位(x0/x1 比较取邻近点)
4. BeamWidth = (右3dB点 - 左3dB点) × 步进 × 0.01°
2.2 关键代码
for(i=HLeftStart; i>=0; i--) // 从左边界向主瓣中心找左3dB点
{
if(MaxValue - HLobeData[i] < 3.0f)
{
LAmpValue = HLobeData[i];
LBeamWidthID = i;
}
else
{
// 线性插值:3dB 点在 i 和 i+1 之间
x0 = 3.0f - (MaxValue - LAmpValue); // 距 i 侧的距离
x1 = MaxValue - HLobeData[i] - 3.0f; // 距 i+1 侧的距离
LBeamWidthID = (x0 < x1) ? i+1 : i; // 取更近的
break;
}
}
插值思想:方向图是离散采样的(步进 0.01°~1°),3dB 点多半落在两个采样点之间。用"到两侧的垂直距离"比较,选更接近 3dB 的采样点——简单的一阶近似插值。
10dB 边界扫描的巧妙:先找 10dB 边界(主瓣范围),再在范围内找 3dB 点。这样副瓣区的高点不会干扰 3dB 定位。"先粗定位再精定位"是工程算法常用的分层策略。
三、副瓣提取(GetLobe)
// 从主瓣边界向两侧找"第一个局部极小后再上升的峰值"
for(i=HLeftStart-3; i>=0; i--) // 向左
{
if (OldValue - HLobeData[i] >= 0) OldValue = HLobeData[i]; // 持续下降
else { Flag0 = TRUE; LMaxID = i; break; } // 开始上升 → 极小点
}
for(i=0; i<LMaxID; i++) // 极小点外侧找最大副瓣
if (MaxLobeH < HLobeData[i]) { MaxLobeH = HLobeData[i]; ... }
// 右侧同理
算法:
- 从主瓣边界外侧出发,沿方向图走,只要幅度持续下降就继续(
OldValue >= 当前值) - 一旦开始上升,说明越过了第一个副瓣的"谷底"——记录极小点位置
- 在极小点外侧继续找最大值 = 第一副瓣电平
物理意义:主瓣→副瓣之间的"谷"(极小点)是天然分界。找到谷底,副瓣区就在它外侧。
副瓣电平 = 主瓣峰值 - 最大副瓣峰值:
value.Format("%.2fdB", maxAmpH - MaxLobeH); // 显示在界面
四、校准系数文件生成(CreateData)
4.1 H+V 合成(OnBnClickedButtonTrtestcreatdata)
if (DualPolarProcEna) // 双极化
{
// H 半区 + V 半区拼接
for (i=0; i<length; i++)
{
amp = pow(10, HDataAmp[i]*0.05); phase = HDataPhase[i]*π/180;
SrcIQ[i][0] = amp*cos(phase); SrcIQ[i][1] = amp*sin(phase); // H
amp = pow(10, VDataAmp[i]*0.05); phase = VDataPhase[i]*π/180;
SrcIQ[i+length][0] = amp*cos(phase); SrcIQ[i+length][1] = amp*sin(phase); // V
}
// 再统一走 GetCalibrationFactor 计算
}
为什么 H/V 分开存、合成后统一算? 双极化雷达的 H、V 通道独立校准(各自有源器件),但系数表要按"物理地址"合并成一张——前半段 H、后半段 V,与 DSP 的通道布局一致。
4.2 忽略幅度(IgnoreAmpFlag)
if (m_IgnoreAmpFlag) // 只校相位
{
m_CalibDataPhase[i] = m_HDataPhase[i]; // 相位用测量的
m_CalibDataAmp[i] = 0.0f; // 幅度置 0(=0dB,不改幅度)
}
应用场景:当通道幅度一致性已经很好(或只想验证相位)时,跳过幅度校正。幅度 0dB、相位保留——配置化的"校哪些"开关。
4.3 展开相位(CreateAdjustExpend)
m_CalibDataPhase[i] += m_ExpendPhase[i]; // 相位 + 展开项
// 归一到 [-180°, 180°]
if (m_CalibDataPhase[i] > 180.0f) m_CalibDataPhase[i] -= 360.0f;
else if (m_CalibDataPhase[i] < -180.0f) m_CalibDataPhase[i] += 360.0f;
展开相位(ExpendPhase)是什么? 相控阵波束扫描需要随波束指向变化的相位梯度()。如果把"波束指向相位"直接加进校准系数,换波束指向就要重算。工程上常把固定校准量和可变波束指向量分开:
软件提供"校准系数 + 展开相位 = 合成系数"的工具(OnBnClickedButtonTrtestcreatadjustexpend),并做 ±180° 归一化(相位模糊处理: 与 等价,统一表示避免计算歧义)。
五、窗函数速查(方向图加权)
| 窗 | 公式 | 副瓣电平 | 主瓣展宽 | 用途 |
|---|---|---|---|---|
| 矩形 | -13.2 dB | 1.00× | 最大增益、最窄波束 | |
| 汉宁 | -31.5 dB | 1.62× | 通用低副瓣 | |
| 汉明 | -43 dB | 1.48× | 最小化峰值副瓣 | |
| 布莱克曼 | -58 dB | 1.89× | 极低副瓣 | |
| 泰勒 | 可指定电平 | 可设(如-30dB) | ~1.2× | 雷达阵列首选 |
副瓣与波束宽度不可兼得:压低副瓣必然展宽主瓣、损失增益。测试不同指标时选不同窗——这是天线设计的基本折中。
六、一句话总结
后处理 = 把"单元幅相矩阵"用阵列方向图公式合成波瓣图,用"10dB 边界 + 3dB 插值"提取波束宽度,用"谷底分界"找副瓣,再把校准/展开相位按 Q15 打包成硬件系数。 全部是"数组 + 循环 + 三角函数"的经典数字信号处理,没有任何黑魔法——理解了阵列公式和定点打包,整个软件就通了。
系列回顾:
WRSP6TK 雷达 TR 测试软件源码精讲(7):数据后处理原理
评论加载中…
