diff options
| author | andreas128 <Andreas> | 2017-09-01 16:52:50 +0200 | 
|---|---|---|
| committer | andreas128 <Andreas> | 2017-09-01 17:05:08 +0200 | 
| commit | ae8f77bdaf88fe753ff103208e9bbc02631e2f36 (patch) | |
| tree | f11b6ca057da7ebd4b4af2800f6943cb5b13719b | |
| parent | 9ba3523d206d88e1604abc0fd3d3634c5e46ad95 (diff) | |
| download | dabmod-ae8f77bdaf88fe753ff103208e9bbc02631e2f36.tar.gz dabmod-ae8f77bdaf88fe753ff103208e9bbc02631e2f36.tar.bz2 dabmod-ae8f77bdaf88fe753ff103208e9bbc02631e2f36.zip  | |
Add Test_data class to access stored iq data
| -rw-r--r-- | dpd/src/Test_data.py | 136 | 
1 files changed, 136 insertions, 0 deletions
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.  | 
