def noise_parameters(self, partial=False): db = DataBlock() db.S = SArray(self.N) if isinstance(self.N, ABCDArray): CA = self.C / (2 * k * 290) CA11 = CA[..., 0, 0] CA12 = CA[..., 0, 1] CA22 = CA[..., 1, 1] Rn = CA11.real Yopt = (np.sqrt(CA22 / CA11 - (CA12.imag / CA11) ** 2) + 1j * (CA12.imag / CA11)) Fmin = 1 + (CA12 + CA11 * Yopt.conj()).real if partial: db.CA = CA db.Rn = Rn db.Yopt = Yopt db.Fmin = Fmin db.Gopt = (1 / 50. - Yopt) / (1 / 50. + Yopt) return db N = self.convert(YArray) Y11 = N.N[..., 0, 0] Y21 = N.N[..., 1, 0] C = N.C / (4 * k * 290) CY11 = C[..., 0, 0] CY12 = C[..., 0, 1] CY22 = C[..., 1, 1] Rn = (CY22 / abs(Y21) ** 2).real Ycor = Y11 - CY12 / CY22 * Y21 Gn = (CY11 - abs(Y11 - Ycor) ** 2 * Rn).real Yopt = np.sqrt(Gn / Rn + Ycor.real ** 2) - 1j * Ycor.imag Fmin = 1 + 2 * Rn * (Ycor.real + Yopt.real) db.CY = C db.Gn = Gn db.Ycor = Ycor db.S = SArray(self.N) db.Rn = Rn db.Fmin = Fmin db.Gopt = (1 / 50. - Yopt) / (1 / 50. + Yopt) db.Yopt = Yopt return db