public static double AbsorptionRatio(double Humidity, AtmosphereParameters atmosphereParameters, double Frequency) // Функция, возвращающая коэффициент звукопоглощения атмосферы { // Humidity -- влажность воздуха на какой-либо высоте, % // atmosphereParameters -- параметры атмосферы на какой-либо высоте // Frequency -- частота Frequency = Frequency < 10E3 ? Frequency : 10E3; // Ограничение по частоте double Temperature = atmosphereParameters.Temperature; double RelativePressure = atmosphereParameters.Pressure / 101325; // Относительное давление double WaterConcentration = Humidity * Math.Pow(10, -6.8346 * Math.Pow(273.16 / Temperature, 1.261) + 4.6151) / RelativePressure; // Концентрация водяных паров double f_rO = RelativePressure * (24 + 4.04E4 * WaterConcentration * (0.02 + WaterConcentration) / (0.391 + WaterConcentration)); // Релаксационная частота кислорода double f_rN = RelativePressure * Math.Sqrt(293.15 / Temperature) * (9 + 280 * WaterConcentration * Math.Exp(-4.71 * (Math.Pow(293.15 / Temperature, 1.0 / 3) - 1))); // Релаксационная частота азота return(8.686 * Math.Pow(Frequency, 2) * (1.84E-11 / RelativePressure * Math.Sqrt(Temperature / 293.15) + Math.Pow(293.15 / Temperature, 5.0 / 2) * (0.01275 * Math.Exp(-2239.1 / Temperature) / (f_rO + Math.Pow(Frequency, 2) / f_rO) + 0.10680 * Math.Exp(-3352.0 / Temperature) / (f_rN + Math.Pow(Frequency, 2) / f_rN)))); }
public StaticSoundLevel GetStaticSoundLevel(double Thrust, FlowParameters flowParameters, FrequencyBand frequencyBand) // см. метод с аналогичной сигнатурой в IModel { double[] Frequencies, FrequencyBands; // массив среднегеометрических частот и ширин частотных полос // определение массивов Frequencies, FrequencyBands по исходному спектру частот frequencyBand if (frequencyBand == FrequencyBand.Infra) { FrequenciesAggregator.Infra(out Frequencies, out FrequencyBands); } else if (frequencyBand == FrequencyBand.Ultra) { FrequenciesAggregator.Ultra(out Frequencies, out FrequencyBands); } else { FrequenciesAggregator.Normal(out Frequencies, out FrequencyBands); } double[] spectralDecomposition = SpectralDecomposition.Get(1.01325E5, flowParameters, Frequencies, FrequencyBands); // Разложение шума на спектр по частотам // Определение функции, возвращающей уровень шума от двиагтеля на расстоянии Radius от сопла под углом Angle к напрвлению оси газовой струи при погодных условиях weatherParameters return((Radius, Angle, weatherParameters) => { double[] atmospherePropagation = new double[Frequencies.Length]; // массив затуханий звука на частотах Frequencies на расстоянии Radius при погодных условиях weatherParameters var atmosphereParameters = new AtmosphereParameters(weatherParameters.Temperature, 1.01325E5); // создание объекта, хранящего атмосферные параметры for (int j = 0; j < Frequencies.Length; j++) { atmospherePropagation[j] = Atmosphere.AbsorptionRatio(weatherParameters.Humidity, atmosphereParameters, Frequencies[j]) * Radius; // заполнение массива atmospherePropagation } double L0 = 10 * Math.Log10(0.5 * 0.0022 * Thrust * flowParameters.NozzleFlowVelocity) + 120 - 11 - 20 * Math.Log10(Radius) + DI.Interpolate(Angle * 180 / Math.PI); // Уровень шума в искомой точке без учёта корреляции по шкале A и затухания звука double L = 0; // Уровень шума в искомой точке с учётом корреляции по шкале A и затухания звука for (int i = 0; i < Frequencies.Length; i++) { double correction = frequencyBand == FrequencyBand.Normal ? Correction.Get(i) : 0; // корреляции по шкале Aв случае расчёта в слышимом диапазоне частот double CurrentL = L0 + spectralDecomposition[i] - atmospherePropagation[i] + correction; // Уровень шума в искомой точке на частоте Frequencies[i] с учётом корреляции по шкале A и затуханием звука if (CurrentL > 0) { L += Math.Pow(10, 0.1 * CurrentL); // логарифмическое суммиррование уровней шума на частотах Frequencies[i] } } if (L > 0) { return 10 * Math.Log10(L); } else { return 0; } }); }