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; }
private static Complex Gamma(FrequencyCalculations freq, BoreSectionCalculations boreSection) { double temp = freq.gammaT2 / boreSection.AverageRadius; return new Complex(temp, freq.gammaT1 + temp); }
private static Complex TerminatingImpedance(FrequencyCalculations freq, BoreSectionCalculations lastSection) { return new Complex(freq.terminatingImpedanceT1.Real, freq.terminatingImpedanceT1.Imaginary / (double)lastSection.ClosingRadius); }
private static Complex CharacteristicImpedance(FrequencyCalculations freq, BoreSectionCalculations boreSection) { double temp = freq.characteristicImpedanceT1 / boreSection.SphericalAreaTimesAverageRadius; return new Complex((airDensity * speedSound) / boreSection.SphericalArea + temp, -1 * temp); }