예제 #1
0
        public static Complex InputImpedance(IList<BoreSectionCalculations> boreSections, double freq)
        {
            FrequencyCalculations freqCalc = new FrequencyCalculations(freq);

            ComplexMatrix cascadeMatrix = ComplexMatrix.IdentityMatrix();
            foreach (BoreSectionCalculations boreSection in boreSections)
                cascadeMatrix = cascadeMatrix * TransmissionMatrix(freqCalc, boreSection);

            Complex terminatingImpedance = TerminatingImpedance(freqCalc, boreSections[boreSections.Count - 1]);

            Complex inputPressure = terminatingImpedance * cascadeMatrix[0, 0] + cascadeMatrix[0, 1];
            Complex inputFlow = terminatingImpedance * cascadeMatrix[1, 0] + cascadeMatrix[1, 1];

            return ((inputPressure / inputFlow));
        }
예제 #2
0
        public static ComplexMatrix TransmissionMatrix(FrequencyCalculations freq, BoreSectionCalculations boreSection)
        {
            Complex gamma = Gamma(freq, boreSection);
            Complex C, D, characteristicImpedance;

            ComplexMathUtils.CoshSinh(gamma * boreSection.SphericalLength, out C, out D);
            characteristicImpedance = CharacteristicImpedance(freq, boreSection);

            ComplexMatrix transmissionMatrix = new ComplexMatrix();

            if (boreSection.IsCylindrical)
            {
                transmissionMatrix[0, 0] = C;
                transmissionMatrix[0, 1] = characteristicImpedance * D;
                transmissionMatrix[1, 0] = characteristicImpedance.Reciprocal() * D;
                transmissionMatrix[1, 1] = C;
            }
            else
            {
                double outputinput = boreSection.OutputXi / boreSection.InputXi;
                double inputoutput = 1 / outputinput;
                Complex dgammaoutput = D / (gamma * boreSection.OutputXi);

                transmissionMatrix[0, 0] = outputinput * (C - dgammaoutput);
                transmissionMatrix[1, 1] = ((C * inputoutput) + dgammaoutput);
                transmissionMatrix[0, 1] = inputoutput * characteristicImpedance * D;

                Complex gammaXi2Inv = 1 / (gamma * gamma * (boreSection.InputXi * boreSection.InputXi));

                transmissionMatrix[1, 0] = (1 / characteristicImpedance) *
                (
                D *
                        (
                            outputinput - gammaXi2Inv
                        ) +
                        (
                            C * gamma * boreSection.SphericalLength * gammaXi2Inv
                        )
                );

            }

            if (boreSection.OpeningRadius > boreSection.ClosingRadius)
                return transmissionMatrix.Inverse;

            return transmissionMatrix;
        }
예제 #3
0
 private static Complex Gamma(FrequencyCalculations freq, BoreSectionCalculations boreSection)
 {
     double temp = freq.gammaT2 / boreSection.AverageRadius;
     return new Complex(temp, freq.gammaT1 + temp);
 }
예제 #4
0
 private static Complex TerminatingImpedance(FrequencyCalculations freq, BoreSectionCalculations lastSection)
 {
     return new Complex(freq.terminatingImpedanceT1.Real, freq.terminatingImpedanceT1.Imaginary / (double)lastSection.ClosingRadius);
 }
예제 #5
0
 private static Complex CharacteristicImpedance(FrequencyCalculations freq, BoreSectionCalculations boreSection)
 {
     double temp = freq.characteristicImpedanceT1 / boreSection.SphericalAreaTimesAverageRadius;
     return new Complex((airDensity * speedSound) / boreSection.SphericalArea + temp, -1 * temp);
 }