summaryrefslogtreecommitdiffstats
path: root/dpd/src
diff options
context:
space:
mode:
authorandreas128 <Andreas>2017-09-01 16:52:50 +0200
committerandreas128 <Andreas>2017-09-01 17:05:08 +0200
commitae8f77bdaf88fe753ff103208e9bbc02631e2f36 (patch)
treef11b6ca057da7ebd4b4af2800f6943cb5b13719b /dpd/src
parent9ba3523d206d88e1604abc0fd3d3634c5e46ad95 (diff)
downloaddabmod-ae8f77bdaf88fe753ff103208e9bbc02631e2f36.tar.gz
dabmod-ae8f77bdaf88fe753ff103208e9bbc02631e2f36.tar.bz2
dabmod-ae8f77bdaf88fe753ff103208e9bbc02631e2f36.zip
Add Test_data class to access stored iq data
Diffstat (limited to 'dpd/src')
-rw-r--r--dpd/src/Test_data.py136
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.