From fbdf325b514fa32a52aa364da800b61b86199dac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20M=C3=BCller?= Date: Sun, 28 Jun 2020 16:57:52 +0200 Subject: [PATCH] Test for cor_att_data function --- NanoVNASaver/RFTools.py | 113 ++++++++++++++++++++-------------------- test/test_rftools.py | 15 +++++- 2 files changed, 70 insertions(+), 58 deletions(-) diff --git a/NanoVNASaver/RFTools.py b/NanoVNASaver/RFTools.py index e23e8a5..d84049e 100644 --- a/NanoVNASaver/RFTools.py +++ b/NanoVNASaver/RFTools.py @@ -26,19 +26,49 @@ FMT_SHORT = Format(max_nr_digits=4) FMT_SWEEP = Format(max_nr_digits=9, allow_strip=True) -def corr_att_data(data: List[Datapoint], att: float): - """Correct the ratio for a given attenuation on s21 input""" - if att <= 0: - return data - else: - att = 10**(att/20) - ndata = [] - for dp in data: - freq, re, im = dp - orig = complex(re, im) - corrected = orig * att - ndata.append(Datapoint(freq, corrected.real, corrected.imag)) - return ndata +class Datapoint(NamedTuple): + freq: int + re: float + im: float + + @property + def z(self) -> complex: + """ return the datapoint impedance as complex number """ + return complex(self.re, self.im) + + @property + def phase(self) -> float: + """ return the datapoint's phase value """ + return cmath.phase(self.z) + + @property + def gain(self) -> float: + mag = abs(self.z) + if mag > 0: + return 20 * math.log10(mag) + return -math.inf + + @property + def vswr(self) -> float: + mag = abs(self.z) + if mag == 1: + return 1 + return (1 + mag) / (1 - mag) + + def impedance(self, ref_impedance: float = 50) -> complex: + return gamma_to_impedance(self.z, ref_impedance) + + def qFactor(self, ref_impedance: float = 50) -> float: + imp = self.impedance(ref_impedance) + if imp.real == 0.0: + return -1 + return abs(imp.imag / imp.real) + + def capacitiveEquivalent(self, ref_impedance: float = 50) -> float: + return impedance_to_capacitance(self.impedance(ref_impedance), self.freq) + + def inductiveEquivalent(self, ref_impedance: float = 50) -> float: + return impedance_to_inductance(self.impedance(ref_impedance), self.freq) def gamma_to_impedance(gamma: complex, ref_impedance: float = 50) -> complex: @@ -119,47 +149,16 @@ def serial_to_parallel(z: complex) -> complex: return complex(z_sq_sum / z.real, z_sq_sum / z.imag) -class Datapoint(NamedTuple): - freq: int - re: float - im: float - - @property - def z(self) -> complex: - """ return the datapoint impedance as complex number """ - return complex(self.re, self.im) - - @property - def phase(self) -> float: - """ return the datapoint's phase value """ - return cmath.phase(self.z) - - @property - def gain(self) -> float: - mag = abs(self.z) - if mag > 0: - return 20 * math.log10(mag) - return -math.inf - - @property - def vswr(self) -> float: - mag = abs(self.z) - if mag == 1: - return 1 - return (1 + mag) / (1 - mag) - - def impedance(self, ref_impedance: float = 50) -> complex: - return gamma_to_impedance(self.z, ref_impedance) - - def qFactor(self, ref_impedance: float = 50) -> float: - imp = self.impedance(ref_impedance) - if imp.real == 0.0: - return -1 - return abs(imp.imag / imp.real) - - def capacitiveEquivalent(self, ref_impedance: float = 50) -> float: - return impedance_to_capacitance(self.impedance(ref_impedance), self.freq) - - def inductiveEquivalent(self, ref_impedance: float = 50) -> float: - return impedance_to_inductance(self.impedance(ref_impedance), self.freq) - +def corr_att_data(data: List[Datapoint], att: float): + """Correct the ratio for a given attenuation on s21 input""" + if att <= 0: + return data + else: + att = 10**(att/20) + ndata = [] + for dp in data: + freq, re, im = dp + orig = complex(re, im) + corrected = orig * att + ndata.append(Datapoint(freq, corrected.real, corrected.imag)) + return ndata diff --git a/test/test_rftools.py b/test/test_rftools.py index 7fc243a..22bca08 100644 --- a/test/test_rftools.py +++ b/test/test_rftools.py @@ -24,7 +24,7 @@ from NanoVNASaver.RFTools import Datapoint, \ reflection_coefficient, gamma_to_impedance, clamp_value, \ parallel_to_serial, serial_to_parallel, \ impedance_to_capacitance, impedance_to_inductance, \ - groupDelay + groupDelay, corr_att_data import math @@ -121,6 +121,19 @@ class TestRFTools(unittest.TestCase): self.assertAlmostEqual(groupDelay(dpoints, 1), -9.514e-5) self.assertEqual(groupDelay(dpoints0, 1), 0.0) + def test_cor_att_data(self): + dp1 = [ + Datapoint(100000, 0.1091, 0.3118), + Datapoint(100001, 0.1091, 0.3124), + Datapoint(100002, 0.1091, 0.3130), + ] + dp2 = corr_att_data(dp1, 10) + self.assertEqual(dp2[0].gain - dp1[0].gain, 10) + self.assertEqual(len(dp1), len(dp2)) + # ignore negative attenuation + dp3 = corr_att_data(dp1, -10) + self.assertEqual(dp1, dp3) + class TestRFToolsDatapoint(unittest.TestCase):