diff options
-rw-r--r-- | dpd/environment.yml | 1 | ||||
-rwxr-xr-x | dpd/main.py | 62 | ||||
-rw-r--r-- | dpd/src/Adapt.py | 8 | ||||
-rw-r--r-- | dpd/src/Const.py | 2 | ||||
-rw-r--r-- | dpd/src/Model_AM.py | 1 | ||||
-rw-r--r-- | dpd/src/Model_PM.py | 1 | ||||
-rw-r--r-- | dpd/src/Model_Poly.py | 6 |
7 files changed, 42 insertions, 39 deletions
diff --git a/dpd/environment.yml b/dpd/environment.yml index 2d7f260..5c19258 100644 --- a/dpd/environment.yml +++ b/dpd/environment.yml @@ -84,7 +84,6 @@ dependencies: - readline=6.2=2 - requests=2.14.2=py27_0 - scandir=1.5=py27_0 -- scikit-learn=0.18.1=np112py27_1 - scipy=0.19.0=np112py27_0 - setuptools=27.2.0=py27_0 - simplegeneric=0.8.1=py27_1 diff --git a/dpd/main.py b/dpd/main.py index 3424572..d71fd2d 100755 --- a/dpd/main.py +++ b/dpd/main.py @@ -123,7 +123,6 @@ MS = Measure_Shoulders(c) meas = Measure.Measure(samplerate, port, num_req) extStat = ExtractStatistic.ExtractStatistic(c) adapt = Adapt.Adapt(port_rc, coef_path) -dpddata = adapt.get_predistorter() if cli_args.lut: model = Model.Lut(c) @@ -181,41 +180,43 @@ i = 0 while i < num_iter: try: # Measure - if state == "measure": + if state == 'measure': + # Get Samples and check gain txframe_aligned, tx_ts, rxframe_aligned, rx_ts, rx_median = meas.get_samples() - rxframe_aligned.tofile("/tmp/rxframe_aligned.np") - txframe_aligned.tofile("/tmp/txframe_aligned.np") if tx_agc.adapt_if_necessary(txframe_aligned): continue + # Extract usable data from measurement tx, rx, phase_diff, n_per_bin = extStat.extract(txframe_aligned, rxframe_aligned) if extStat.n_meas >= c.n_meas: - state = "model" + state = 'model' else: - state = "measure" + state = 'measure' # Model - elif state == "model": - dpddata = model.train(tx, rx, phase_diff) + elif state == 'model': + # Calculate new model parameters and delete old measurements + model.train(tx, rx, phase_diff) dpddata = model.get_dpd_data() extStat = ExtractStatistic.ExtractStatistic(c) - state = "adapt" + state = 'adapt' # Adapt - elif state == "adapt": + elif state == 'adapt': adapt.set_predistorter(dpddata) - state = "report" + state = 'report' # Report - elif state == "report": + elif state == 'report': try: - i += 1 - path = adapt.dump() + # Store all settings for pre-distortion, tx and rx + adapt.dump() + # Collect logging data off = SA.calc_offset(txframe_aligned) - tx_mer = MER.calc_mer(txframe_aligned[off:off+c.T_U], debug_name="TX") - rx_mer = MER.calc_mer(rxframe_aligned[off:off+c.T_U], debug_name="RX") + tx_mer = MER.calc_mer(txframe_aligned[off:off+c.T_U], debug_name='TX') + rx_mer = MER.calc_mer(rxframe_aligned[off:off+c.T_U], debug_name='RX') mse = np.mean(np.abs((txframe_aligned - rxframe_aligned)**2)) tx_gain = adapt.get_txgain() rx_gain = adapt.get_rxgain() @@ -224,36 +225,35 @@ while i < num_iter: rx_shoulder_tuple = MS.average_shoulders(rxframe_aligned) if c.MS_enable else None tx_shoulder_tuple = MS.average_shoulders(txframe_aligned) if c.MS_enable else None + # Generic logging logging.info(list((name, eval(name)) for name in ['i', 'tx_mer', 'tx_shoulder_tuple', 'rx_mer', 'rx_shoulder_tuple', 'mse', 'tx_gain', 'digital_gain', 'rx_gain', 'rx_median', 'tx_median'])) - if dpddata[0] == "poly": + + # Model specific logging + if dpddata[0] == 'poly': coefs_am = dpddata[1] coefs_pm = dpddata[2] - logging.info("It {}: coefs_am {}". + logging.info('It {}: coefs_am {}'. format(i, coefs_am)) - logging.info("It {}: coefs_pm {}". + logging.info('It {}: coefs_pm {}'. format(i, coefs_pm)) - if dpddata[0] == "lut": + elif dpddata[0] == 'lut': scalefactor = dpddata[1] lut = dpddata[2] - logging.info("It {}: LUT scalefactor {}, LUT {}". + logging.info('It {}: LUT scalefactor {}, LUT {}'. format(i, scalefactor, lut)) - if tx_gain < 89: - adapt.set_txgain(tx_gain) - else: - break - state = "measure" except: - logging.warning("Iteration {}: Report failed.".format(i)) - logging.warning(traceback.format_exc()) - state = "measure" + logging.error('Iteration {}: Report failed.'.format(i)) + logging.error(traceback.format_exc()) + i += 1 + state = 'measure' except Exception as e: - logging.warning("Iteration {} failed.".format(i)) - logging.warning(traceback.format_exc()) + logging.error('Iteration {} failed.'.format(i)) + logging.error(traceback.format_exc()) # The MIT License (MIT) # diff --git a/dpd/src/Adapt.py b/dpd/src/Adapt.py index 84b65f6..b17f059 100644 --- a/dpd/src/Adapt.py +++ b/dpd/src/Adapt.py @@ -137,7 +137,8 @@ class Adapt: def get_predistorter(self): """Load the coefficients from the file in the format given in the README, - return ("poly", [AM coef], [PM coef]) or ("lut", scalefactor, [LUT entries])""" + return ("poly", [AM coef], [PM coef]) or ("lut", scalefactor, [LUT entries]) + """ f = open(self.coef_path, 'r') lines = f.readlines() predistorter_format = int(lines[0]) @@ -155,7 +156,7 @@ class Adapt: else: raise ValueError( "Incorrect coef file format: too many coefficients in {}, should be {}, coefs are {}" - .format(path, n_coefs, coefs)) + .format(self.coef_path, n_coefs, coefs)) i += 1 f.close() return ("poly", coefs_am_out, coefs_pm_out) @@ -206,8 +207,7 @@ class Adapt: self.send_receive("set memlesspoly coeffile {}".format(self.coef_path)) def dump(self, path=None): - if path is None: - dt = datetime.datetime.now().isoformat() + dt = datetime.datetime.now().isoformat() path = logging_path + "/" + dt + "_adapt.pkl" d = { "txgain":self.get_txgain(), diff --git a/dpd/src/Const.py b/dpd/src/Const.py index 2504c1e..2f9e151 100644 --- a/dpd/src/Const.py +++ b/dpd/src/Const.py @@ -10,6 +10,8 @@ class Const: self.sample_rate = sample_rate self.n_meas = n_meas + self.tx_gain_max = 89 + # Time domain self.T_F = sample_rate / 2048000 * 196608 # Transmission frame duration self.T_NULL = sample_rate / 2048000 * 2656 # Null symbol duration diff --git a/dpd/src/Model_AM.py b/dpd/src/Model_AM.py index 2704255..4b88e08 100644 --- a/dpd/src/Model_AM.py +++ b/dpd/src/Model_AM.py @@ -13,7 +13,6 @@ logging_path = os.path.dirname(logging.getLoggerClass().root.handlers[0].baseFil import numpy as np import matplotlib.pyplot as plt -from sklearn import linear_model def check_input_get_next_coefs(tx_dpd, rx_received): diff --git a/dpd/src/Model_PM.py b/dpd/src/Model_PM.py index eab5ec5..75fb055 100644 --- a/dpd/src/Model_PM.py +++ b/dpd/src/Model_PM.py @@ -13,7 +13,6 @@ logging_path = os.path.dirname(logging.getLoggerClass().root.handlers[0].baseFil import numpy as np import matplotlib.pyplot as plt -from sklearn import linear_model def check_input_get_next_coefs(tx_dpd, phase_diff): diff --git a/dpd/src/Model_Poly.py b/dpd/src/Model_Poly.py index 6a74bea..78bab91 100644 --- a/dpd/src/Model_Poly.py +++ b/dpd/src/Model_Poly.py @@ -62,7 +62,11 @@ class Poly: return self.coefs_am, self.coefs_pm def train(self, tx_abs, rx_abs, phase_diff): - # type: (np.ndarray, np.ndarray, np.ndarray) -> (str, np.ndarray, np.ndarray) + """ + :type tx_abs: np.ndarray + :type rx_abs: np.ndarray + :type phase_diff: np.ndarray + """ _check_input_get_next_coefs(tx_abs, rx_abs, phase_diff) coefs_am_new = self.model_am.get_next_coefs(tx_abs, rx_abs, self.coefs_am) |