<p>Vadim Yanitskiy <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10770">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, but someone else must approve
  Piotr Krysik: Looks good to me, approved; Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">apps/grgsm_trx: add baseband frequency shift feature<br><br>An ability to shift the baseband frequency would allow one to<br>run both base stations and (OsmocomBB-based) mobile stations on<br>any frequency (e.g. in 2.4 GHz WiFi band)!<br><br>This is achieved by adding a given frequency offset to the<br>result of "ARFCN -> RX/TX frequency" calculation.<br><br>Usage example:<br><br>  grgsm_trx --freq-offset -500M<br><br>Both RX (Downlink) and TX (Uplink) frequencies will be shifted<br>by 500 MHz back, e.g. tuning request to ARFCN 105 would result<br>in tuning the radio to 456.0 MHz (instead of 956.0 MHz).<br><br>Related: OS#3520 (https://osmocom.org/versions/136)<br>Change-Id: I42e397e47402a87f4141ef31b25eff4c8c1267e2<br>---<br>M apps/grgsm_trx<br>M python/trx/radio_if.py<br>2 files changed, 26 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/apps/grgsm_trx b/apps/grgsm_trx</span><br><span>index 1c0581f..45312e6 100755</span><br><span>--- a/apps/grgsm_trx</span><br><span>+++ b/apps/grgsm_trx</span><br><span>@@ -25,6 +25,8 @@</span><br><span> import getopt</span><br><span> import sys</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+from gnuradio import eng_notation</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> from grgsm.trx import ctrl_if_bb</span><br><span> from grgsm.trx import radio_if</span><br><span> from grgsm.trx import fake_pm</span><br><span>@@ -45,6 +47,7 @@</span><br><span> </span><br><span>  # PHY specific</span><br><span>       phy_sample_rate = 4 * 1625000 / 6</span><br><span style="color: hsl(120, 100%, 40%);">+     phy_freq_offset_hz = None</span><br><span>    phy_tx_antenna = "TX/RX"</span><br><span>   phy_rx_antenna = "RX2"</span><br><span>     phy_rx_gain = 30</span><br><span>@@ -67,6 +70,10 @@</span><br><span>                        self.bind_addr, self.remote_addr,</span><br><span>                    self.base_port)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+           # Optional frequency offset</span><br><span style="color: hsl(120, 100%, 40%);">+           if self.phy_freq_offset_hz is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                       self.radio.freq_offset_hz = self.phy_freq_offset_hz</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                # Power measurement emulation</span><br><span>                # Noise: -120 .. -105</span><br><span>                # BTS: -75 .. -50</span><br><span>@@ -110,6 +117,7 @@</span><br><span>                       "  -G --tx-gain      Set TX gain (default %d)\n" \</span><br><span>                         "     --rx-antenna   Set RX antenna (default %s)\n" \</span><br><span>                      "     --tx-antenna   Set TX antenna (default %s)\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+                       "     --freq-offset  Shift baseband freq. (e.g. -500M)\n" \</span><br><span>                        "     --ppm          Set frequency correction (default %d)\n"</span><br><span> </span><br><span>                 print(s % (</span><br><span>@@ -128,7 +136,7 @@</span><br><span>                            "i:b:p:a:s:g:G:h",</span><br><span>                                 ["help", "remote-addr=", "bind-addr=", "base-port=",</span><br><span>                                 "device-args=", "sample-rate=", "rx-gain=", "tx-gain=",</span><br><span style="color: hsl(0, 100%, 40%);">-                         "ppm=", "rx-antenna=", "tx-antenna="])</span><br><span style="color: hsl(120, 100%, 40%);">+                          "ppm=", "rx-antenna=", "tx-antenna=", "freq-offset="])</span><br><span>               except getopt.GetoptError as err:</span><br><span>                    # Print(help and exit)</span><br><span>                       self.print_help()</span><br><span>@@ -167,6 +175,10 @@</span><br><span>                             self.phy_tx_antenna = v</span><br><span>                      elif o in ("--ppm"):</span><br><span>                               self.phy_ppm = int(v)</span><br><span style="color: hsl(120, 100%, 40%);">+                 elif o in ("--freq-offset"):</span><br><span style="color: hsl(120, 100%, 40%);">+                                # Convert /\d+(\.\d+)?(M|k)?/ to Hz</span><br><span style="color: hsl(120, 100%, 40%);">+                           offset_hz = eng_notation.str_to_num(v)</span><br><span style="color: hsl(120, 100%, 40%);">+                                self.phy_freq_offset_hz = offset_hz</span><br><span> </span><br><span>      def sig_handler(self, signum, frame):</span><br><span>                print("Signal %d received" % signum)</span><br><span>diff --git a/python/trx/radio_if.py b/python/trx/radio_if.py</span><br><span>index d2afcf6..407e724 100644</span><br><span>--- a/python/trx/radio_if.py</span><br><span>+++ b/python/trx/radio_if.py</span><br><span>@@ -4,7 +4,7 @@</span><br><span> # GR-GSM based transceiver</span><br><span> # Follow graph implementation</span><br><span> #</span><br><span style="color: hsl(0, 100%, 40%);">-# (C) 2016-2017 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2016-2018 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span> # (C) 2017      by Piotr Krysik <ptrkrysik@gmail.com></span><br><span> #</span><br><span> # All Rights Reserved</span><br><span>@@ -29,6 +29,7 @@</span><br><span> </span><br><span> from math import pi</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+from gnuradio import eng_notation</span><br><span> from gnuradio import digital</span><br><span> from gnuradio import blocks</span><br><span> from gnuradio import uhd</span><br><span>@@ -59,6 +60,7 @@</span><br><span> </span><br><span> class radio_if(gr.top_block):</span><br><span>     # PHY specific variables</span><br><span style="color: hsl(120, 100%, 40%);">+      freq_offset_hz = None</span><br><span>        rx_freq = 935e6</span><br><span>      tx_freq = 890e6</span><br><span>      osr = 4</span><br><span>@@ -274,11 +276,21 @@</span><br><span>              return self.ppm / 1.0e6 * 2 * pi * fc / self.sample_rate</span><br><span> </span><br><span>         def set_rx_freq(self, fc):</span><br><span style="color: hsl(120, 100%, 40%);">+            if self.freq_offset_hz is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                   fc += self.freq_offset_hz</span><br><span style="color: hsl(120, 100%, 40%);">+                     print("[#] Shifting RX freq. to %s (offset is %s)"</span><br><span style="color: hsl(120, 100%, 40%);">+                          % (eng_notation.num_to_str(fc),</span><br><span style="color: hsl(120, 100%, 40%);">+                                       eng_notation.num_to_str(self.freq_offset_hz)))</span><br><span>               self.phy_src.set_center_freq(fc, 0)</span><br><span>          self.rotator_src.set_phase_inc(self.calc_phase_inc(fc))</span><br><span>              self.rx_freq = fc</span><br><span> </span><br><span>        def set_tx_freq(self, fc):</span><br><span style="color: hsl(120, 100%, 40%);">+            if self.freq_offset_hz is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                   fc += self.freq_offset_hz</span><br><span style="color: hsl(120, 100%, 40%);">+                     print("[#] Shifting TX freq. to %s (offset is %s)"</span><br><span style="color: hsl(120, 100%, 40%);">+                          % (eng_notation.num_to_str(fc),</span><br><span style="color: hsl(120, 100%, 40%);">+                                       eng_notation.num_to_str(self.freq_offset_hz)))</span><br><span>               self.phy_sink.set_center_freq(fc, 0)</span><br><span>                 self.rotator_sink.set_phase_inc(-self.calc_phase_inc(fc))</span><br><span>            self.tx_freq = fc</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10770">change 10770</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/10770"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: gr-gsm </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I42e397e47402a87f4141ef31b25eff4c8c1267e2 </div>
<div style="display:none"> Gerrit-Change-Number: 10770 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Piotr Krysik <ptrkrysik@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>