From 5750a61cd9cc61a96bff96a87d622bfcb9e3ca0b Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Wed, 16 May 2018 09:45:44 +0200 Subject: DPDCE: get store_received to work again --- dpd/main.py | 5 +- dpd/store_received.py | 136 ++++++++++++-------------------------------------- 2 files changed, 33 insertions(+), 108 deletions(-) (limited to 'dpd') diff --git a/dpd/main.py b/dpd/main.py index 2d9426b..10a56fc 100755 --- a/dpd/main.py +++ b/dpd/main.py @@ -78,10 +78,7 @@ port = cli_args.port port_rc = cli_args.rc_port coef_path = cli_args.coefs digital_gain = cli_args.digital_gain -num_req = cli_args.samps -samplerate = cli_args.samplerate num_iter = cli_args.iterations -target_median = cli_args.target_median rxgain = cli_args.rxgain txgain = cli_args.txgain name = cli_args.name @@ -139,7 +136,7 @@ c = GlobalConfig(cli_args, logging_path) SA = Symbol_align(c) MER = MER(c) MS = Measure_Shoulders(c) -meas = Measure(c, samplerate, port, num_req) +meas = Measure(c, cli_args.samplerate, port, cli_args.samps) extStat = ExtractStatistic(c) adapt = Adapt(c, port_rc, coef_path) diff --git a/dpd/store_received.py b/dpd/store_received.py index 902f607..19b735e 100755 --- a/dpd/store_received.py +++ b/dpd/store_received.py @@ -17,126 +17,54 @@ import sys import socket import struct -import numpy as np -import matplotlib.pyplot as pp -from matplotlib.animation import FuncAnimation import argparse import os import time -import src.dab_util as du +from src.GlobalConfig import GlobalConfig +from src.Measure import Measure SIZEOF_SAMPLE = 8 # complex floats -def main(): - parser = argparse.ArgumentParser(description="Plot the spectrum of ODR-DabMod's DPD feedback") - parser.add_argument('--samps', default='10240', help='Number of samples to request at once', - required=False) - parser.add_argument('--port', default='50055', - help='port to connect to ODR-DabMod DPD (default: 50055)', - required=False) - parser.add_argument('--out_dir', default='/tmp/record', help='Output directory', - required=False) - parser.add_argument('--count', default='1', help='Number of recordings', - required=False) - parser.add_argument('--verbose', type=int, default=0, help='Level of verbosity', - required=False) +parser = argparse.ArgumentParser(description="Plot the spectrum of ODR-DabMod's DPD feedback") +parser.add_argument('--samps', default='10240', type=int, + help='Number of samples to request at once', + required=False) +parser.add_argument('--port', default='50055', type=int, + help='port to connect to ODR-DabMod DPD (default: 50055)', + required=False) +parser.add_argument('--count', default='1', type=int, + help='Number of recordings', + required=False) +parser.add_argument('--verbose', type=int, default=0, + help='Level of verbosity', + required=False) +parser.add_argument('--plot', + help='Enable all plots, to be more selective choose plots in GlobalConfig.py', + action="store_true") +parser.add_argument('--samplerate', default=8192000, type=int, + help='Sample rate', + required=False) - parser.add_argument('--animated', action='store_true', help='Enable real-time animation') +cli_args = parser.parse_args() +cli_args.target_median = 0.05 - cli_args = parser.parse_args() +c = GlobalConfig(cli_args, None) - if not os.path.isdir(cli_args.out_dir): - os.mkdir(cli_args.out_dir) +meas = Measure(c, cli_args.samplerate, cli_args.port, cli_args.samps) - port = int(cli_args.port) - num_samps_to_request = int(cli_args.samps) +for i in range(int(cli_args.count)): + if i>0: + time.sleep(0.1) - for i in range(int(cli_args.count)): - if i>0: - time.sleep(0.1) + txframe_aligned, tx_ts, rxframe_aligned, rx_ts, rx_median = meas.get_samples() - tx_ts, txframe, rx_ts, rxframe = get_samples(port, num_samps_to_request) - - txframe_aligned, rxframe_aligned = du.subsample_align(txframe, rxframe) - - if cli_args.verbose >= 1: - n_up = 32 - lag = du.lag_upsampling(txframe, rxframe, n_up) - lag_aligned = du.lag_upsampling(txframe_aligned, rxframe_aligned, n_up) - print("Lag from %d times oversampled signal:" % n_up) - print("Before alignment: %.2f" % lag) - print("After alignment: %.2f" % lag_aligned) - print("") - - txframe_aligned.tofile("%s/%d_tx_record.iq" % (cli_args.out_dir, i)) - rxframe_aligned.tofile("%s/%d_rx_record.iq" % (cli_args.out_dir, i)) - - -def recv_exact(sock, num_bytes): - bufs = [] - while num_bytes > 0: - b = sock.recv(num_bytes) - if len(b) == 0: - break - num_bytes -= len(b) - bufs.append(b) - return b''.join(bufs) - -def get_samples(port, num_samps_to_request): - """Connect to ODR-DabMod, retrieve TX and RX samples, load - into numpy arrays, and return a tuple - (tx_timestamp, tx_samples, rx_timestamp, rx_samples) - where the timestamps are doubles, and the samples are numpy - arrays of complex floats, both having the same size - """ - - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect(('localhost', port)) - - print("Send version"); - s.sendall(b"\x01") - - print("Send request for {} samples".format(num_samps_to_request)) - s.sendall(struct.pack("=I", num_samps_to_request)) - - print("Wait for TX metadata") - num_samps, tx_second, tx_pps = struct.unpack("=III", recv_exact(s, 12)) - tx_ts = tx_second + tx_pps / 16384000.0 - - if num_samps > 0: - print("Receiving {} TX samples".format(num_samps)) - txframe_bytes = recv_exact(s, num_samps * SIZEOF_SAMPLE) - txframe = np.fromstring(txframe_bytes, dtype=np.complex64) - else: - txframe = np.array([], dtype=np.complex64) - - print("Wait for RX metadata") - rx_second, rx_pps = struct.unpack("=II", recv_exact(s, 8)) - rx_ts = rx_second + rx_pps / 16384000.0 - - if num_samps > 0: - print("Receiving {} RX samples".format(num_samps)) - rxframe_bytes = recv_exact(s, num_samps * SIZEOF_SAMPLE) - rxframe = np.fromstring(rxframe_bytes, dtype=np.complex64) - else: - rxframe = np.array([], dtype=np.complex64) - - print("Disconnecting") - s.close() - - return (tx_ts, txframe, rx_ts, rxframe) - - -sampling_rate = 8192000 -fft_size = 4096 -freqs = np.fft.fftshift(np.fft.fftfreq(fft_size, d=1./sampling_rate)) - -main() + txframe_aligned.tofile("%d_tx_record.iq" % i) + rxframe_aligned.tofile("%d_rx_record.iq" % i) # The MIT License (MIT) # -# Copyright (c) 2017 Matthias P. Braendli +# Copyright (c) 2018 Matthias P. Braendli # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal -- cgit v1.2.3