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; } }); }
public EngineSoundLevelAtFrequency GetEngineSoundLevelAtFrequency(double Thrust, FlowParameters FlowParameters) // см. метод с аналогичной сигнатурой в IModel { double[] ExpandedFrequencies, ExpandedFrequenciesBand; FrequenciesAggregator.Expanded(out ExpandedFrequencies, out ExpandedFrequenciesBand); double[] spectralDecomposition = SpectralDecomposition.Get(1.01325E5, FlowParameters, ExpandedFrequencies, ExpandedFrequenciesBand); double L0 = 10 * Math.Log10(0.5 * 0.0022 * Thrust * FlowParameters.NozzleFlowVelocity) + 120 - 11; return((Radius, Angle) => { var L = L0 - 20 * Math.Log10(Radius) + DI.Interpolate(Angle * 180 / Math.PI); var Result = new Dictionary <double, double>(); for (int i = 0; i < ExpandedFrequencies.Length; i++) { Result.Add(ExpandedFrequencies[i], L + spectralDecomposition[i]); } return Result; }); }