From ae8f77bdaf88fe753ff103208e9bbc02631e2f36 Mon Sep 17 00:00:00 2001 From: andreas128 Date: Fri, 1 Sep 2017 16:52:50 +0200 Subject: Add Test_data class to access stored iq data --- dpd/src/Test_data.py | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 dpd/src/Test_data.py (limited to 'dpd') diff --git a/dpd/src/Test_data.py b/dpd/src/Test_data.py new file mode 100644 index 0000000..9dd0913 --- /dev/null +++ b/dpd/src/Test_data.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +# +# Modulation Error Rate +# +# http://www.opendigitalradio.org +# Licence: The MIT License, see notice at the end of this file + +import datetime +import os +import logging +import time +try: + logging_path = os.path.dirname(logging.getLoggerClass().root.handlers[0].baseFilename) +except: + logging_path = "/tmp/" + +import src.const +import src.Dab_Util +import numpy as np +import matplotlib +matplotlib.use('agg') +import matplotlib.pyplot as plt + + +class Test_data: + def __init__(self, sample_rate, type): + """ + Standardized access to complex64 test data files. + + :param sample_rate: + :param type: + + Testing: + TD = src.Test_data.Test_data(8192000, 'file') + tx_orig = TD.get_symbol(0,0) + fig = plt.figure(figsize=(9,6)) + ax = fig.add_subplot(2,1,1) + ax.plot(tx_orig) + ax = fig.add_subplot(2,1,2) + plt.plot(np.angle(np.fft.fftshift(np.fft.fft(tx_orig))), 'p') + """ + + self.c = src.const.const(sample_rate) + self.du = src.Dab_Util.Dab_Util(sample_rate) + + self.file_paths = { + (2048000, 'file'): + ("./test_data/odr-dabmod_to_file_2048_NoFir_noDPD.iq", + ( + self.c.T_F + # Pipelineing + self.c.T_NULL + # NULL Symbol + self.c.T_S + # Synchronization Symbol + self.c.T_C # Cyclic Prefix + )), + (8192000, 'file'): + ("./test_data/odr-dabmod_to_file_8192_NoFir_noDPD.iq", + ( + self.c.T_F + # Pipelining + self.c.T_U + # Pipelining Resampler TODO(?) + self.c.T_NULL + # NULL Symbol + self.c.T_S + # Synchronization Symbol + self.c.T_C # Cyclic Prefix + )), + (8192000, 'rec_noFir'): + ("./test_data/odr-dabmod_reconding_8192_NoFir_DPD_2104.iq", + ( 64 )), + (8192000, 'rec_fir'): + ("./test_data/odr-dabmod_reconding_8192_Fir_DPD_2104.iq", + ( 232 )), + } + + config = (sample_rate, type) + if not config in self.file_paths.keys(): + raise RuntimeError("Configuration not found, possible are:\n {}". + format(self.file_paths)) + + self.path, self.file_offset = self.file_paths[(sample_rate, type)] + + def _load_from_file(self, offset, length): + print(offset, length, self.file_offset) + return self.du.fromfile( + self.path, + length=length, + offset=offset + self.file_offset) + + def get_symbol_without_prefix(self, + frame_idx=0, + symbol_idx=0, + off=0): + return self._load_from_file( + frame_idx*self.c.T_F + + symbol_idx*self.c.T_S + + off, + self.c.T_U) + + def get_symbol_with_prefix(self, + frame_idx=0, + symbol_idx=0, + n_symbols=1, + off=0): + offset = ( + frame_idx*self.c.T_F + + symbol_idx*self.c.T_S - + self.c.T_C + + off) + return self._load_from_file( offset, self.c.T_S * n_symbols) + + def get_file_length_in_symbols(self): + symbol_size = float( + 64/8 * # complex 64 + self.c.T_S # Symbol Size + ) + return os.path.getsize(self.path) / symbol_size + + +# The MIT License (MIT) +# +# Copyright (c) 2017 Andreas Steger +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. -- cgit v1.2.3