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 <tom.tsou@ettus.com>
This commit is contained in:
Tom Tsou 2016-04-26 19:28:59 -07:00
parent 9664c3a6e7
commit d2b070369d
2 changed files with 16 additions and 7 deletions

View File

@ -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
/*

View File

@ -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<float> rot = Complex<float>(cos(phase), sin(phase));
*burst_itr = symbols[i] * rot;
burst_itr += 4;
burst_itr += sps;
}
/* Single Gaussian pulse approximation shaping */