/// <summary> /// Cascades (embeds) a series of <see cref="NetworkParametersMatrix"/> between subsequently connected ports to render a single composite /// <see cref="NetworkParametersMatrix"/> defining the relationship between the ports of the first device and the ports of the final device. /// </summary> /// <remarks>Cascading is performed by first converting the input matrices to <see cref="TransferParametersMatrix"/> types, and then using /// matrix multiplication to combine into a single T-parameter matrix. This matrix is then converted back to the original parameter matrix type.</remarks> /// <param name="matrices">A list of matrices to be cascaded.</param> /// <returns>A single composite <see cref="NetworkParameter"/> describing the network from the ports of the first device to the ports of the final device.</returns> public static TMatrix Cascade <TMatrix>(IEnumerable <TMatrix> matrices) where TMatrix : NetworkParametersMatrix { if (matrices == null || !matrices.Any()) { throw new ArgumentException("Argument cannot be null or empty", nameof(matrices)); } using IEnumerator <NetworkParametersMatrix> enumer = matrices.GetEnumerator(); enumer.MoveNext(); NetworkParametersMatrix p1 = enumer.Current; while (enumer.MoveNext()) { NetworkParametersMatrix p2 = enumer.Current; TransferParametersMatrix t1 = p1.ToTParameters(); TransferParametersMatrix t2 = p2.ToTParameters(); TransferParametersMatrix composite = t1 * t2; p1 = composite; } return(p1.ConvertParameterType <TMatrix>()); }
/// <summary> /// Cascades (embeds) a series <see cref="NetworkParametersMatrix"/> objects for all common frequencies between subsequently connected ports to render a single composite /// <see cref="NetworkParametersCollection{TMatrix}"/> defining the relationship between the ports of the first device and the ports of the final device across frequency. /// </summary> /// <param name="collections">The array of <see cref="NetworkParametersCollection{TMatrix}"/> objects to cascade.</param> /// <returns>A new composite <see cref="NetworkParametersCollection{TMatrix}"/> describing the network from the ports of the first device to the ports of the final device across frequency.</returns> public static NetworkParametersCollection <T> Cascade <T>(params INetworkParametersCollection[] collections) where T : NetworkParametersMatrix { var allFrequencies = collections.SelectMany(c => c.Frequencies).Distinct(); NetworkParametersCollection <T> collection = new NetworkParametersCollection <T>(collections[0].NumberOfPorts); foreach (var frequency in allFrequencies) { collection[frequency] = (T)NetworkParametersMatrix.Cascade(collections.Select(c => c[frequency]).ToList()); } return(collection); }
/// <summary> /// Adds support for the ValueTuple deconstruction syntax for this object. /// </summary> public void Deconstruct(out double frequency, out NetworkParametersMatrix parameters) { frequency = Frequency_Hz; parameters = Parameters; }
/// <summary>Creates a new <see cref="FrequencyParametersPair"/> associated a network parameters matrix and the measurement/derived frequency.</summary> /// <param name="frequency">The frequency in Hz.</param> /// <param name="parameters">The network parameters matrix.</param> public FrequencyParametersPair(double frequency, NetworkParametersMatrix parameters) { Frequency_Hz = frequency; Parameters = parameters; }