def deembedleft(e, X): """deembedleft deembeds S-matrix e from S-matrix X from the left e, and S should all be on the four-matrix form: Frequency is first index, measurement sweep is second index and port indices are third and fourth index. """ X, e = make_same_dims(X, e) neworder = tuple([x for x in X.dims if not isinstance(x, _DimMatrix)]) X = X.reorder_dimensions(*neworder) e = e.reorder_dimensions(*neworder) klass, dims = X.__class__, X.dims # X, e = X.view(type=ndarray), X.view(type=ndarray) denom = (e[..., 0, 1] * e[..., 1, 0] - e[..., 0, 0] * e[..., 1, 1] + e[..., 1, 1] * X[..., 0, 0]) maxshape = tuple(max(x) for x in zip(X.shape, e.shape)) res = X.__class__(np.zeros(maxshape, X.dtype), dims=X.dims) e11 = (X[..., 0, 0] - e[..., 0, 0]) e12 = (X[..., 0, 1] * e[..., 1, 0]) e21 = (X[..., 1, 0] * e[..., 0, 1]) e22 = (-X[..., 0, 1] * X[..., 1, 0] * e[..., 1, 1]) res[..., 0, 0] = e11 res[..., 0, 1] = e12 res[..., 1, 0] = e21 res[..., 1, 1] = e22 res = res / denom res[..., 1, 1] = res[..., 1, 1] + X[..., 1, 1] res = klass(res, dims=dims) return res
def deembedleft(e, X): """deembedleft deembeds S-matrix e from S-matrix X from the left e, and S should all be on the four-matrix form: Frequency is first index, measurement sweep is second index and port indices are third and fourth index. """ X, e = make_same_dims(X, e) neworder = tuple([x for x in X.dims if not isinstance(x, _DimMatrix)]) X = X.reorder_dimensions(*neworder) e = e.reorder_dimensions(*neworder) klass, dims = X.__class__, X.dims # X, e = X.view(type=ndarray), X.view(type=ndarray) denom = e[..., 0, 1] * e[..., 1, 0] - e[..., 0, 0] * e[..., 1, 1] + e[..., 1, 1] * X[..., 0, 0] maxshape = tuple(max(x) for x in zip(X.shape, e.shape)) res = X.__class__(np.zeros(maxshape, X.dtype), dims=X.dims) e11 = X[..., 0, 0] - e[..., 0, 0] e12 = X[..., 0, 1] * e[..., 1, 0] e21 = X[..., 1, 0] * e[..., 0, 1] e22 = -X[..., 0, 1] * X[..., 1, 0] * e[..., 1, 1] res[..., 0, 0] = e11 res[..., 0, 1] = e12 res[..., 1, 0] = e21 res[..., 1, 1] = e22 res = res / denom res[..., 1, 1] = res[..., 1, 1] + X[..., 1, 1] res = klass(res, dims=dims) return res
def cascadeS(S1, S2, *rest): """Cascade arrays containing S-parameters. """ S1, S2 = make_same_dims(S1, S2) neworder = tuple([x for x in S1.dims if not isinstance(x, _DimMatrix)]) S1 = S1.reorder_dimensions(*neworder) S2 = S2.reorder_dimensions(*neworder) denom = (1 - S1[..., 1, 1] * S2[..., 0, 0]) s1det = det(S1) s2det = det(S2) maxshape = tuple(max(x) for x in zip(S1.shape, S2.shape)) res = S1.__class__(np.zeros(maxshape, S1.dtype), dims=S1.dims) res[..., 0, 0] = S1[..., 0, 0] - S2[..., 0, 0] * s1det res[..., 0, 1] = S1[..., 0, 1] * S2[..., 0, 1] res[..., 1, 0] = S1[..., 1, 0] * S2[..., 1, 0] res[..., 1, 1] = S2[..., 1, 1] - S1[..., 1, 1] * s2det res = res / denom res = S1.__class__(res, dims=S1.dims) return res
def cascadeS(S1, S2, *rest): """Cascade arrays containing S-parameters. """ S1, S2 = make_same_dims(S1, S2) neworder = tuple([x for x in S1.dims if not isinstance(x, _DimMatrix)]) S1 = S1.reorder_dimensions(*neworder) S2 = S2.reorder_dimensions(*neworder) denom = 1 - S1[..., 1, 1] * S2[..., 0, 0] s1det = det(S1) s2det = det(S2) maxshape = tuple(max(x) for x in zip(S1.shape, S2.shape)) res = S1.__class__(np.zeros(maxshape, S1.dtype), dims=S1.dims) res[..., 0, 0] = S1[..., 0, 0] - S2[..., 0, 0] * s1det res[..., 0, 1] = S1[..., 0, 1] * S2[..., 0, 1] res[..., 1, 0] = S1[..., 1, 0] * S2[..., 1, 0] res[..., 1, 1] = S2[..., 1, 1] - S1[..., 1, 1] * s2det res = res / denom res = S1.__class__(res, dims=S1.dims) return res