From 8ee2f38a87df07462467865cde16ab7e7508bd0e Mon Sep 17 00:00:00 2001 From: Tom Tsou Date: Sun, 6 Mar 2016 20:57:34 -0800 Subject: sigproc: Add various GSM burst generators Setup generators for empty, random, and dummy bursts. This moves error prone burst length handling out of the Transceiver and into the signal processing core. Signed-off-by: Tom Tsou --- Transceiver52M/Transceiver.cpp | 44 ++---------------------------- Transceiver52M/sigProcLib.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++ Transceiver52M/sigProcLib.h | 9 ++++++ 3 files changed, 74 insertions(+), 41 deletions(-) diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp index 255e120..a9e7035 100644 --- a/Transceiver52M/Transceiver.cpp +++ b/Transceiver52M/Transceiver.cpp @@ -71,63 +71,25 @@ TransceiverState::~TransceiverState() } } -static BitVector *genRandNormalBurst(size_t tsc) -{ - if (tsc > 7) - return NULL; - - BitVector *bits = new BitVector(148); - - size_t i = 0; - - /* Tail bits */ - for (; i < 4; i++) - (*bits)[i] = 0; - - /* Random bits */ - for (; i < 61; i++) - (*bits)[i] = rand() % 2; - - /* Training sequence */ - for (int j = 0; i < 87; i++, j++) - (*bits)[i] = GSM::gTrainingSequence[tsc][j]; - - /* Random bits */ - for (; i < 144; i++) - (*bits)[i] = rand() % 2; - - /* Tail bits */ - for (; i < 148; i++) - (*bits)[i] = 0; - - return bits; -} - bool TransceiverState::init(int filler, size_t sps, float scale, size_t rtsc) { - BitVector *bits; signalVector *burst; if ((sps != 1) && (sps != 4)) return false; for (size_t n = 0; n < 8; n++) { - size_t guard = 8 + !(n % 4); - size_t len = sps == 4 ? 625 : 148 + guard; - for (size_t i = 0; i < 102; i++) { switch (filler) { case Transceiver::FILLER_DUMMY: - burst = modulateBurst(gDummyBurst, guard, sps); + burst = generateDummyBurst(sps, n); break; case Transceiver::FILLER_RAND: - bits = genRandNormalBurst(rtsc); - burst = modulateBurst(*bits, guard, sps); - delete bits; + burst = genRandNormalBurst(rtsc, sps, n); break; case Transceiver::FILLER_ZERO: default: - burst = new signalVector(len); + burst = generateEmptyBurst(sps, n); } scaleVector(*burst, scale); diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp index 1a15e51..cf2c257 100644 --- a/Transceiver52M/sigProcLib.cpp +++ b/Transceiver52M/sigProcLib.cpp @@ -964,6 +964,68 @@ static signalVector *shapeEdgeBurst(const signalVector &symbols) return shape; } +/* + * Generate a random GSM normal burst. + */ +signalVector *genRandNormalBurst(int tsc, int sps, int tn) +{ + if ((tsc < 0) || (tsc > 7) || (tn < 0) || (tn > 7)) + return NULL; + if ((sps != 1) && (sps != 4)) + return NULL; + + int i = 0; + BitVector *bits = new BitVector(148); + signalVector *burst; + + /* Tail bits */ + for (; i < 4; i++) + (*bits)[i] = 0; + + /* Random bits */ + for (; i < 61; i++) + (*bits)[i] = rand() % 2; + + /* Training sequence */ + for (int n = 0; i < 87; i++, n++) + (*bits)[i] = gTrainingSequence[tsc][n]; + + /* Random bits */ + for (; i < 144; i++) + (*bits)[i] = rand() % 2; + + /* Tail bits */ + for (; i < 148; i++) + (*bits)[i] = 0; + + int guard = 8 + !(tn % 4); + burst = modulateBurst(*bits, guard, sps); + delete bits; + + return burst; +} + +signalVector *generateEmptyBurst(int sps, int tn) +{ + if ((tn < 0) || (tn > 7)) + return NULL; + + if (sps == 4) + return new signalVector(625); + else if (sps == 1) + return new signalVector(148 + 8 + !(tn % 4)); + else + return NULL; +} + +signalVector *generateDummyBurst(int sps, int tn) +{ + if (((sps != 1) && (sps != 4)) || (tn < 0) || (tn > 7)) + return NULL; + + return modulateBurst(gDummyBurst, 8 + !(tn % 4), sps); +} + /* * Generate a random 8-PSK EDGE burst. Only 4 SPS is supported with * the returned burst being 625 samples in length. diff --git a/Transceiver52M/sigProcLib.h b/Transceiver52M/sigProcLib.h index 4f9f849..870eb1a 100644 --- a/Transceiver52M/sigProcLib.h +++ b/Transceiver52M/sigProcLib.h @@ -116,6 +116,15 @@ signalVector *modulateEdgeBurst(const BitVector &bits, /** Generate a EDGE burst with random payload - 4 SPS (625 samples) only */ signalVector *generateEdgeBurst(int tsc); +/** Generate an empty burst - 4 or 1 SPS */ +signalVector *generateEmptyBurst(int sps, int tn); + +/** Generate a normal GSM burst with random payload - 4 or 1 SPS */ +signalVector *genRandNormalBurst(int tsc, int sps, int tn); + +/** Generate a dummy GSM burst - 4 or 1 SPS */ +signalVector *generateDummyBurst(int sps, int tn); + /** Sinc function */ float sinc(float x); -- cgit v1.2.3