diff options
author | Vadim Yanitskiy <axilirator@gmail.com> | 2018-10-17 11:01:58 +0200 |
---|---|---|
committer | Vadim Yanitskiy <axilirator@gmail.com> | 2018-10-24 19:28:47 +0000 |
commit | a79bc70737c3d8aadb983e926bf6467a12aed8ae (patch) | |
tree | 39cbb1040cd13650bb7ccd88ef9dd62bfa3dcb3e | |
parent | a439fed1662ce92c008e440b6a2ca1b2d95ce4cb (diff) |
sigProcLib: introduce both TS1 and TS2 RACH synch. sequences
According to 3GPP TS 05.02, section 5.2.7, there are three
synch. sequences for Access Bursts:
- TS0: GSM, GMSK (default),
- TS1: EGPRS, 8-PSK,
- TS2: EGPRS, GMSK.
Let's prepare everythyng to be able to detect all TS0-3 synch.
sequences, but keep detection of both TS1 and TS2 disabled
until the corresponding VTY option is introduced.
Change-Id: I838c21db29c54f1924dd478c2b34b46b70aab2cd
Related: OS#3054
-rw-r--r-- | GSM/GSMCommon.cpp | 5 | ||||
-rw-r--r-- | GSM/GSMCommon.h | 4 | ||||
-rw-r--r-- | Transceiver52M/radioInterface.cpp | 2 | ||||
-rw-r--r-- | Transceiver52M/sigProcLib.cpp | 39 |
4 files changed, 31 insertions, 19 deletions
diff --git a/GSM/GSMCommon.cpp b/GSM/GSMCommon.cpp index 8aba3be..711ca70 100644 --- a/GSM/GSMCommon.cpp +++ b/GSM/GSMCommon.cpp @@ -54,7 +54,10 @@ const BitVector GSM::gEdgeTrainingSequence[] = { const BitVector GSM::gDummyBurst("0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000"); -const BitVector GSM::gRACHSynchSequence("01001011011111111001100110101010001111000"); +/* 3GPP TS 05.02, section 5.2.7 "Access burst (AB)", synch. sequence bits */ +const BitVector GSM::gRACHSynchSequenceTS0("01001011011111111001100110101010001111000"); /* GSM, GMSK (default) */ +const BitVector GSM::gRACHSynchSequenceTS1("01010100111110001000011000101111001001101"); /* EGPRS, 8-PSK */ +const BitVector GSM::gRACHSynchSequenceTS2("11101111001001110101011000001101101110111"); /* EGPRS, GMSK */ // |-head-||---------midamble----------------------||--------------data----------------||t| const BitVector GSM::gRACHBurst("0011101001001011011111111001100110101010001111000110111101111110000111001001010110011000"); diff --git a/GSM/GSMCommon.h b/GSM/GSMCommon.h index 8b8d5e8..f703c30 100644 --- a/GSM/GSMCommon.h +++ b/GSM/GSMCommon.h @@ -52,7 +52,9 @@ extern const BitVector gEdgeTrainingSequence[]; extern const BitVector gDummyBurst; /** Random access burst synch. sequence */ -extern const BitVector gRACHSynchSequence; +extern const BitVector gRACHSynchSequenceTS0; +extern const BitVector gRACHSynchSequenceTS1; +extern const BitVector gRACHSynchSequenceTS2; /** Random access burst synch. sequence, GSM 05.02 5.2.7 */ extern const BitVector gRACHBurst; diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp index 0f949d7..6245cfc 100644 --- a/Transceiver52M/radioInterface.cpp +++ b/Transceiver52M/radioInterface.cpp @@ -245,7 +245,7 @@ int RadioInterface::driveReceiveRadio() * Pre-allocate head room for the largest correlation size * so we can later avoid a re-allocation and copy * */ - size_t head = GSM::gRACHSynchSequence.size(); + size_t head = GSM::gRACHSynchSequenceTS0.size(); /* * Form receive bursts and pass up to transceiver. Use repeating diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp index 692fbe0..072fb3b 100644 --- a/Transceiver52M/sigProcLib.cpp +++ b/Transceiver52M/sigProcLib.cpp @@ -132,7 +132,7 @@ struct PulseSequence { static CorrelationSequence *gMidambles[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; static CorrelationSequence *gEdgeMidambles[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; -static CorrelationSequence *gRACHSequence = NULL; +static CorrelationSequence *gRACHSequences[] = {NULL,NULL,NULL}; static PulseSequence *GSMPulse1 = NULL; static PulseSequence *GSMPulse4 = NULL; @@ -150,11 +150,15 @@ void sigProcLibDestroy() delayFilters[i] = NULL; } + for (int i = 0; i < 3; i++) { + delete gRACHSequences[i]; + gRACHSequences[i] = NULL; + } + delete GMSKRotation1; delete GMSKReverseRotation1; delete GMSKRotation4; delete GMSKReverseRotation4; - delete gRACHSequence; delete GSMPulse1; delete GSMPulse4; delete dnsampler; @@ -163,7 +167,6 @@ void sigProcLibDestroy() GMSKRotation4 = NULL; GMSKReverseRotation4 = NULL; GMSKReverseRotation1 = NULL; - gRACHSequence = NULL; GSMPulse1 = NULL; GSMPulse4 = NULL; } @@ -1332,7 +1335,7 @@ static CorrelationSequence *generateEdgeMidamble(int tsc) return seq; } -static bool generateRACHSequence(int sps) +static bool generateRACHSequence(CorrelationSequence **seq, const BitVector &bv, int sps) { bool status = true; float toa; @@ -1340,13 +1343,14 @@ static bool generateRACHSequence(int sps) signalVector *autocorr = NULL; signalVector *seq0 = NULL, *seq1 = NULL, *_seq1 = NULL; - delete gRACHSequence; + if (*seq != NULL) + delete *seq; - seq0 = modulateBurst(gRACHSynchSequence, 0, sps, false); + seq0 = modulateBurst(bv, 0, sps, false); if (!seq0) return false; - seq1 = modulateBurst(gRACHSynchSequence.segment(0, 40), 0, sps, true); + seq1 = modulateBurst(bv.segment(0, 40), 0, sps, true); if (!seq1) { status = false; goto release; @@ -1366,19 +1370,19 @@ static bool generateRACHSequence(int sps) goto release; } - gRACHSequence = new CorrelationSequence; - gRACHSequence->sequence = _seq1; - gRACHSequence->buffer = data; - gRACHSequence->gain = peakDetect(*autocorr, &toa, NULL); + *seq = new CorrelationSequence; + (*seq)->sequence = _seq1; + (*seq)->buffer = data; + (*seq)->gain = peakDetect(*autocorr, &toa, NULL); /* For 1 sps only * (Half of correlation length - 1) + midpoint of pulse shaping filer * 20.5 = (40 / 2 - 1) + 1.5 */ if (sps == 1) - gRACHSequence->toa = toa - 20.5; + (*seq)->toa = toa - 20.5; else - gRACHSequence->toa = 0.0; + (*seq)->toa = 0.0; release: delete autocorr; @@ -1388,7 +1392,7 @@ release: if (!status) { delete _seq1; free(data); - gRACHSequence = NULL; + *seq = NULL; } return status; @@ -1606,7 +1610,7 @@ static int detectRACHBurst(const signalVector &burst, float threshold, int sps, target = 8 + 40; head = 8; tail = 8 + max_toa; - sync = gRACHSequence; + sync = gRACHSequences[0]; rc = detectGeneralBurst(burst, threshold, sps, amplitude, toa, target, head, tail, sync); @@ -1858,7 +1862,10 @@ bool sigProcLibSetup() GSMPulse1 = generateGSMPulse(1); GSMPulse4 = generateGSMPulse(4); - generateRACHSequence(1); + generateRACHSequence(&gRACHSequences[0], gRACHSynchSequenceTS0, 1); + generateRACHSequence(&gRACHSequences[1], gRACHSynchSequenceTS1, 1); + generateRACHSequence(&gRACHSequences[2], gRACHSynchSequenceTS2, 1); + for (int tsc = 0; tsc < 8; tsc++) { generateMidamble(1, tsc); gEdgeMidambles[tsc] = generateEdgeMidamble(tsc); |