欢迎光临
我们一直在努力

CMO环境模型-气象模型算法详解

第 6 章 环境模型
环境模型不直接产生作战行为,但几乎所有探测与毁伤计算都以它为输入。本章涵盖气象(Weather)、地形(Terrain)、地表覆盖(LandCover)以及基础物理常量与公式(PhysicalConstants、Physics)四部分。
6.1 气象模型(Weather)
Weather.cs 共 2138 行。其核心数据结构 WeatherProfile 是一个“位置相关的气象剖面”——通过 GetWeatherAtThisTimeAndPlace 按时间与经纬度取得,每个单元都持有属于自己位置的 WeatherAtMyLocation。这意味着同一想定内不同海区可以有完全不同的天气条件。
表 6-1 WeatherProfile 字段与属性
字段/属性数据类型默认值含义(推断)

ITU-R P.676 建议书给出了大气气体衰减的工程近似算法。在 1–350 GHz 频段内,天顶方向的大气气体衰减可简化为氧气与水蒸气两项之和:

A_gas = A_O2 + A_H2O

其中氧气项与水蒸气项分别按以下简化公式估算(频率 f 以 GHz 为单位,水蒸气密度 ρ 以 g/m³ 为单位,衰减量单位为 dB/km):

A_O2 ≈ [ 7.19e-3 + 6.09/(f² + 0.227) + 4.81/((f − 57)² + 1.50) ] · f² · 1e-3

A_H2O ≈ [ 0.067 + 2.4/((f − 22.3)² + 6.6) + 7.33/((f − 183.3)² + 5.0)
+ 4.4/((f − 325.4)² + 10.1) ] · f² · ρ · 1e-4

数值示例(35 GHz)

输入参数:

  • 频率 f = 35 GHz
  • 水蒸气密度 ρ = 7.5 g/m³(中纬度夏季典型值)
  • 气压 1013.25 hPa,温度 15 ℃(标准大气)

计算过程:

氧气项:
A_O2 ≈ [ 7.19e-3 + 6.09/(35² + 0.227) + 4.81/((35 − 57)² + 1.50) ] · 35² · 1e-3
= [ 7.19e-3 + 6.09/1225.227 + 4.81/485.50 ] · 1225 · 1e-3
= [ 7.19e-3 + 4.970e-3 + 9.907e-3 ] · 1.225
≈ 0.02706 dB/km

水蒸气项:
A_H2O ≈ [ 0.067 + 2.4/((35 − 22.3)² + 6.6) + 7.33/((35 − 183.3)² + 5.0)
+ 4.4/((35 − 325.4)² + 10.1) ] · 35² · 7.5 · 1e-4
= [ 0.067 + 2.4/168.09 + 7.33/21993.89 + 4.4/84322.17 ] · 918.75
≈ [ 0.067 + 0.01428 + 0.000333 + 0.000052 ] · 918.75
≈ 0.07498 dB/km

总衰减:
A_gas = A_O2 + A_H2O ≈ 0.02706 + 0.07498 ≈ 0.102 dB/km

结果:在 35 GHz、水蒸气密度 7.5 g/m³ 的标准大气条件下,大气气体衰减约为 0.102 dB/km,其中水蒸气项(约 0.075 dB/km)明显大于氧气项(约 0.027 dB/km)。

大气衰减在雷达方程中的应用

雷达方程中,大气气体衰减以单程或双程损耗的形式进入链路。对单基地雷达,电磁波往返各穿过一次大气,双程大气损耗为:

L_atm = 2 · A_gas · R

其中 A_gas 为大气气体衰减系数(dB/km),R 为斜距(km)。将 L_atm 代入雷达方程,得到考虑大气衰减后的接收信噪比:

SNR = (P_t · G_t · G_r · λ² · σ) / ((4π)³ · R⁴ · k · T_s · B · L_sys · L_atm)

式中各符号含义:

  • P_t:发射峰值功率(W)
  • G_t、G_r:发射/接收天线增益(线性值)
  • λ:波长(m)
  • σ:目标雷达截面积(m²)
  • R:斜距(m)
  • k:玻尔兹曼常数(1.38e-23 J/K)
  • T_s:系统噪声温度(K)
  • B:接收机带宽(Hz)
  • L_sys:系统其它损耗(馈线、波导等,线性值)
  • L_atm:双程大气损耗(线性值,由 dB 值换算:L_atm = 10^(L_atm_dB/10))

应用示例(35 GHz 雷达)

设一部 35 GHz 单基地雷达对 10 km 处、RCS 为 1 m² 的目标进行探测,系统参数如下:

  • 发射功率 P_t = 1 kW = 1 000 W
  • 天线增益 G_t = G_r = 40 dB(线性值 10⁴)
  • 波长 λ = c/f ≈ 0.00857 m(35 GHz)
  • 系统噪声温度 T_s = 1 000 K
  • 接收机带宽 B = 1 MHz = 1e6 Hz
  • 系统其它损耗 L_sys = 2(约 3 dB)

计算步骤:

第 1 步:双程大气损耗
L_atm_dB = 2 · A_gas · R = 2 × 0.102 × 10 = 2.04 dB
L_atm = 10^(2.04/10) ≈ 1.60

第 2 步:代入雷达方程
SNR = (1000 × 10⁴ × 10⁴ × 0.00857² × 1) / ((4π)³ × 10000⁴ × 1.38e-23 × 1000 × 1e6 × 2 × 1.60)

第 3 步:逐项计算
分子 = 1000 × 1e8 × 7.34e-5 = 7.34e6
分母 = (4π)³ ≈ 1984.4
× 1e16(R⁴)
× 1.38e-23 × 1000 × 1e6 = 1.38e-14
× 2 × 1.60 = 3.20
分母 = 1984.4 × 1e16 × 1.38e-14 × 3.20 ≈ 8.77e5

SNR = 7.34e6 / 8.77e5 ≈ 8.37(线性值)
≈ 9.2 dB

结果:在 35 GHz、10 km 斜距、标准大气条件下,双程大气衰减约 2.04 dB,对应接收信噪比约 9.2 dB。若忽略大气衰减,SNR 约为 11.2 dB——可见在 10 km 距离上大气气体衰减对 35 GHz 雷达的影响约为 2 dB,属于不可忽略的链路损耗。该值可直接写入 WeatherProfile.GaseousAttenuationByFrequency 缓存,供雷达方程模块在对应频点查用,避免每次计算重复求解 ITU-R P.676。

C# 实现示例

下面给出 ITU-R P.676 简化算法的 C# 实现。代码包含三个核心方法:ComputeOxygenAttenuation(计算 A_O2)、ComputeWaterVaporAttenuation(计算 A_H2O)以及 GetGaseousAttenuation(汇总 A_gas 并写入缓存字典):

/// <summary>
/// ITU-R P.676 大气气体衰减简化算法(1–350 GHz,天顶方向)
/// 频率 f 单位 GHz,水蒸气密度 rho 单位 g/m³,返回衰减单位 dB/km
/// </summary>
public static class GaseousAttenuation
{
/// <summary>氧气项 A_O2(dB/km)</summary>
public static double ComputeOxygenAttenuation(double f)
{
double term1 = 7.19e-3;
double term2 = 6.09 / (f * f + 0.227);
double term3 = 4.81 / ((f – 57.0) * (f – 57.0) + 1.50);
return (term1 + term2 + term3) * f * f * 1e-3;
}

/// <summary>水蒸气项 A_H2O(dB/km)</summary>
public static double ComputeWaterVaporAttenuation(double f, double rho)
{
double term1 = 0.067;
double term2 = 2.4 / ((f – 22.3) * (f – 22.3) + 6.6);
double term3 = 7.33 / ((f – 183.3) * (f – 183.3) + 5.0);
double term4 = 4.4 / ((f – 325.4) * (f – 325.4) + 10.1);
return (term1 + term2 + term3 + term4) * f * f * rho * 1e-4;
}

/// <summary>降雨衰减 A_rain(dB/km),ITU-R P.838 幂律模型</summary>
/// <param name="f">频率(GHz)</param>
/// <param name="rainRate">降雨率(mm/h)</param>
public static double ComputeRainAttenuation(double f, double rainRate)
{
// 35 GHz、水平极化、仰角 0° 的典型系数(ITU-R P.838 表)
double k = 0.2701;
double alpha = 0.9128;
return k * Math.Pow(rainRate, alpha);
}
/// <summary>总衰减 A_gas = A_O2 + A_H2O(dB/km)</summary>
public static double ComputeTotalAttenuation(double f, double rho)
{
return ComputeOxygenAttenuation(f) + ComputeWaterVaporAttenuation(f, rho);
}
}

// 在 WeatherProfile 中按频率缓存,避免重复求解 ITU-R P.676
public partial class WeatherProfile
{

/// <summary>按频率缓存的大气降雨衰减字典(dB/km)</summary>
public TDictionary<double, double> RainAttenuationByFrequency { get; } = new(); /// <summary>按频率缓存的大气气体衰减字典(dB/km)</summary>
public TDictionary<double, double> GaseousAttenuationByFrequency { get; } = new();

/// <summary>
/// 获取指定频率的大气气体衰减;未命中缓存时计算并写入。
/// </summary>
/// <param name="f">频率(GHz)</param>
/// <param name="rho">水蒸气密度(g/m³)</param>
public double GetGaseousAttenuation(double f, double rho)
{
if (GaseousAttenuationByFrequency.TryGetValue(f, out double cached))
return cached;

double attenuation = GaseousAttenuation.ComputeTotalAttenuation(f, rho);
GaseousAttenuationByFrequency[f] = attenuation;
return attenuation;
}

/// <summary>
/// 获取指定频率的降雨衰减;未命中缓存时计算并写入。
/// </summary>
/// <param name="f">频率(GHz)</param>
/// <param name="rainRate">降雨率(mm/h)</param>
public double GetRainAttenuation(double f, double rainRate)
{
if (RainAttenuationByFrequency.TryGetValue(f, out double cached))
return cached;

double attenuation = GaseousAttenuation.ComputeRainAttenuation(f, rainRate);
RainAttenuationByFrequency[f] = attenuation;
return attenuation;
}

/// <summary>当降雨率变化时清空降雨衰减缓存,强制下次按新降雨条件重算</summary>
private void InvalidateRainAttenuationCache()
{
RainAttenuationByFrequency.Clear();
}
} /// <summary>当温度/气压/湿度变化时清空缓存,强制下次按新气象条件重算</summary>
private void InvalidateGaseousAttenuationCache()
{
GaseousAttenuationByFrequency.Clear();
}
}

调用示例(35 GHz):

var profile = new WeatherProfile();
double f = 35.0; // 频率 35 GHz
double rho = 7.5; // 水蒸气密度 7.5 g/m³

double aO2 = GaseousAttenuation.ComputeOxygenAttenuation(f);
double aH2O = GaseousAttenuation.ComputeWaterVaporAttenuation(f, rho);
double aGas = profile.GetGaseousAttenuation(f, rho);

Console.WriteLine($"A_O2 = {aO2:F5} dB/km"); // ≈ 0.02706
Console.WriteLine($"A_H2O = {aH2O:F5} dB/km"); // ≈ 0.07498
Console.WriteLine($"A_gas = {aGas:F5} dB/km"); // ≈ 0.10204

说明:

  • GetGaseousAttenuation 采用“先查缓存、未命中再计算”的策略:首次调用 35 GHz 时计算并写入字典,后续同频点查询直接返回缓存值,避免重复求解 ITU-R P.676。
  • 当 AverageTemp / Pressure / RelativeHumidity 任一属性变化时,应调用 InvalidateGaseousAttenuationCache 清空字典,确保缓存始终与当前气象条件一致(对应前文所述的属性联动链)。

该值可作为 WeatherProfile.GaseousAttenuationByFrequency 在 35 GHz 频点上的参考缓存值,供雷达方程与链路预算直接查用。
GaseousAttenuationByFrequencyTDictionary<double, double>按频率缓存的大气气体衰减字典(避免重复求解 ITU-R P.676)
SeaStateint海况等级(0–9),决定海杂波与多径反射(见表 4-17)

降雨衰减(ITU-R P.838)

降雨是毫米波频段最主要的传播损耗来源。ITU-R P.838 建议书给出了降雨衰减的工程近似算法:在给定频率下,单位路径降雨衰减(dB/km)由降雨率 R(mm/h)的幂律关系确定:

A_rain = k · R^α

其中系数 k 与 α 取决于频率、极化方式与入射仰角。对 35 GHz、水平极化、仰角 0° 的典型取值:

k ≈ 0.2701,α ≈ 0.9128

数值示例(35 GHz,降雨率 10 mm/h)

输入参数:

  • 频率 f = 35 GHz
  • 降雨率 R = 10 mm/h
  • 极化:水平极化,仰角 0°
  • 系数 k = 0.2701,α = 0.9128

计算过程:

A_rain = k · R^α
= 0.2701 × 10^0.9128
= 0.2701 × 8.184
≈ 2.211 dB/km

结果:在 35 GHz、降雨率 10 mm/h 的水平极化条件下,单位路径降雨衰减约为 2.21 dB/km。对比前文大气气体衰减约 0.102 dB/km,可见降雨衰减比气体衰减高一个数量级以上——在降雨环境下,降雨衰减是链路预算中不可忽略的主导项。

RainfallRatefloat降雨率(mm/h),决定降雨衰减
CloudInfoTCloudInfo云层信息结构(低/中/高三层的底高、顶高、云量厚度)
ContrailAltitudeint凝结尾迹生成高度(m),影响目视发现
SurfaceVisibilityKMfloat地面能见度(km),目视模型的直接输入
RunwayVisualRangeNMdouble跑道视程(nm),决定能否起降
GroundReflectionCoeffdouble地面反射系数(多径计算用)
SurfaceRefractivitydouble地面折射率 N,由温度/气压/湿度导出
SurfaceDuctHeightdouble表面波导高度(m)
EvaporationDuctHeightdouble蒸发波导高度(m)
RadiusEffectivedouble有效地球半径(m),由 ΔN 导出
k50doublek 因子(中值),k50 = 157/(157 − ΔN)
RainfallRate_Description (属性)string降雨强度中文描述(无雨/小雨/中雨/大雨/暴雨/大暴雨/特大暴雨)
FractionUnderRain (属性)float降雨覆盖比例(0–1),其 setter 会同步重设云层结构
CloudInfo_Description (属性)string云况文字描述
AverageTemp (属性)double平均气温(℃),默认 15
Pressure (属性)double气压(hPa),默认 1013.25
RelativeHumidity (属性)double相对湿度(%),默认 86.17
SurfaceVisibilityNM (属性)float地面能见度(nm),由 km 换算
DELTA_N (属性)double折射率梯度 ΔN,默认 39(标准大气)
该结构中存在一条重要的属性联动链,是理解气象如何影响雷达的关键:

设置 RainfallRate
→ 清空 RainAttenuationByFrequency 缓存(强制降雨衰减重算)
→ 同步更新 RainfallRate_Description(降雨强度中文描述)设置 AverageTemp / Pressure / RelativeHumidity 中任意一项
→ 重新计算 SurfaceRefractivity(地面折射率)
→ 清空 GaseousAttenuationByFrequency 缓存(强制大气衰减重算)

设置 DELTA_N
→ RadiusEffective = f(ΔN) 有效地球半径
→ k50 = 157 / (157 − ΔN) k 因子

设置 FractionUnderRain
→ 按 0.0/0.1/0.2/…/1.0 十一档重设低/中/高三层云的底高、顶高与厚度
FractionUnderRain 的实现颇具特色:它不是一个独立的标量参数,而是一个“天气档位选择器”——设定降雨覆盖比例即等同于选择一套完整的云层配置。例如取 0.1 时给出低云 1 524–2 134 m、厚度等级 2 的配置,取 0.4 时给出低云 610–2 134 m、厚度等级 4 的配置。这样设计保证了降雨与云量在物理上始终自洽。
气象数据可以来自三个渠道:想定作者手工设定的全局天气、按网格插值的气象场(TWeatherGridType、TBILInfo、TWeatherHeader 支持读取外部二进制气象栅格),以及 Nature 方设置的自定义环境区。
表 6-2 TAtmosphereType 标准大气模型类型
枚举成员取值说明
atm_Summer_Midlat(顺序值)
atm_Winter_Midlat(顺序值)
atm_Summer_Subart(顺序值)
atm_Winter_Subart(顺序值)
atm_Annual_Tropic(顺序值)
atm_ITU_R_Ref_Std(顺序值)
表 6-3 TTimeOfDayType 时段类型
枚举成员取值说明
tod_Day(顺序值)
tod_Twilight(顺序值)
tod_Night(顺序值)
表 6-4 TLowCloudType 低云类型
枚举成员取值说明
None(顺序值)
Cb_Cumulonimbus(顺序值)
Sc_Stratocumulus(顺序值)
St_Stratus(顺序值)
Cu_Cumulus(顺序值)
表 6-5 TMiddleCloudType 中云类型
枚举成员取值说明
None0
Ac_Altocumulus5
As_Altostratus6
Ns_Nimbostratus7
表 6-6 THighCloudType 高云类型
枚举成员取值说明
None0
Ci_Cirrus8
Cs_Cirrostratus9
Cc_Cirrocumulus10
表 6-7 TAtmosphere 大气状态结构
字段/属性数据类型默认值含义(推断)
Pressuredouble气压(hPa)
Temperaturedouble温度(K)
Rhodouble空气密度(kg/m³)

6.2 本章小结

本章围绕环境模型展开,核心是气象剖面按位置独立——每个单元通过 GetWeatherAtThisTimeAndPlace 持有属于自己的 WeatherAtMyLocation,同一想定内不同海区可有完全不同的天气条件。大气气体衰减采用 ITU-R P.676 简化算法,将天顶方向衰减拆为氧气与水蒸气两项,并通过 GaseousAttenuationByFrequency 字典按频率缓存,避免重复求解。属性联动链是理解气象影响雷达的关键:设置温压湿任一项会重算地面折射率并清空衰减缓存,设置 ΔN 会联动有效地球半径与 k 因子。FractionUnderRain 作为“天气档位选择器”,按十一档同步重设云层配置,保证降雨与云量物理自洽。气象数据可来自手工全局天气、网格插值气象场与自定义环境区三个渠道。

赞(0)
未经允许不得转载:171主机测评 » CMO环境模型-气象模型算法详解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址