调整了紫外线、红外线、毫米波、激光等传输模型,增加了目标位置关系和大气参数分布的考虑。
This commit is contained in:
parent
268e241803
commit
ff7bc13a1a
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* 版本历史:
|
||||
* 1.0.0 (2024-10-13): 初始版本,提供各种大气传输模型的计算方法。作者:田建勇
|
||||
* 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇
|
||||
*/
|
||||
|
||||
namespace AirTransmission
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* 版本历史:
|
||||
* 1.0.0 (2024-10-13): 初始版本,实现大气湍流对光传输影响的计算模型。作者:田建勇
|
||||
* 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇
|
||||
*/
|
||||
|
||||
namespace AirTransmission
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* 版本历史:
|
||||
* 1.0.0 (2024-10-13): 初始版本,实现红外线在大气中的传输特性计算,包括水蒸气和CO2的影响。作者:田建勇
|
||||
* 1.0.0 (2024-10-13): 初始版本,实现红外线在大气中的传输特性计算。作者:田建勇
|
||||
* 1.1.0 (2024-10-18): 改进版本,采用光谱模型法计算红外线透过率。作者:田建勇
|
||||
*/
|
||||
|
||||
namespace AirTransmission
|
||||
@ -8,36 +9,142 @@ namespace AirTransmission
|
||||
/// <summary>
|
||||
/// 红外线传输模型类,用于计算红外线在大气中的传输特性
|
||||
/// </summary>
|
||||
public class IRTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather)
|
||||
public class IRTransmittanceModel : TransmittanceModel
|
||||
{
|
||||
// 红外线波长(微米)
|
||||
private const double IR_WAVELENGTH = 10.0;
|
||||
// 光谱分段参数
|
||||
private const double MIN_WAVELENGTH = 3.0; // 红外波段最小波长(微米)
|
||||
private const double MAX_WAVELENGTH = 12.0; // 红外波段最大波长(微米)
|
||||
private const int SPECTRAL_BANDS = 100; // 光谱分段数
|
||||
private const double IR_WAVELENGTH = 10.0; // 主要计算波长(微米)
|
||||
|
||||
public IRTransmittanceModel(WeatherCondition weather) : base(weather) { }
|
||||
|
||||
/// <summary>
|
||||
/// 计算给定距离的红外线透过率
|
||||
/// </summary>
|
||||
/// <param name="distance">传输距离(米)</param>
|
||||
/// <returns>红外线透过率(0到1之间的值)</returns>
|
||||
public override double CalculateTransmittance(double distance)
|
||||
{
|
||||
double attenuationFactor = CalculateIRAttenuationFactor();
|
||||
double rainAttenuation = CalculateRainAttenuation(distance, IR_WAVELENGTH);
|
||||
double fogAttenuation = CalculateFogAttenuation(distance);
|
||||
double dustAttenuation = CalculateDustAttenuation(distance);
|
||||
double snowAttenuation = CalculateSnowAttenuation(distance, IR_WAVELENGTH);
|
||||
double waterVaporAttenuation = CalculateWaterVaporAttenuation(distance);
|
||||
double co2Attenuation = CalculateCO2Attenuation(distance);
|
||||
// 将距离转换为千米
|
||||
double distanceInKm = distance / 1000.0;
|
||||
|
||||
double transmittance = Math.Exp(-attenuationFactor * distance - rainAttenuation - fogAttenuation - dustAttenuation - snowAttenuation - waterVaporAttenuation - co2Attenuation);
|
||||
// 计算各种衰减机制的总和
|
||||
double totalAttenuation = 0;
|
||||
double wavelengthStep = (MAX_WAVELENGTH - MIN_WAVELENGTH) / SPECTRAL_BANDS;
|
||||
|
||||
return Math.Max(0, Math.Min(1, transmittance));
|
||||
for (int i = 0; i < SPECTRAL_BANDS; i++)
|
||||
{
|
||||
double wavelength = MIN_WAVELENGTH + i * wavelengthStep;
|
||||
double bandAttenuation = CalculateBandAttenuation(wavelength);
|
||||
double spectralWeight = GetSpectralWeight(wavelength);
|
||||
|
||||
totalAttenuation += bandAttenuation * spectralWeight;
|
||||
}
|
||||
|
||||
// 计算基本透过率
|
||||
double baseTransmittance = Math.Exp(-totalAttenuation * distanceInKm);
|
||||
|
||||
// 应用天气条件的影响
|
||||
double weatherEffect = CalculateWeatherEffect(distance);
|
||||
double finalTransmittance = baseTransmittance * weatherEffect;
|
||||
|
||||
return Math.Max(0, Math.Min(1, finalTransmittance));
|
||||
}
|
||||
|
||||
private double CalculateBandAttenuation(double wavelength)
|
||||
{
|
||||
// 进一步增加衰减系数
|
||||
double rayleighScattering = CalculateRayleighScattering(wavelength) * 4.0; // 从2.0改为4.0
|
||||
double mieScattering = CalculateMieScattering(wavelength) * 5.0; // 从3.0改为5.0
|
||||
double molecularAbsorption = CalculateMolecularAbsorption(wavelength) * 4.0; // 从2.5改为4.0
|
||||
|
||||
return rayleighScattering + mieScattering + molecularAbsorption;
|
||||
}
|
||||
|
||||
private double CalculateRayleighScattering(double wavelength)
|
||||
{
|
||||
// Rayleigh散射系数计算(km^-1)
|
||||
// 进一步增加 Rayleigh 散射的影响
|
||||
double wavelengthMicrons = wavelength;
|
||||
return 0.02735 * Math.Pow(wavelengthMicrons, -4.08) * (Pressure / 1013.25) * (288.15 / Temperature);
|
||||
}
|
||||
|
||||
private double CalculateMieScattering(double wavelength)
|
||||
{
|
||||
// Mie散射系数计算(km^-1)
|
||||
// 进一步增加 Mie 散射的影响
|
||||
double beta = 3.91 / Visibility;
|
||||
double alpha = 1.2 * Math.Pow(wavelength / 0.55, -1.3);
|
||||
return beta * alpha * (AerosolDensity / STANDARD_AEROSOL_DENSITY) * 3.5; // 从2.0改为3.5
|
||||
}
|
||||
|
||||
private double CalculateMolecularAbsorption(double wavelength)
|
||||
{
|
||||
// 分子吸收系数计算(km^-1)
|
||||
double waterVaporAbsorption = CalculateWaterVaporAbsorption(wavelength);
|
||||
double co2Absorption = CalculateCO2Absorption(wavelength);
|
||||
|
||||
return waterVaporAbsorption + co2Absorption;
|
||||
}
|
||||
|
||||
private double CalculateWaterVaporAbsorption(double wavelength)
|
||||
{
|
||||
// 水汽吸收系数(km^-1)
|
||||
// 进一步增加水汽吸收的影响
|
||||
double waterVaporDensity = CalculateWaterVaporDensity();
|
||||
|
||||
if (wavelength >= 5.5 && wavelength <= 7.5)
|
||||
return 2.4 * waterVaporDensity; // 从1.2改为2.4
|
||||
else if (wavelength >= 2.5 && wavelength <= 3.5)
|
||||
return 1.8 * waterVaporDensity; // 从0.9改为1.8
|
||||
else
|
||||
return 0.6 * waterVaporDensity; // 从0.3改为0.6
|
||||
}
|
||||
|
||||
private double CalculateWaterVaporDensity()
|
||||
{
|
||||
// 使用Magnus公式计算饱和水汽压
|
||||
double a = 17.27;
|
||||
double b = 237.7;
|
||||
double saturationVaporPressure = 6.112 * Math.Exp((a * (Temperature - 273.15)) / (b + (Temperature - 273.15)));
|
||||
|
||||
// 计算实际水汽压
|
||||
double actualVaporPressure = (Humidity / 100.0) * saturationVaporPressure;
|
||||
|
||||
// 计算水汽密度 (g/m³)
|
||||
return (actualVaporPressure * 2.16679) / Temperature;
|
||||
}
|
||||
|
||||
private double CalculateCO2Absorption(double wavelength)
|
||||
{
|
||||
// CO2吸收系数(km^-1)
|
||||
// 增加CO2吸收的影响
|
||||
if (wavelength >= 4.2 && wavelength <= 4.4)
|
||||
return 1.2 * (CO2Concentration / 400.0); // 从0.6改为1.2
|
||||
else if (wavelength >= 14.0 && wavelength <= 16.0)
|
||||
return 1.0 * (CO2Concentration / 400.0); // 从0.5改为1.0
|
||||
else
|
||||
return 0.16 * (CO2Concentration / 400.0); // 从0.08改为0.16
|
||||
}
|
||||
|
||||
private double GetSpectralWeight(double wavelength)
|
||||
{
|
||||
// 调整权重分布
|
||||
if (wavelength >= 3.0 && wavelength <= 5.0)
|
||||
return 0.8; // 从1.0改为0.8
|
||||
else if (wavelength >= 8.0 && wavelength <= 12.0)
|
||||
return 0.6; // 从0.8改为0.6
|
||||
else
|
||||
return 0.2; // 从0.3改为0.2
|
||||
}
|
||||
|
||||
private double CalculateWeatherEffect(double distance)
|
||||
{
|
||||
// 降低天气效应的影响
|
||||
double rainEffect = CalculateRainAttenuation(distance, IR_WAVELENGTH) * 1.2; // 从1.5改为1.2
|
||||
double snowEffect = CalculateSnowAttenuation(distance, IR_WAVELENGTH) * 1.2; // 从1.5改为1.2
|
||||
double fogEffect = CalculateFogAttenuation(distance) * 1.5; // 从2.0改为1.5
|
||||
double dustEffect = CalculateDustAttenuation(distance) * 1.5; // 从2.0改为1.5
|
||||
|
||||
return Math.Exp(-2.0 * (rainEffect + snowEffect + fogEffect + dustEffect)); // 从3.0改为2.0
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雨对红外线的衰减系数K
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(微米)</param>
|
||||
/// <returns>雨衰减系数K</returns>
|
||||
protected override double CalculateRainKCoefficient(double wavelength)
|
||||
{
|
||||
if (wavelength >= 8 && wavelength <= 12)
|
||||
@ -47,18 +154,12 @@ namespace AirTransmission
|
||||
}
|
||||
else if (wavelength >= 3 && wavelength <= 5)
|
||||
{
|
||||
// 对于中远红外波段(3-5μm)
|
||||
// 对于中红外波段(3-5μm)
|
||||
return 0.2656;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雨对红外线的衰减系数α
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(微米)</param>
|
||||
/// <returns>雨衰减系数α</returns>
|
||||
protected override double CalculateRainAlphaCoefficient(double wavelength)
|
||||
{
|
||||
if (wavelength >= 8 && wavelength <= 12)
|
||||
@ -68,70 +169,22 @@ namespace AirTransmission
|
||||
}
|
||||
else if (wavelength >= 3 && wavelength <= 5)
|
||||
{
|
||||
// 对于中远红外波段(3-5μm)
|
||||
// 对于中红外波段(3-5μm)
|
||||
return 0.7978;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雪对红外线的衰减系数K
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(微米)</param>
|
||||
/// <returns>雪衰减系数K</returns>
|
||||
protected override double CalculateSnowKCoefficient(double wavelength)
|
||||
{
|
||||
return 0.365;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雪对红外线的衰减系数α
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(微米)</param>
|
||||
/// <returns>雪衰减系数α</returns>
|
||||
protected override double CalculateSnowAlphaCoefficient(double wavelength)
|
||||
{
|
||||
return 0.88;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算红外线的总衰减因子
|
||||
/// </summary>
|
||||
/// <returns>红外线总衰减因子</returns>
|
||||
private double CalculateIRAttenuationFactor()
|
||||
{
|
||||
double molecularFactor = CalculateIRMolecularFactor();
|
||||
double aerosolFactor = CalculateIRAerosolFactor();
|
||||
return molecularFactor + aerosolFactor;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算红外线的分子散射因子
|
||||
/// </summary>
|
||||
/// <returns>红外线分子散射因子</returns>
|
||||
private double CalculateIRMolecularFactor()
|
||||
{
|
||||
// 对于10μm波长,分子散射可以忽略不计
|
||||
return 0.0001;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算红外线的气溶胶散射因子
|
||||
/// </summary>
|
||||
/// <returns>红外线气溶胶散射因子</returns>
|
||||
private double CalculateIRAerosolFactor()
|
||||
{
|
||||
// 使用更适合IR的模型
|
||||
double beta = 0.0116 * Math.Pow(Visibility, -0.75);
|
||||
return beta;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雾对红外线的衰减
|
||||
/// </summary>
|
||||
/// <param name="pathLength">传输路径长度(米)</param>
|
||||
/// <returns>雾对红外线的衰减</returns>
|
||||
private double CalculateFogAttenuation(double pathLength)
|
||||
{
|
||||
if (!IsFoggy)
|
||||
@ -139,49 +192,7 @@ namespace AirTransmission
|
||||
|
||||
double q = 0.585 * Math.Pow(Visibility, 1.0/3.0);
|
||||
double beta = 3.91 / Visibility * Math.Pow(IR_WAVELENGTH / 0.55, -q);
|
||||
return beta * pathLength * 0.5;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算水蒸气对红外线的衰减
|
||||
/// </summary>
|
||||
/// <param name="distance">传输距离(米)</param>
|
||||
/// <returns>水蒸气对红外线的衰减</returns>
|
||||
private double CalculateWaterVaporAttenuation(double distance)
|
||||
{
|
||||
double waterVaporDensity = CalculateWaterVaporDensity();
|
||||
double absorptionCoefficient = 0.0005; // 这个值需要根据具体波长调整
|
||||
return absorptionCoefficient * waterVaporDensity * distance;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算水蒸气密度
|
||||
/// </summary>
|
||||
/// <returns>水蒸气密度(g/m³)</returns>
|
||||
private double CalculateWaterVaporDensity()
|
||||
{
|
||||
// 使用Magnus公式计算饱和水汽压
|
||||
double a = 17.27;
|
||||
double b = 237.7;
|
||||
double saturationVaporPressure = 6.112 * Math.Exp((a * Temperature) / (b + Temperature));
|
||||
|
||||
// 计算实际水汽压
|
||||
double actualVaporPressure = (Humidity / 100.0) * saturationVaporPressure;
|
||||
|
||||
// 计算水汽密度 (g/m³)
|
||||
return (actualVaporPressure * 2.16679) / (Temperature + 273.15);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算二氧化碳对红外线的衰减
|
||||
/// </summary>
|
||||
/// <param name="distance">传输距离(米)</param>
|
||||
/// <returns>二氧化碳对红外线的衰减</returns>
|
||||
private double CalculateCO2Attenuation(double distance)
|
||||
{
|
||||
double co2Concentration = CO2Concentration; // ppm
|
||||
double absorptionCoefficient = 0.00001; // 这个值需要根据具体波长调整
|
||||
return absorptionCoefficient * (co2Concentration / 1000000) * distance;
|
||||
return beta * pathLength * 1.0; // 从1.2改为1.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* 版本历史:
|
||||
* 1.0.0 (2024-10-13): 初始版本,实现激光在大气中的传输特性计算,包括湍流效应。作者:田建勇
|
||||
* 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇
|
||||
*/
|
||||
|
||||
namespace AirTransmission
|
||||
@ -110,7 +111,8 @@ namespace AirTransmission
|
||||
double aerosolFactor = CalculateAerosolFactor();
|
||||
double visibilityFactor = CalculateVisibilityFactor();
|
||||
|
||||
return molecularFactor * aerosolFactor * visibilityFactor;
|
||||
// 增加基础衰减
|
||||
return molecularFactor * aerosolFactor * visibilityFactor * 1.2; // 增加1.2倍的基础衰减
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -119,7 +121,8 @@ namespace AirTransmission
|
||||
/// <returns>分子散射因子</returns>
|
||||
private double CalculateMolecularFactor()
|
||||
{
|
||||
return (Pressure / 1013.25) * (288.15 / Temperature);
|
||||
// 增加分子散射的影响
|
||||
return (Pressure / 1013.25) * (288.15 / Temperature) * 1.15; // 增加15%的分子散射
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -138,7 +141,8 @@ namespace AirTransmission
|
||||
else
|
||||
q = 0.585 * Math.Pow(1, 1.0/3.0);
|
||||
|
||||
double aerosolFactor = 3.91 / Visibility * Math.Pow(LASER_WAVELENGTH / 0.55, -q);
|
||||
// 增加气溶胶散射的影响
|
||||
double aerosolFactor = 3.91 / Visibility * Math.Pow(LASER_WAVELENGTH / 0.55, -q) * 1.1; // 增加10%的气溶胶散射
|
||||
|
||||
if (Visibility < 5)
|
||||
{
|
||||
@ -163,9 +167,10 @@ namespace AirTransmission
|
||||
if (!IsFoggy)
|
||||
return 0;
|
||||
|
||||
// 增加雾的衰减效应
|
||||
double q = 0.585 * Math.Pow(Visibility, 1.0/3.0);
|
||||
double beta = 3.91 / Visibility * Math.Pow(LASER_WAVELENGTH / 0.55, -q);
|
||||
return beta * pathLength * 0.5;
|
||||
return beta * pathLength * 1.2; // 从0.5改为1.2,增加雾的影响
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* 版本历史:
|
||||
* 1.0.0 (2024-10-13): 初始版本,实现毫米波在大气中的传输特性计算,包括氧气和水蒸气的影响。作者:田建勇
|
||||
* 1.0.0 (2024-10-13): 初始版本,实现毫米波在大气中的传输特性计算。作者:田建勇
|
||||
* 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇
|
||||
*/
|
||||
|
||||
namespace AirTransmission
|
||||
@ -8,13 +9,15 @@ namespace AirTransmission
|
||||
/// <summary>
|
||||
/// 毫米波传输模型类,用于计算毫米波在大气中的传输特性
|
||||
/// </summary>
|
||||
public class MillimeterWaveTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather)
|
||||
public class MillimeterWaveTransmittanceModel : TransmittanceModel
|
||||
{
|
||||
/// <summary>
|
||||
/// 毫米波波长(毫米)
|
||||
/// </summary>
|
||||
private const double MILLIMETER_WAVE_WAVELENGTH = 3.19; // 毫米(对应94 GHz)
|
||||
|
||||
public MillimeterWaveTransmittanceModel(WeatherCondition weather) : base(weather) { }
|
||||
|
||||
/// <summary>
|
||||
/// 计算给定距离的毫米波透过率
|
||||
/// </summary>
|
||||
@ -22,101 +25,120 @@ namespace AirTransmission
|
||||
/// <returns>毫米波透过率(0到1之间的值)</returns>
|
||||
public override double CalculateTransmittance(double distance)
|
||||
{
|
||||
double attenuationFactor = CalculateMillimeterWaveAttenuationFactor();
|
||||
double rainAttenuation = CalculateRainAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH);
|
||||
double fogAttenuation = CalculateMillimeterWaveFogAttenuation(distance);
|
||||
double snowAttenuation = CalculateSnowAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH);
|
||||
double transmittance = Math.Exp(-attenuationFactor * distance - rainAttenuation - fogAttenuation - snowAttenuation);
|
||||
|
||||
return transmittance;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雨对毫米波的衰减系数K
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(毫米)</param>
|
||||
/// <returns>雨衰减系数K</returns>
|
||||
protected override double CalculateRainKCoefficient(double wavelength)
|
||||
{
|
||||
// 对应94 GHz毫米波
|
||||
return 0.926;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雨对毫米波的衰减系数α
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(毫米)</param>
|
||||
/// <returns>雨衰减系数α</returns>
|
||||
protected override double CalculateRainAlphaCoefficient(double wavelength)
|
||||
{
|
||||
// 对应94 GHz毫米波
|
||||
return 0.9551;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雪对毫米波的衰减系数K
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(毫米)</param>
|
||||
/// <returns>雪衰减系数K</returns>
|
||||
protected override double CalculateSnowKCoefficient(double wavelength)
|
||||
{
|
||||
return 0.997;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雪对毫米波的衰减系数α
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(毫米)</param>
|
||||
/// <returns>雪衰减系数α</returns>
|
||||
protected override double CalculateSnowAlphaCoefficient(double wavelength)
|
||||
{
|
||||
return 1.064;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算毫米波的总衰减因子
|
||||
/// </summary>
|
||||
/// <returns>毫米波总衰减因子</returns>
|
||||
private double CalculateMillimeterWaveAttenuationFactor()
|
||||
{
|
||||
double oxygenAttenuation = CalculateOxygenAttenuation();
|
||||
// 计算各种衰减机制
|
||||
double molecularScattering = CalculateMolecularScattering();
|
||||
double aerosolScattering = CalculateAerosolScattering();
|
||||
double waterVaporAttenuation = CalculateWaterVaporAttenuation();
|
||||
return oxygenAttenuation + waterVaporAttenuation;
|
||||
double oxygenAttenuation = CalculateOxygenAttenuation();
|
||||
|
||||
// 计算天气效应
|
||||
double rainAttenuation = CalculateRainAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH);
|
||||
double snowAttenuation = CalculateSnowAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH);
|
||||
double fogAttenuation = CalculateMillimeterWaveFogAttenuation(distance);
|
||||
|
||||
// 计算总衰减
|
||||
double totalAttenuation = (molecularScattering + aerosolScattering + waterVaporAttenuation + oxygenAttenuation) * distance +
|
||||
rainAttenuation + snowAttenuation + fogAttenuation;
|
||||
|
||||
// 计算透过率
|
||||
double transmittance = Math.Exp(-totalAttenuation);
|
||||
|
||||
return Math.Max(0, Math.Min(1, transmittance));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算氧气对毫米波的衰减
|
||||
/// 计算分子散射系数
|
||||
/// </summary>
|
||||
/// <returns>氧气衰减因子</returns>
|
||||
private double CalculateOxygenAttenuation()
|
||||
/// <returns>分子散射系数(km^-1)</returns>
|
||||
private double CalculateMolecularScattering()
|
||||
{
|
||||
double gamma = 0.01 * (MILLIMETER_WAVE_WAVELENGTH / 60.0) * (Temperature / 293.15);
|
||||
return gamma * (Pressure / 1013.25);
|
||||
// 分子散射系数计算(km^-1)
|
||||
return 0.0015 * (Pressure / 1013.25) * (288.15 / Temperature) *
|
||||
Math.Pow(MILLIMETER_WAVE_WAVELENGTH / 3.0, -4);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算水蒸气对毫米波的衰减
|
||||
/// 计算气溶胶散射系数
|
||||
/// </summary>
|
||||
/// <returns>水蒸气衰减因子</returns>
|
||||
/// <returns>气溶胶散射系数(km^-1)</returns>
|
||||
private double CalculateAerosolScattering()
|
||||
{
|
||||
// 气溶胶散射系数计算(km^-1)
|
||||
double beta = 0.0434 * (AerosolDensity / STANDARD_AEROSOL_DENSITY);
|
||||
return beta * Math.Pow(MILLIMETER_WAVE_WAVELENGTH / 3.0, -1.2);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算水汽吸收系数
|
||||
/// </summary>
|
||||
/// <returns>水汽吸收系数(km^-1)</returns>
|
||||
private double CalculateWaterVaporAttenuation()
|
||||
{
|
||||
double rho = Humidity * 0.01 * 6.11 * Math.Exp(17.27 * (Temperature - 273.15) / (Temperature - 35.85));
|
||||
return 0.05 * rho * (MILLIMETER_WAVE_WAVELENGTH / 100.0) * (Temperature / 293.15);
|
||||
// 水汽吸收系数计算(km^-1)
|
||||
double rho = CalculateWaterVaporDensity();
|
||||
double pressureFactor = Math.Sqrt(Pressure / 1013.25);
|
||||
return 0.05 * rho * (MILLIMETER_WAVE_WAVELENGTH / 100.0) * (Temperature / 293.15) * pressureFactor;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算水汽密度
|
||||
/// </summary>
|
||||
/// <returns>水汽密度(g/m³)</returns>
|
||||
private double CalculateWaterVaporDensity()
|
||||
{
|
||||
// 使用Magnus公式计算水汽密度(g/m³)
|
||||
double saturationVaporPressure = 6.112 * Math.Exp(17.27 * (Temperature - 273.15) / (Temperature - 35.85));
|
||||
double actualVaporPressure = (Humidity / 100.0) * saturationVaporPressure;
|
||||
return (actualVaporPressure * 2.16679) / Temperature;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算氧气吸收系数
|
||||
/// </summary>
|
||||
/// <returns>氧气吸收系数(km^-1)</returns>
|
||||
private double CalculateOxygenAttenuation()
|
||||
{
|
||||
// 氧气吸收系数计算(km^-1)
|
||||
double gamma = 0.01 * (MILLIMETER_WAVE_WAVELENGTH / 60.0) * (Temperature / 293.15);
|
||||
return gamma * (Pressure / 1013.25);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雾对毫米波的衰减
|
||||
/// </summary>
|
||||
/// <param name="pathLength">传输路径长度(米)</param>
|
||||
/// <returns>雾对毫米波的衰减</returns>
|
||||
/// <returns>雾衰减</returns>
|
||||
private double CalculateMillimeterWaveFogAttenuation(double pathLength)
|
||||
{
|
||||
if (!IsFoggy)
|
||||
return 0;
|
||||
|
||||
double liquidWaterDensity = 0.05; // 假设的液态水密度,单位:g/m³
|
||||
// 雾的衰减计算
|
||||
double liquidWaterDensity = 0.05 * (1 - Visibility / 10.0); // 根据能见度估算液态水含量
|
||||
double specificAttenuation = 0.4 * MILLIMETER_WAVE_WAVELENGTH * liquidWaterDensity / 1000.0;
|
||||
return specificAttenuation * pathLength;
|
||||
}
|
||||
|
||||
protected override double CalculateRainKCoefficient(double wavelength)
|
||||
{
|
||||
// 对应94 GHz毫米波
|
||||
return 0.926;
|
||||
}
|
||||
|
||||
protected override double CalculateRainAlphaCoefficient(double wavelength)
|
||||
{
|
||||
// 对应94 GHz毫米波
|
||||
return 0.9551;
|
||||
}
|
||||
|
||||
protected override double CalculateSnowKCoefficient(double wavelength)
|
||||
{
|
||||
return 0.997;
|
||||
}
|
||||
|
||||
protected override double CalculateSnowAlphaCoefficient(double wavelength)
|
||||
{
|
||||
return 1.064;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* 版本历史:
|
||||
* 1.0.0 (2024-10-13): 初始版本,实现大气透过率模型的基类,包括各种天气条件下的衰减计算。作者:田建勇
|
||||
* 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇
|
||||
*/
|
||||
|
||||
namespace AirTransmission
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* 版本历史:
|
||||
* 1.0.0 (2024-10-13): 初始版本,实现紫外线在大气中的传输特性计算。作者:田建勇
|
||||
* 1.1.0 (2024-10-18): 改进版本,采用光谱模型法计算紫外线透过率。作者:田建勇
|
||||
*/
|
||||
|
||||
namespace AirTransmission
|
||||
@ -8,126 +9,140 @@ namespace AirTransmission
|
||||
/// <summary>
|
||||
/// 紫外线传输模型类,用于计算紫外线在大气中的传输特性
|
||||
/// </summary>
|
||||
public class UVTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather)
|
||||
public class UVTransmittanceModel : TransmittanceModel
|
||||
{
|
||||
/// <summary>
|
||||
/// 紫外线波长(微米)
|
||||
/// </summary>
|
||||
private const double UV_WAVELENGTH = 0.308; // 微米 (308 nm)
|
||||
// 光谱分段参数
|
||||
private const double MIN_WAVELENGTH = 0.2; // 紫外波段最小波长(微米)
|
||||
private const double MAX_WAVELENGTH = 0.4; // 紫外波段最大波长(微米)
|
||||
private const int SPECTRAL_BANDS = 100; // 光谱分段数
|
||||
private const double UV_WAVELENGTH = 0.308; // 主要计算波长(微米)
|
||||
|
||||
public UVTransmittanceModel(WeatherCondition weather) : base(weather) { }
|
||||
|
||||
/// <summary>
|
||||
/// 计算给定距离的紫外线透过率
|
||||
/// </summary>
|
||||
/// <param name="distance">传输距离(米)</param>
|
||||
/// <returns>紫外线透过率(0到1之间的值)</returns>
|
||||
public override double CalculateTransmittance(double distance)
|
||||
{
|
||||
double attenuationFactor = CalculateUVAttenuationFactor();
|
||||
double rainAttenuation = CalculateRainAttenuation(distance, UV_WAVELENGTH);
|
||||
double fogAttenuation = CalculateFogAttenuation(distance);
|
||||
double dustAttenuation = CalculateDustAttenuation(distance);
|
||||
double snowAttenuation = CalculateSnowAttenuation(distance, UV_WAVELENGTH);
|
||||
// 将距离转换为千米
|
||||
double distanceInKm = distance / 1000.0;
|
||||
|
||||
double transmittance = Math.Pow(STANDARD_TRANSMITTANCE, attenuationFactor * distance) *
|
||||
Math.Exp(-rainAttenuation - fogAttenuation - dustAttenuation - snowAttenuation);
|
||||
// 计算各种衰减机制的总和
|
||||
double totalAttenuation = 0;
|
||||
double wavelengthStep = (MAX_WAVELENGTH - MIN_WAVELENGTH) / SPECTRAL_BANDS;
|
||||
|
||||
return Math.Max(0, Math.Min(1, transmittance));
|
||||
for (int i = 0; i < SPECTRAL_BANDS; i++)
|
||||
{
|
||||
double wavelength = MIN_WAVELENGTH + i * wavelengthStep;
|
||||
double bandAttenuation = CalculateBandAttenuation(wavelength);
|
||||
double spectralWeight = GetSpectralWeight(wavelength);
|
||||
|
||||
totalAttenuation += bandAttenuation * spectralWeight;
|
||||
}
|
||||
|
||||
// 计算基本透过率
|
||||
double baseTransmittance = Math.Exp(-totalAttenuation * distanceInKm);
|
||||
|
||||
// 应用天气条件的影响
|
||||
double weatherEffect = CalculateWeatherEffect(distance);
|
||||
double finalTransmittance = baseTransmittance * weatherEffect;
|
||||
|
||||
return Math.Max(0, Math.Min(1, finalTransmittance));
|
||||
}
|
||||
|
||||
private double CalculateBandAttenuation(double wavelength)
|
||||
{
|
||||
// 计算各种衰减机制
|
||||
double rayleighScattering = CalculateRayleighScattering(wavelength);
|
||||
double mieScattering = CalculateMieScattering(wavelength);
|
||||
double molecularAbsorption = CalculateMolecularAbsorption(wavelength);
|
||||
|
||||
// 返回总衰减系数(km^-1)
|
||||
return rayleighScattering + mieScattering + molecularAbsorption;
|
||||
}
|
||||
|
||||
private double CalculateRayleighScattering(double wavelength)
|
||||
{
|
||||
// Rayleigh散射系数计算(km^-1)
|
||||
double wavelengthMicrons = wavelength;
|
||||
return 0.008735 * Math.Pow(wavelengthMicrons, -4.08) * (Pressure / 1013.25) * (288.15 / Temperature);
|
||||
}
|
||||
|
||||
private double CalculateMieScattering(double wavelength)
|
||||
{
|
||||
// Mie散射系数计算(km^-1)
|
||||
double beta = 3.91 / Visibility;
|
||||
double alpha = 1.2 * Math.Pow(wavelength / 0.55, -1.3);
|
||||
return beta * alpha * (AerosolDensity / STANDARD_AEROSOL_DENSITY);
|
||||
}
|
||||
|
||||
private double CalculateMolecularAbsorption(double wavelength)
|
||||
{
|
||||
// 分子吸收系数计算(km^-1)
|
||||
double o2Absorption = CalculateO2Absorption(wavelength);
|
||||
double o3Absorption = CalculateO3Absorption(wavelength);
|
||||
|
||||
return o2Absorption + o3Absorption;
|
||||
}
|
||||
|
||||
private double CalculateO2Absorption(double wavelength)
|
||||
{
|
||||
// O₂吸收系数(km^-1)
|
||||
if (wavelength < 0.25)
|
||||
return 0.5;
|
||||
return 0.1;
|
||||
}
|
||||
|
||||
private double CalculateO3Absorption(double wavelength)
|
||||
{
|
||||
// O₃吸收系数(km^-1)
|
||||
if (wavelength >= 0.2 && wavelength <= 0.3)
|
||||
return 0.8;
|
||||
return 0.2;
|
||||
}
|
||||
|
||||
private double GetSpectralWeight(double wavelength)
|
||||
{
|
||||
// 调整光谱权重分布
|
||||
if (wavelength >= 0.28 && wavelength <= 0.32)
|
||||
return 1.0;
|
||||
else if (wavelength > 0.32 && wavelength <= 0.38)
|
||||
return 0.6;
|
||||
return 0.3;
|
||||
}
|
||||
|
||||
private double CalculateWeatherEffect(double distance)
|
||||
{
|
||||
// 增加天气效应的影响
|
||||
double rainEffect = CalculateRainAttenuation(distance, UV_WAVELENGTH) * 0.8;
|
||||
double snowEffect = CalculateSnowAttenuation(distance, UV_WAVELENGTH) * 0.8;
|
||||
double fogEffect = CalculateFogAttenuation(distance) * 0.6;
|
||||
double dustEffect = CalculateDustAttenuation(distance) * 0.6;
|
||||
|
||||
return Math.Exp(-rainEffect - snowEffect - fogEffect - dustEffect);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雨对紫外线的衰减系数K
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(微米)</param>
|
||||
/// <returns>雨衰减系数K</returns>
|
||||
protected override double CalculateRainKCoefficient(double wavelength)
|
||||
{
|
||||
// 对于UV波段 (308 nm)
|
||||
return 0.4715;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雨对紫外线的衰减系数α
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(微米)</param>
|
||||
/// <returns>雨衰减系数α</returns>
|
||||
protected override double CalculateRainAlphaCoefficient(double wavelength)
|
||||
{
|
||||
// 对于UV波段 (308 nm)
|
||||
return 0.6296;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雪对紫外线的衰减系数K
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(微米)</param>
|
||||
/// <returns>雪衰减系数K</returns>
|
||||
protected override double CalculateSnowKCoefficient(double wavelength)
|
||||
{
|
||||
// 对于UV波段 (308 nm)
|
||||
return 0.5225;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雪对紫外线的衰减系数α
|
||||
/// </summary>
|
||||
/// <param name="wavelength">波长(微米)</param>
|
||||
/// <returns>雪衰减系数α</returns>
|
||||
protected override double CalculateSnowAlphaCoefficient(double wavelength)
|
||||
{
|
||||
// 对于UV波段 (308 nm)
|
||||
return 0.7937;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算紫外线的总衰减因子
|
||||
/// </summary>
|
||||
/// <returns>紫外线总衰减因子</returns>
|
||||
private double CalculateUVAttenuationFactor()
|
||||
{
|
||||
double molecularFactor = CalculateUVMolecularFactor();
|
||||
double aerosolFactor = CalculateUVAerosolFactor();
|
||||
double visibilityFactor = CalculateVisibilityFactor();
|
||||
|
||||
return molecularFactor * aerosolFactor * visibilityFactor;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算紫外线的分子散射因子
|
||||
/// </summary>
|
||||
/// <returns>紫外线分子散射因子</returns>
|
||||
private double CalculateUVMolecularFactor()
|
||||
{
|
||||
// UV分子散射比可见光更强
|
||||
return (Pressure / 1013.25) * (288.15 / Temperature) * 2.0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算紫外线的气溶胶散射因子
|
||||
/// </summary>
|
||||
/// <returns>紫外线气溶胶散射因子</returns>
|
||||
private double CalculateUVAerosolFactor()
|
||||
{
|
||||
double q = 0.585 * Math.Pow(Visibility, 1.0/3.0);
|
||||
double aerosolFactor = 3.91 / Visibility * Math.Pow(UV_WAVELENGTH / 0.55, -q);
|
||||
|
||||
if (Visibility < 5)
|
||||
{
|
||||
aerosolFactor *= (1 + (5 - Visibility) / 5);
|
||||
}
|
||||
|
||||
if (IsDusty)
|
||||
{
|
||||
aerosolFactor *= 1.5;
|
||||
}
|
||||
|
||||
return Math.Max(1, aerosolFactor);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算雾对紫外线的衰减
|
||||
/// </summary>
|
||||
/// <param name="pathLength">传输路径长度(米)</param>
|
||||
/// <returns>雾对紫外线的衰减</returns>
|
||||
private double CalculateFogAttenuation(double pathLength)
|
||||
{
|
||||
if (!IsFoggy)
|
||||
@ -135,7 +150,7 @@ namespace AirTransmission
|
||||
|
||||
double q = 0.585 * Math.Pow(Visibility, 1.0/3.0);
|
||||
double beta = 3.91 / Visibility * Math.Pow(UV_WAVELENGTH / 0.55, -q);
|
||||
return beta * pathLength * 0.7; // UV在雾中的衰减可能比可见光更强
|
||||
return beta * pathLength * 0.2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user