kopia lustrzana https://github.com/NanoVNA-Saver/nanovna-saver
Test for cor_att_data function
rodzic
c0e1cfb310
commit
fbdf325b51
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue