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