コード例 #1
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;
            });
        }
コード例 #2
0
 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;
         }
     });
 }