summaryrefslogtreecommitdiffstats
path: root/dpd/src/Model.py
diff options
context:
space:
mode:
Diffstat (limited to 'dpd/src/Model.py')
-rw-r--r--dpd/src/Model.py65
1 files changed, 44 insertions, 21 deletions
diff --git a/dpd/src/Model.py b/dpd/src/Model.py
index 64c8857..e0f9c62 100644
--- a/dpd/src/Model.py
+++ b/dpd/src/Model.py
@@ -26,9 +26,32 @@ class Model:
self.coefs_pm_history = [coefs_pm, ]
self.errs_phase = [0, ]
+ def sample_uniformly(self, txframe_aligned, rxframe_aligned, n_bins=4):
+ """This function returns tx and rx samples in a way
+ that the tx amplitudes have an approximate uniform
+ distribution with respect to the txframe_aligned amplitudes"""
+ txframe_aligned_abs = np.abs(txframe_aligned)
+ ccdf_min = 0
+ ccdf_max = np.max(txframe_aligned_abs)
+ tx_hist, ccdf_edges = np.histogram(txframe_aligned_abs,
+ bins=n_bins,
+ range=(ccdf_min, ccdf_max))
+ tx_choice = np.zeros(tx_hist[-1] * n_bins, dtype=np.complex64)
+ rx_choice = np.zeros(tx_hist[-1] * n_bins, dtype=np.complex64)
+ n_choise = tx_hist[-1]
+ for idx, bin in enumerate(tx_hist[:-1]):
+ indices = np.where((txframe_aligned >= ccdf_edges[idx]) &
+ (txframe_aligned <= ccdf_edges[idx+1]))[0]
+ indices_choise = np.random.choice(indices, n_choise, replace=False)
+ rx_choice[idx*n_choise:(idx+1)*n_choise] = rxframe_aligned[indices_choise]
+ tx_choice[idx*n_choise:(idx+1)*n_choise] = txframe_aligned[indices_choise]
+ return tx_choice, rx_choice
+
def get_next_coefs(self, txframe_aligned, rxframe_aligned):
+ tx_choice, rx_choice = self.sample_uniformly(txframe_aligned, rxframe_aligned)
+
# Calculate new coefficients for AM/AM correction
- rx_abs = np.abs(rxframe_aligned)
+ rx_abs = np.abs(rx_choice)
rx_A = np.vstack([rx_abs,
rx_abs ** 3,
rx_abs ** 5,
@@ -37,9 +60,9 @@ class Model:
]).T
rx_dpd = np.sum(rx_A * self.coefs_am, axis=1)
rx_dpd = rx_dpd * (
- np.median(np.abs(txframe_aligned)) / np.median(np.abs(rx_dpd)))
+ np.median(np.abs(tx_choice)) / np.median(np.abs(rx_dpd)))
- err = rx_dpd - np.abs(txframe_aligned)
+ err = rx_dpd - np.abs(tx_choice)
self.errs.append(np.mean(np.abs(err ** 2)))
a_delta = np.linalg.lstsq(rx_A, err)[0]
@@ -50,13 +73,13 @@ class Model:
# Calculate new coefficients for AM/PM correction
phase_diff_rad = ((
- (np.angle(txframe_aligned) -
- np.angle(rxframe_aligned) +
+ (np.angle(tx_choice) -
+ np.angle(rx_choice) +
np.pi) % (2 * np.pi)) -
np.pi
)
- tx_abs = np.abs(txframe_aligned)
+ tx_abs = np.abs(tx_choice)
tx_abs_A = np.vstack([tx_abs,
tx_abs ** 2,
tx_abs ** 3,
@@ -86,7 +109,7 @@ class Model:
tx_range = np.linspace(0, 2)
phase_range_dpd = dpd_phase(tx_range)
- tx_abs = np.abs(rxframe_aligned)
+ tx_abs = np.abs(rx_choice)
tx_A = np.vstack([tx_abs,
tx_abs ** 3,
tx_abs ** 5,
@@ -96,19 +119,19 @@ class Model:
tx_dpd = np.sum(tx_A * new_coefs, axis=1)
tx_dpd_norm = tx_dpd * (
- np.median(np.abs(txframe_aligned)) / np.median(np.abs(tx_dpd)))
+ np.median(np.abs(tx_choice)) / np.median(np.abs(tx_dpd)))
- rx_A_complex = np.vstack([rxframe_aligned,
- rxframe_aligned * rx_abs ** 2,
- rxframe_aligned * rx_abs ** 4,
- rxframe_aligned * rx_abs ** 6,
- rxframe_aligned * rx_abs ** 8,
+ rx_A_complex = np.vstack([rx_choice,
+ rx_choice * rx_abs ** 2,
+ rx_choice * rx_abs ** 4,
+ rx_choice * rx_abs ** 6,
+ rx_choice * rx_abs ** 8,
]).T
rx_post_distored = np.sum(rx_A_complex * self.coefs_am, axis=1)
rx_post_distored = rx_post_distored * (
- np.median(np.abs(txframe_aligned)) /
+ np.median(np.abs(tx_choice)) /
np.median(np.abs(rx_post_distored)))
- mse = np.mean(np.abs((txframe_aligned - rx_post_distored) ** 2))
+ mse = np.mean(np.abs((tx_choice - rx_post_distored) ** 2))
logging.debug("MSE: {}".format(mse))
self.mses.append(mse)
@@ -136,9 +159,9 @@ class Model:
))
logging.debug("rxframe: min %f, max %f, median %f" %
- (np.min(np.abs(rxframe_aligned)),
- np.max(np.abs(rxframe_aligned)),
- np.median(np.abs(rxframe_aligned))
+ (np.min(np.abs(rx_choice)),
+ np.max(np.abs(rx_choice)),
+ np.median(np.abs(rx_choice))
))
dt = datetime.datetime.now().isoformat()
@@ -199,8 +222,8 @@ class Model:
ax = plt.subplot(3,3,4)
ax.scatter(
- np.abs(txframe_aligned[:1024]),
- np.abs(rxframe_aligned[:1024]),
+ np.abs(tx_choice[:1024]),
+ np.abs(rx_choice[:1024]),
s=0.1)
ax.plot(rx_range_dpd / self.coefs_am[0], rx_range, linewidth=0.25)
ax.set_title("Amplifier Characteristic")
@@ -209,7 +232,7 @@ class Model:
ax = plt.subplot(3,3,5)
ax.scatter(
- np.abs(txframe_aligned[:1024]),
+ np.abs(tx_choice[:1024]),
phase_diff_rad[:1024] * 180 / np.pi,
s=0.1
)