From d2b070369dd5341ac42ec091370d8bcd5a8ac5ee Mon Sep 17 00:00:00 2001 From: Tom Tsou Date: Tue, 26 Apr 2016 19:28:59 -0700 Subject: [PATCH] uhd: Correct timing alignment in 8-PSK and GMSK downlink bursts Delay the EDGE downlink bursts by one symbol in order to match GMSK pulse shaping group delay. The difference in group delay arises from the dual pulse filter combination of the GMSK Laurent represenation whereas 8-PSK uses a single pulse linear filter. Signed-off-by: Tom Tsou --- Transceiver52M/UHDDevice.cpp | 4 ++-- Transceiver52M/sigProcLib.cpp | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Transceiver52M/UHDDevice.cpp b/Transceiver52M/UHDDevice.cpp index 030873c5..f63aa565 100644 --- a/Transceiver52M/UHDDevice.cpp +++ b/Transceiver52M/UHDDevice.cpp @@ -80,11 +80,11 @@ struct uhd_dev_offset { #ifdef USE_UHD_3_9 #define B2XX_TIMING_1SPS 1.7153e-4 #define B2XX_TIMING_4SPS 1.1696e-4 -#define B2XX_TIMING_4_4SPS 5.89578e-5 +#define B2XX_TIMING_4_4SPS 6.18462e-5 #else #define B2XX_TIMING_1SPS 9.9692e-5 #define B2XX_TIMING_4SPS 6.9248e-5 -#define B2XX_TIMING_4_4SPS 4.19034e-5 +#define B2XX_TIMING_4_4SPS 4.52308e-5 #endif /* diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp index 2182550a..68487271 100644 --- a/Transceiver52M/sigProcLib.cpp +++ b/Transceiver52M/sigProcLib.cpp @@ -935,26 +935,35 @@ static signalVector *mapEdgeSymbols(const BitVector &bits) return symbols; } +/* + * EDGE 8-PSK rotate and pulse shape + * + * Delay the EDGE downlink bursts by one symbol in order to match GMSK pulse + * shaping group delay. The difference in group delay arises from the dual + * pulse filter combination of the GMSK Laurent represenation whereas 8-PSK + * uses a single pulse linear filter. + */ static signalVector *shapeEdgeBurst(const signalVector &symbols) { - size_t nsyms, nsamps = 625; + size_t nsyms, nsamps = 625, sps = 4; signalVector *burst, *shape; signalVector::iterator burst_itr; nsyms = symbols.size(); - if (nsyms * 4 > nsamps) + if (nsyms * sps > nsamps) nsyms = 156; burst = new signalVector(nsamps, GSMPulse4->c0->size()); - burst_itr = burst->begin(); - for (size_t i = 0; i < nsyms; i++) { + /* Delay burst by 1 symbol */ + burst_itr = burst->begin() + sps; + for (size_t i = 0; i < nsyms - 1; i++) { float phase = i * 3.0f * M_PI / 8.0f; Complex rot = Complex(cos(phase), sin(phase)); *burst_itr = symbols[i] * rot; - burst_itr += 4; + burst_itr += sps; } /* Single Gaussian pulse approximation shaping */