<p>Hoernchen <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/22714">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  tnt: Looks good to me, but someone else must approve
  Hoernchen: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sigProcLib: fix C/I computation for 8-PSK modulated bursts<br><br>Change-Id: I860af60bc0fbd36dfb38316fad65ddd3a5827a8f<br>Related: Ib4ceec553f2e5f77bf3f6777724968456a180f5e<br>Related: OS#4006, OS#4373<br>---<br>M Transceiver52M/Transceiver.cpp<br>M Transceiver52M/sigProcLib.cpp<br>M Transceiver52M/sigProcLib.h<br>3 files changed, 38 insertions(+), 17 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp</span><br><span>index 6de266c..0a1ba6f 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -734,11 +734,10 @@</span><br><span>     goto ret_idle;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  type = (CorrType) rc;</span><br><span style="color: hsl(120, 100%, 40%);">+  rxBurst = demodAnyBurst(*burst, (CorrType) rc, cfg->rx_sps, &ebp);</span><br><span>   bi->toa = ebp.toa;</span><br><span>   bi->tsc = ebp.tsc;</span><br><span>   bi->ci = ebp.ci;</span><br><span style="color: hsl(0, 100%, 40%);">-  rxBurst = demodAnyBurst(*burst, cfg->rx_sps, ebp.amp, ebp.toa, type);</span><br><span> </span><br><span>   /* EDGE demodulator returns 444 (gSlotLen * 3) bits */</span><br><span>   if (rxBurst->size() == EDGE_BURST_NBITS) {</span><br><span>diff --git a/Transceiver52M/sigProcLib.cpp b/Transceiver52M/sigProcLib.cpp</span><br><span>index 04f7e30..b7c41ba 100644</span><br><span>--- a/Transceiver52M/sigProcLib.cpp</span><br><span>+++ b/Transceiver52M/sigProcLib.cpp</span><br><span>@@ -1792,15 +1792,15 @@</span><br><span>  * stages.</span><br><span>  */</span><br><span> static signalVector *demodCommon(const signalVector &burst, int sps,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 complex chan, float toa)</span><br><span style="color: hsl(120, 100%, 40%);">+                                 const struct estim_burst_params *ebp)</span><br><span> {</span><br><span>   signalVector *delay, *dec;</span><br><span> </span><br><span>   if ((sps != 1) && (sps != 4))</span><br><span>     return NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  delay = delayVector(&burst, NULL, -toa * (float) sps);</span><br><span style="color: hsl(0, 100%, 40%);">-  scaleVector(*delay, (complex) 1.0 / chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  delay = delayVector(&burst, NULL, -ebp->toa * (float) sps);</span><br><span style="color: hsl(120, 100%, 40%);">+  scaleVector(*delay, (complex) 1.0 / ebp->amp);</span><br><span> </span><br><span>   if (sps == 1)</span><br><span>     return delay;</span><br><span>@@ -1816,13 +1816,13 @@</span><br><span>  * 4 SPS (if activated) to minimize distortion through the fractional</span><br><span>  * delay filters. Symbol rotation and after always operates at 1 SPS.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static SoftVector *demodGmskBurst(const signalVector &rxBurst,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  int sps, complex channel, float TOA)</span><br><span style="color: hsl(120, 100%, 40%);">+static SoftVector *demodGmskBurst(const signalVector &rxBurst, int sps,</span><br><span style="color: hsl(120, 100%, 40%);">+                             const struct estim_burst_params *ebp)</span><br><span> {</span><br><span>   SoftVector *bits;</span><br><span>   signalVector *dec;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  dec = demodCommon(rxBurst, sps, channel, TOA);</span><br><span style="color: hsl(120, 100%, 40%);">+  dec = demodCommon(rxBurst, sps, ebp);</span><br><span>   if (!dec)</span><br><span>     return NULL;</span><br><span> </span><br><span>@@ -1835,6 +1835,27 @@</span><br><span>   return bits;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static float computeEdgeCI(const signalVector *rot)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  float err_pwr = 0.0f;</span><br><span style="color: hsl(120, 100%, 40%);">+  float step = 2.0f * M_PI_F / 8.0f;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  for (size_t i = 8; i < rot->size() - 8; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Compute the ideal symbol */</span><br><span style="color: hsl(120, 100%, 40%);">+    complex sym = (*rot)[i];</span><br><span style="color: hsl(120, 100%, 40%);">+    float phase = step * roundf(sym.arg() / step);</span><br><span style="color: hsl(120, 100%, 40%);">+    complex ideal = complex(cos(phase), sin(phase));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Compute the error vector */</span><br><span style="color: hsl(120, 100%, 40%);">+    complex err = ideal - sym;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Accumulate power */</span><br><span style="color: hsl(120, 100%, 40%);">+    err_pwr += err.norm2();</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return 3.0103f * log2f(1.0f * (rot->size() - 16) / err_pwr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span>  * Demodulate an 8-PSK burst. Prior to symbol rotation, operate at</span><br><span>  * 4 SPS (if activated) to minimize distortion through the fractional</span><br><span>@@ -1845,19 +1866,20 @@</span><br><span>  * through the fractional delay filters at 1 SPS renders signal</span><br><span>  * nearly unrecoverable.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static SoftVector *demodEdgeBurst(const signalVector &burst,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  int sps, complex chan, float toa)</span><br><span style="color: hsl(120, 100%, 40%);">+static SoftVector *demodEdgeBurst(const signalVector &burst, int sps,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  struct estim_burst_params *ebp)</span><br><span> {</span><br><span>   SoftVector *bits;</span><br><span>   signalVector *dec, *rot, *eq;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  dec = demodCommon(burst, sps, chan, toa);</span><br><span style="color: hsl(120, 100%, 40%);">+  dec = demodCommon(burst, sps, ebp);</span><br><span>   if (!dec)</span><br><span>     return NULL;</span><br><span> </span><br><span>   /* Equalize and derotate */</span><br><span>   eq = convolve(dec, GSMPulse4->c0_inv, NULL, NO_DELAY);</span><br><span>   rot = derotateEdgeBurst(*eq, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+  ebp->ci = computeEdgeCI(rot);</span><br><span> </span><br><span>   /* Soft slice and normalize */</span><br><span>   bits = softSliceEdgeBurst(*rot);</span><br><span>@@ -1869,13 +1891,13 @@</span><br><span>   return bits;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-SoftVector *demodAnyBurst(const signalVector &burst, int sps, complex amp,</span><br><span style="color: hsl(0, 100%, 40%);">-                          float toa, CorrType type)</span><br><span style="color: hsl(120, 100%, 40%);">+SoftVector *demodAnyBurst(const signalVector &burst, CorrType type,</span><br><span style="color: hsl(120, 100%, 40%);">+                          int sps, struct estim_burst_params *ebp)</span><br><span> {</span><br><span>   if (type == EDGE)</span><br><span style="color: hsl(0, 100%, 40%);">-    return demodEdgeBurst(burst, sps, amp, toa);</span><br><span style="color: hsl(120, 100%, 40%);">+    return demodEdgeBurst(burst, sps, ebp);</span><br><span>   else</span><br><span style="color: hsl(0, 100%, 40%);">-    return demodGmskBurst(burst, sps, amp, toa);</span><br><span style="color: hsl(120, 100%, 40%);">+    return demodGmskBurst(burst, sps, ebp);</span><br><span> }</span><br><span> </span><br><span> bool sigProcLibSetup()</span><br><span>diff --git a/Transceiver52M/sigProcLib.h b/Transceiver52M/sigProcLib.h</span><br><span>index dd03190..0c3c7c6 100644</span><br><span>--- a/Transceiver52M/sigProcLib.h</span><br><span>+++ b/Transceiver52M/sigProcLib.h</span><br><span>@@ -134,7 +134,7 @@</span><br><span>                    struct estim_burst_params *ebp);</span><br><span> </span><br><span> /** Demodulate burst basde on type and output soft bits */</span><br><span style="color: hsl(0, 100%, 40%);">-SoftVector *demodAnyBurst(const signalVector &burst, int sps,</span><br><span style="color: hsl(0, 100%, 40%);">-                          complex amp, float toa, CorrType type);</span><br><span style="color: hsl(120, 100%, 40%);">+SoftVector *demodAnyBurst(const signalVector &burst, CorrType type,</span><br><span style="color: hsl(120, 100%, 40%);">+                          int sps, struct estim_burst_params *ebp);</span><br><span> </span><br><span> #endif /* SIGPROCLIB_H */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/22714">change 22714</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/c/osmo-trx/+/22714"/><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-Change-Id: I860af60bc0fbd36dfb38316fad65ddd3a5827a8f </div>
<div style="display:none"> Gerrit-Change-Number: 22714 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-CC: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>