aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Transceiver52M/Transceiver.cpp44
-rw-r--r--Transceiver52M/sigProcLib.cpp62
-rw-r--r--Transceiver52M/sigProcLib.h9
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);