예제 #1
0
        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))));
        }
예제 #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;
         }
     });
 }