summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dpd/src/Adapt.py82
1 files changed, 44 insertions, 38 deletions
diff --git a/dpd/src/Adapt.py b/dpd/src/Adapt.py
index 1d3c84a..cf8b6f5 100644
--- a/dpd/src/Adapt.py
+++ b/dpd/src/Adapt.py
@@ -18,9 +18,32 @@ import pickle
logging_path = os.path.dirname(logging.getLoggerClass().root.handlers[0].baseFilename)
-LUT_LEN=32
-FORMAT_POLY=1
-FORMAT_LUT=2
+LUT_LEN = 32
+FORMAT_POLY = 1
+FORMAT_LUT = 2
+
+
+def _write_poly_coef_file(coefs_am, coefs_pm, path):
+ assert (len(coefs_am) == len(coefs_pm))
+
+ f = open(path, 'w')
+ f.write("{}\n{}\n".format(FORMAT_POLY, len(coefs_am)))
+ for coef in coefs_am:
+ f.write("{}\n".format(coef))
+ for coef in coefs_pm:
+ f.write("{}\n".format(coef))
+ f.close()
+
+
+def _write_lut_file(scalefactor, lut, path):
+ assert (len(lut) == LUT_LEN)
+
+ f = open(path, 'w')
+ f.write("{}\n{}\n".format(FORMAT_LUT, scalefactor))
+ for coef in lut:
+ f.write("{}\n{}\n".format(coef.real, coef.imag))
+ f.close()
+
class Adapt:
"""Uses the ZMQ remote control to change parameters of the DabMod
@@ -51,8 +74,8 @@ class Adapt:
if data != ['ok']:
raise RuntimeError(
- "Could not ping server at %s %d: %s" %
- (self.host, self.port, data))
+ "Could not ping server at %s %d: %s" %
+ (self.host, self.port, data))
return sock
@@ -151,15 +174,16 @@ class Adapt:
for c in coefs:
if i < n_coefs:
coefs_am_out.append(c)
- elif i < 2*n_coefs:
+ elif i < 2 * n_coefs:
coefs_pm_out.append(c)
else:
raise ValueError(
- "Incorrect coef file format: too many coefficients in {}, should be {}, coefs are {}"
+ 'Incorrect coef file format: too many'
+ ' coefficients in {}, should be {}, coefs are {}'
.format(self.coef_path, n_coefs, coefs))
i += 1
f.close()
- return ("poly", coefs_am_out, coefs_pm_out)
+ return 'poly', coefs_am_out, coefs_pm_out
elif predistorter_format == FORMAT_LUT:
scalefactor = int(lines[1])
coefs = np.array([float(l) for l in lines[2:]], dtype=np.float32)
@@ -167,60 +191,43 @@ class Adapt:
lut = coefs[..., 0] + 1j * coefs[..., 1]
if len(lut) != LUT_LEN:
raise ValueError("Incorrect number of LUT entries ({} expected {})".format(len(lut), LUT_LEN))
- return ("lut", scalefactor, lut)
+ return 'lut', scalefactor, lut
else:
raise ValueError("Unknown predistorter format {}".format(predistorter_format))
- def _write_poly_coef_file(self, coefs_am, coefs_pm, path):
- assert(len(coefs_am) == len(coefs_pm))
-
- f = open(path, 'w')
- f.write("{}\n{}\n".format(FORMAT_POLY, len(coefs_am)))
- for coef in coefs_am:
- f.write("{}\n".format(coef))
- for coef in coefs_pm:
- f.write("{}\n".format(coef))
- f.close()
-
- def _write_lut_file(self, scalefactor, lut, path):
- assert(len(lut) == LUT_LEN)
-
- f = open(path, 'w')
- f.write("{}\n{}\n".format(FORMAT_LUT, scalefactor))
- for coef in lut:
- f.write("{}\n{}\n".format(coef.real, coef.imag))
- f.close()
-
def set_predistorter(self, dpddata):
"""Update the predistorter data in the modulator. Takes the same
tuple format as argument than the one returned get_predistorter()"""
if dpddata[0] == "poly":
coefs_am = dpddata[1]
coefs_pm = dpddata[2]
- self._write_poly_coef_file(coefs_am, coefs_pm, self.coef_path)
+ _write_poly_coef_file(coefs_am, coefs_pm, self.coef_path)
elif dpddata[0] == "lut":
scalefactor = dpddata[1]
lut = dpddata[2]
- self._write_lut_file(scalefactor, lut, self.coef_path)
+ _write_lut_file(scalefactor, lut, self.coef_path)
else:
raise ValueError("Unknown predistorter '{}'".format(dpddata[0]))
self.send_receive("set memlesspoly coeffile {}".format(self.coef_path))
def dump(self, path=None):
+ """Backup current settings to a file"""
dt = datetime.datetime.now().isoformat()
- path = logging_path + "/" + dt + "_adapt.pkl"
+ if path is None:
+ path = logging_path + "/" + dt + "_adapt.pkl"
d = {
- "txgain":self.get_txgain(),
- "rxgain":self.get_rxgain(),
- "digital_gain":self.get_digital_gain(),
- "predistorter":self.get_predistorter()
+ "txgain": self.get_txgain(),
+ "rxgain": self.get_rxgain(),
+ "digital_gain": self.get_digital_gain(),
+ "predistorter": self.get_predistorter
}
with open(path, "w") as f:
- pickle.dump(d,f)
+ pickle.dump(d, f)
return path
def load(self, path):
+ """Restore settings from a file"""
with open(path, "r") as f:
d = pickle.load(f)
@@ -229,7 +236,6 @@ class Adapt:
self.set_rxgain(d["rxgain"])
self.set_predistorter(d["predistorter"])
-
# The MIT License (MIT)
#
# Copyright (c) 2017 Andreas Steger, Matthias P. Braendli