diff options
-rw-r--r-- | AUTHORS | 3 | ||||
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | TODO | 9 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | doc/example.ini | 15 | ||||
-rw-r--r-- | src/ConfigParser.h | 2 | ||||
-rw-r--r-- | src/DabMod.cpp | 11 | ||||
-rw-r--r-- | src/FormatConverter.cpp | 27 | ||||
-rw-r--r-- | src/FormatConverter.h | 8 | ||||
-rw-r--r-- | src/TimeInterleaver.cpp | 3 | ||||
-rw-r--r-- | src/TimeInterleaver.h | 2 |
11 files changed, 69 insertions, 26 deletions
@@ -19,3 +19,6 @@ Matthias P. Braendli <matthias [at] mpb [dot] li> Jörgen Scott - ZeroMQ remote control - Static delay offset + +Sergiy + - Improvements for TII insertion @@ -1,6 +1,19 @@ This file contains information about the changes done to ODR-DabMod in this repository +2017-06-05: Matthias P. Braendli <matthias@mpb.li> + (v1.0.1): + Move GainControl into a separate thread to make better use + of multiprocessor systems. + Give explicit names to GainControl modes (fix, max, var) in + configuration. + Add u8 IQ output format. + Add a normalised complexf IQ output format. + Read UHD async messages in separate thread to lessen influence on the + time-critical transmit thread. + Pre-fill UHD IQ buffer before starting to stream data, to ensure it is + properly filled and reduce underruns. + 2017-03-03: Matthias P. Braendli <matthias@mpb.li> (v1.0.0): * odr-dabmod: @@ -5,13 +5,14 @@ to some degree. Unless written, no activity has been started on the topics. -TII implementation incorrect ----------------------------- -The current TII implementation is wrong. There are two TII variants: +TII implementation incomplete +----------------------------- +The current TII implementation supports two TII variants: one according to spec, and the one that was implemented in early modulators that ended up being used a lot even if not compatible with the spec. -ODR-DabMod should support both ideally. +However, when enabled, some receivers are not able to lock on the signal. +Is the power of the TII too strong? Synchronisation wrong? EDI input diff --git a/configure.ac b/configure.ac index acefa90..d39e318 100644 --- a/configure.ac +++ b/configure.ac @@ -19,7 +19,7 @@ # along with ODR-DabMod. If not, see <http://www.gnu.org/licenses/>. AC_PREREQ(2.59) -AC_INIT([ODR-DabMod], [1.0.0], [matthias.braendli@mpb.li]) +AC_INIT([ODR-DabMod], [1.0.1], [matthias.braendli@mpb.li]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) AC_CANONICAL_SYSTEM diff --git a/doc/example.ini b/doc/example.ini index fa03d26..425dfa4 100644 --- a/doc/example.ini +++ b/doc/example.ini @@ -39,10 +39,11 @@ zmqctrlendpoint=tcp://127.0.0.1:9400 [log] ; Write to a logfile or to syslog. -; Setting filename to stderr is very useful during tests and development +; Setting filename to stderr is not necessary, as all messages are +; automatically written to stderr. syslog=0 -filelog=1 -filename=/dev/stderr +filelog=0 +filename=odr-dabmod.log [input] ; A file or fifo input is using transport=file @@ -162,8 +163,9 @@ output=uhd ; gainmode VAR and FIX, they should never exceed 50000. ;format=complexf ; -; When the format is set to complexf_normalised the maximal -; amplitude written to a file, is the digital gain +-10%. +; The complexf_normalised format applies a compensation factor to the complexf +; output to bring the range of the I and Q components to [-1.0 .. 1.0]. The +; digital_gain is still applied on top of that normalisation. ;format=complexf_normalised ; ; When the format is set to s8, the output writes I/Q 8-bit @@ -171,6 +173,9 @@ output=uhd ; effectively mapping the gainmode VAR range of -50000 -- 50000 ; to -128 -- 128. For other gainmodes, use the digital_gain setting ; to make sure you don't create clipping. +; +; The format u8 is the same as s8, except that the values are mapped +; between 0 and 255. ;format=s8 ; The output file: diff --git a/src/ConfigParser.h b/src/ConfigParser.h index fede801..22a4fc5 100644 --- a/src/ConfigParser.h +++ b/src/ConfigParser.h @@ -61,7 +61,7 @@ struct mod_settings_t { float gainmodeVariance = 4.0f; // To handle the timestamp offset of the modulator - unsigned tist_delay_stages = 0; + unsigned tist_delay_stages = 1; // because GainControl is pipelined double tist_offset_s = 0.0; bool loop = false; diff --git a/src/DabMod.cpp b/src/DabMod.cpp index adc4cf2..7c342a2 100644 --- a/src/DabMod.cpp +++ b/src/DabMod.cpp @@ -197,8 +197,11 @@ static shared_ptr<ModOutput> prepare_output( s.normalise = 1.0 / normalise_factor_file_var; output = make_shared<OutputFile>(s.outputName); } - else if (s.fileOutputFormat == "s8") { + else if (s.fileOutputFormat == "s8" or + s.fileOutputFormat == "u8") { // We must normalise the samples to the interval [-127.0; 127.0] + // The formatconverter will add 127 for u8 so that it ends up in + // [0; 255] s.normalise = 127.0f / normalise_factor; output = make_shared<OutputFile>(s.outputName); @@ -284,8 +287,10 @@ int launch_modulator(int argc, char* argv[]) modulator_data m; shared_ptr<FormatConverter> format_converter; - if (mod_settings.useFileOutput and mod_settings.fileOutputFormat == "s8") { - format_converter = make_shared<FormatConverter>(); + if (mod_settings.useFileOutput and + (mod_settings.fileOutputFormat == "s8" or + mod_settings.fileOutputFormat == "u8")) { + format_converter = make_shared<FormatConverter>(mod_settings.fileOutputFormat); } auto output = prepare_output(mod_settings); diff --git a/src/FormatConverter.cpp b/src/FormatConverter.cpp index 89b3274..6826972 100644 --- a/src/FormatConverter.cpp +++ b/src/FormatConverter.cpp @@ -2,7 +2,7 @@ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) - Copyright (C) 2014 + Copyright (C) 2017 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org @@ -39,8 +39,10 @@ # include <xmmintrin.h> #endif -FormatConverter::FormatConverter(void) : - ModCodec() { } +FormatConverter::FormatConverter(const std::string& format) : + ModCodec(), + m_offset_by_127(format == "u8") +{ } /* Expect the input samples to be in the range [-255.0, 255.0] */ int FormatConverter::process(Buffer* const dataIn, Buffer* dataOut) @@ -54,6 +56,8 @@ int FormatConverter::process(Buffer* const dataIn, Buffer* dataOut) float* in = reinterpret_cast<float*>(dataIn->getData()); #if 0 +#error "TODO: SSE FormatConvert does not support u8 yet" + // Disabled because subscripting a __m64 doesn't seem to work // on all platforms. @@ -84,11 +88,20 @@ int FormatConverter::process(Buffer* const dataIn, Buffer* dataOut) out[j+3] = b4[0]; } #else - int8_t* out = reinterpret_cast<int8_t*>(dataOut->getData()); - // Slow implementation that uses _ftol() - for (size_t i = 0; i < sizeIn; i++) { - out[i] = in[i]; + if (m_offset_by_127) { + uint8_t* out = reinterpret_cast<uint8_t*>(dataOut->getData()); + + for (size_t i = 0; i < sizeIn; i++) { + out[i] = in[i] + 128; + } + } + else { + int8_t* out = reinterpret_cast<int8_t*>(dataOut->getData()); + + for (size_t i = 0; i < sizeIn; i++) { + out[i] = in[i]; + } } #endif diff --git a/src/FormatConverter.h b/src/FormatConverter.h index 86ce347..ce848b6 100644 --- a/src/FormatConverter.h +++ b/src/FormatConverter.h @@ -2,7 +2,7 @@ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) - Copyright (C) 2014 + Copyright (C) 2017 Matthias P. Braendli, matthias.braendli@mpb.li http://opendigitalradio.org @@ -35,6 +35,7 @@ #include "porting.h" #include "ModPlugin.h" #include <complex> +#include <string> #include <stdint.h> typedef std::complex<float> complexf; @@ -42,10 +43,13 @@ typedef std::complex<float> complexf; class FormatConverter : public ModCodec { public: - FormatConverter(void); + FormatConverter(const std::string& format); int process(Buffer* const dataIn, Buffer* dataOut); const char* name(); + + private: + bool m_offset_by_127 = false; }; diff --git a/src/TimeInterleaver.cpp b/src/TimeInterleaver.cpp index 9565eca..3bf6339 100644 --- a/src/TimeInterleaver.cpp +++ b/src/TimeInterleaver.cpp @@ -26,8 +26,7 @@ #include <stdint.h> -TimeInterleaver::TimeInterleaver(size_t framesize) - throw (std::invalid_argument) : +TimeInterleaver::TimeInterleaver(size_t framesize) : ModCodec(), d_framesize(framesize) { diff --git a/src/TimeInterleaver.h b/src/TimeInterleaver.h index c131d24..bc94559 100644 --- a/src/TimeInterleaver.h +++ b/src/TimeInterleaver.h @@ -43,7 +43,7 @@ protected: std::deque<std::vector<unsigned char> > d_history; public: - TimeInterleaver(size_t framesize) throw (std::invalid_argument); + TimeInterleaver(size_t framesize); virtual ~TimeInterleaver(); int process(Buffer* const dataIn, Buffer* dataOut); |