Test for cor_att_data function

pull/199/head^2
Holger Müller 2020-06-28 16:57:52 +02:00
rodzic c0e1cfb310
commit fbdf325b51
2 zmienionych plików z 70 dodań i 58 usunięć

Wyświetl plik

@ -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

Wyświetl plik

@ -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):