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
This commit is contained in:
Vadim Yanitskiy 2018-10-17 11:01:58 +02:00
parent a439fed166
commit a79bc70737
4 changed files with 31 additions and 19 deletions

View File

@ -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");

View File

@ -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;

View File

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

View File

@ -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);