<p>Vadim Yanitskiy <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/11390">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Harald Welte: Looks good to me, approved
Jenkins Builder: Verified
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sigProcLib: introduce both TS1 and TS2 RACH synch. sequences<br><br>According to 3GPP TS 05.02, section 5.2.7, there are three<br>synch. sequences for Access Bursts:<br><br> - TS0: GSM, GMSK (default),<br> - TS1: EGPRS, 8-PSK,<br> - TS2: EGPRS, GMSK.<br><br>Let's prepare everythyng to be able to detect all TS0-3 synch.<br>sequences, but keep detection of both TS1 and TS2 disabled<br>until the corresponding VTY option is introduced.<br><br>Change-Id: I838c21db29c54f1924dd478c2b34b46b70aab2cd<br>Related: OS#3054<br>---<br>M GSM/GSMCommon.cpp<br>M GSM/GSMCommon.h<br>M Transceiver52M/radioInterface.cpp<br>M Transceiver52M/sigProcLib.cpp<br>4 files changed, 31 insertions(+), 19 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/GSM/GSMCommon.cpp b/GSM/GSMCommon.cpp</span><br><span>index 8aba3be..711ca70 100644</span><br><span>--- a/GSM/GSMCommon.cpp</span><br><span>+++ b/GSM/GSMCommon.cpp</span><br><span>@@ -54,7 +54,10 @@</span><br><span> </span><br><span> const BitVector GSM::gDummyBurst("0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const BitVector GSM::gRACHSynchSequence("01001011011111111001100110101010001111000");</span><br><span style="color: hsl(120, 100%, 40%);">+/* 3GPP TS 05.02, section 5.2.7 "Access burst (AB)", synch. sequence bits */</span><br><span style="color: hsl(120, 100%, 40%);">+const BitVector GSM::gRACHSynchSequenceTS0("01001011011111111001100110101010001111000"); /* GSM, GMSK (default) */</span><br><span style="color: hsl(120, 100%, 40%);">+const BitVector GSM::gRACHSynchSequenceTS1("01010100111110001000011000101111001001101"); /* EGPRS, 8-PSK */</span><br><span style="color: hsl(120, 100%, 40%);">+const BitVector GSM::gRACHSynchSequenceTS2("11101111001001110101011000001101101110111"); /* EGPRS, GMSK */</span><br><span> </span><br><span> // |-head-||---------midamble----------------------||--------------data----------------||t|</span><br><span> const BitVector GSM::gRACHBurst("0011101001001011011111111001100110101010001111000110111101111110000111001001010110011000");</span><br><span>diff --git a/GSM/GSMCommon.h b/GSM/GSMCommon.h</span><br><span>index 8b8d5e8..f703c30 100644</span><br><span>--- a/GSM/GSMCommon.h</span><br><span>+++ b/GSM/GSMCommon.h</span><br><span>@@ -52,7 +52,9 @@</span><br><span> extern const BitVector gDummyBurst;</span><br><span> </span><br><span> /** Random access burst synch. sequence */</span><br><span style="color: hsl(0, 100%, 40%);">-extern const BitVector gRACHSynchSequence;</span><br><span style="color: hsl(120, 100%, 40%);">+extern const BitVector gRACHSynchSequenceTS0;</span><br><span style="color: hsl(120, 100%, 40%);">+extern const BitVector gRACHSynchSequenceTS1;</span><br><span style="color: hsl(120, 100%, 40%);">+extern const BitVector gRACHSynchSequenceTS2;</span><br><span> /** Random access burst synch. sequence, GSM 05.02 5.2.7 */</span><br><span> extern const BitVector gRACHBurst;</span><br><span> </span><br><span>diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp</span><br><span>index 0f949d7..6245cfc 100644</span><br><span>--- a/Transceiver52M/radioInterface.cpp</span><br><span>+++ b/Transceiver52M/radioInterface.cpp</span><br><span>@@ -245,7 +245,7 @@</span><br><span> * Pre-allocate head room for the largest correlation size</span><br><span> * so we can later avoid a re-allocation and copy</span><br><span> * */</span><br><span style="color: hsl(0, 100%, 40%);">- size_t head = GSM::gRACHSynchSequence.size();</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t head = GSM::gRACHSynchSequenceTS0.size();</span><br><span> </span><br><span> /*</span><br><span> * Form receive bursts and pass up to transceiver. Use repeating</span><br><span>diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp</span><br><span>index 692fbe0..072fb3b 100644</span><br><span>--- a/Transceiver52M/sigProcLib.cpp</span><br><span>+++ b/Transceiver52M/sigProcLib.cpp</span><br><span>@@ -132,7 +132,7 @@</span><br><span> </span><br><span> static CorrelationSequence *gMidambles[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};</span><br><span> static CorrelationSequence *gEdgeMidambles[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};</span><br><span style="color: hsl(0, 100%, 40%);">-static CorrelationSequence *gRACHSequence = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+static CorrelationSequence *gRACHSequences[] = {NULL,NULL,NULL};</span><br><span> static PulseSequence *GSMPulse1 = NULL;</span><br><span> static PulseSequence *GSMPulse4 = NULL;</span><br><span> </span><br><span>@@ -150,11 +150,15 @@</span><br><span> delayFilters[i] = NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ for (int i = 0; i < 3; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ delete gRACHSequences[i];</span><br><span style="color: hsl(120, 100%, 40%);">+ gRACHSequences[i] = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> delete GMSKRotation1;</span><br><span> delete GMSKReverseRotation1;</span><br><span> delete GMSKRotation4;</span><br><span> delete GMSKReverseRotation4;</span><br><span style="color: hsl(0, 100%, 40%);">- delete gRACHSequence;</span><br><span> delete GSMPulse1;</span><br><span> delete GSMPulse4;</span><br><span> delete dnsampler;</span><br><span>@@ -163,7 +167,6 @@</span><br><span> GMSKRotation4 = NULL;</span><br><span> GMSKReverseRotation4 = NULL;</span><br><span> GMSKReverseRotation1 = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- gRACHSequence = NULL;</span><br><span> GSMPulse1 = NULL;</span><br><span> GSMPulse4 = NULL;</span><br><span> }</span><br><span>@@ -1332,7 +1335,7 @@</span><br><span> return seq;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static bool generateRACHSequence(int sps)</span><br><span style="color: hsl(120, 100%, 40%);">+static bool generateRACHSequence(CorrelationSequence **seq, const BitVector &bv, int sps)</span><br><span> {</span><br><span> bool status = true;</span><br><span> float toa;</span><br><span>@@ -1340,13 +1343,14 @@</span><br><span> signalVector *autocorr = NULL;</span><br><span> signalVector *seq0 = NULL, *seq1 = NULL, *_seq1 = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- delete gRACHSequence;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (*seq != NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+ delete *seq;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- seq0 = modulateBurst(gRACHSynchSequence, 0, sps, false);</span><br><span style="color: hsl(120, 100%, 40%);">+ seq0 = modulateBurst(bv, 0, sps, false);</span><br><span> if (!seq0)</span><br><span> return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- seq1 = modulateBurst(gRACHSynchSequence.segment(0, 40), 0, sps, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ seq1 = modulateBurst(bv.segment(0, 40), 0, sps, true);</span><br><span> if (!seq1) {</span><br><span> status = false;</span><br><span> goto release;</span><br><span>@@ -1366,19 +1370,19 @@</span><br><span> goto release;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gRACHSequence = new CorrelationSequence;</span><br><span style="color: hsl(0, 100%, 40%);">- gRACHSequence->sequence = _seq1;</span><br><span style="color: hsl(0, 100%, 40%);">- gRACHSequence->buffer = data;</span><br><span style="color: hsl(0, 100%, 40%);">- gRACHSequence->gain = peakDetect(*autocorr, &toa, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ *seq = new CorrelationSequence;</span><br><span style="color: hsl(120, 100%, 40%);">+ (*seq)->sequence = _seq1;</span><br><span style="color: hsl(120, 100%, 40%);">+ (*seq)->buffer = data;</span><br><span style="color: hsl(120, 100%, 40%);">+ (*seq)->gain = peakDetect(*autocorr, &toa, NULL);</span><br><span> </span><br><span> /* For 1 sps only</span><br><span> * (Half of correlation length - 1) + midpoint of pulse shaping filer</span><br><span> * 20.5 = (40 / 2 - 1) + 1.5</span><br><span> */</span><br><span> if (sps == 1)</span><br><span style="color: hsl(0, 100%, 40%);">- gRACHSequence->toa = toa - 20.5;</span><br><span style="color: hsl(120, 100%, 40%);">+ (*seq)->toa = toa - 20.5;</span><br><span> else</span><br><span style="color: hsl(0, 100%, 40%);">- gRACHSequence->toa = 0.0;</span><br><span style="color: hsl(120, 100%, 40%);">+ (*seq)->toa = 0.0;</span><br><span> </span><br><span> release:</span><br><span> delete autocorr;</span><br><span>@@ -1388,7 +1392,7 @@</span><br><span> if (!status) {</span><br><span> delete _seq1;</span><br><span> free(data);</span><br><span style="color: hsl(0, 100%, 40%);">- gRACHSequence = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ *seq = NULL;</span><br><span> }</span><br><span> </span><br><span> return status;</span><br><span>@@ -1606,7 +1610,7 @@</span><br><span> target = 8 + 40;</span><br><span> head = 8;</span><br><span> tail = 8 + max_toa;</span><br><span style="color: hsl(0, 100%, 40%);">- sync = gRACHSequence;</span><br><span style="color: hsl(120, 100%, 40%);">+ sync = gRACHSequences[0];</span><br><span> </span><br><span> rc = detectGeneralBurst(burst, threshold, sps, amplitude, toa,</span><br><span> target, head, tail, sync);</span><br><span>@@ -1858,7 +1862,10 @@</span><br><span> GSMPulse1 = generateGSMPulse(1);</span><br><span> GSMPulse4 = generateGSMPulse(4);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- generateRACHSequence(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ generateRACHSequence(&gRACHSequences[0], gRACHSynchSequenceTS0, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ generateRACHSequence(&gRACHSequences[1], gRACHSynchSequenceTS1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ generateRACHSequence(&gRACHSequences[2], gRACHSynchSequenceTS2, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> for (int tsc = 0; tsc < 8; tsc++) {</span><br><span> generateMidamble(1, tsc);</span><br><span> gEdgeMidambles[tsc] = generateEdgeMidamble(tsc);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11390">change 11390</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/11390"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I838c21db29c54f1924dd478c2b34b46b70aab2cd </div>
<div style="display:none"> Gerrit-Change-Number: 11390 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Assignee: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Tom Tsou <tom@tsou.cc> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>