diff options
Diffstat (limited to 'Transceiver52M')
-rw-r--r-- | Transceiver52M/Transceiver.cpp | 44 | ||||
-rw-r--r-- | Transceiver52M/sigProcLib.cpp | 62 | ||||
-rw-r--r-- | 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 @@ -965,6 +965,68 @@ static signalVector *shapeEdgeBurst(const signalVector &symbols) } /* + * 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); |