diff options
-rwxr-xr-x | apps/grgsm_trx | 14 | ||||
-rw-r--r-- | python/trx/radio_if.py | 14 |
2 files changed, 26 insertions, 2 deletions
diff --git a/apps/grgsm_trx b/apps/grgsm_trx index 1c0581f..45312e6 100755 --- a/apps/grgsm_trx +++ b/apps/grgsm_trx @@ -25,6 +25,8 @@ import signal import getopt import sys +from gnuradio import eng_notation + from grgsm.trx import ctrl_if_bb from grgsm.trx import radio_if from grgsm.trx import fake_pm @@ -45,6 +47,7 @@ class Application: # PHY specific phy_sample_rate = 4 * 1625000 / 6 + phy_freq_offset_hz = None phy_tx_antenna = "TX/RX" phy_rx_antenna = "RX2" phy_rx_gain = 30 @@ -67,6 +70,10 @@ class Application: self.bind_addr, self.remote_addr, self.base_port) + # Optional frequency offset + if self.phy_freq_offset_hz is not None: + self.radio.freq_offset_hz = self.phy_freq_offset_hz + # Power measurement emulation # Noise: -120 .. -105 # BTS: -75 .. -50 @@ -110,6 +117,7 @@ class Application: " -G --tx-gain Set TX gain (default %d)\n" \ " --rx-antenna Set RX antenna (default %s)\n" \ " --tx-antenna Set TX antenna (default %s)\n" \ + " --freq-offset Shift baseband freq. (e.g. -500M)\n" \ " --ppm Set frequency correction (default %d)\n" print(s % ( @@ -128,7 +136,7 @@ class Application: "i:b:p:a:s:g:G:h", ["help", "remote-addr=", "bind-addr=", "base-port=", "device-args=", "sample-rate=", "rx-gain=", "tx-gain=", - "ppm=", "rx-antenna=", "tx-antenna="]) + "ppm=", "rx-antenna=", "tx-antenna=", "freq-offset="]) except getopt.GetoptError as err: # Print(help and exit) self.print_help() @@ -167,6 +175,10 @@ class Application: self.phy_tx_antenna = v elif o in ("--ppm"): self.phy_ppm = int(v) + elif o in ("--freq-offset"): + # Convert /\d+(\.\d+)?(M|k)?/ to Hz + offset_hz = eng_notation.str_to_num(v) + self.phy_freq_offset_hz = offset_hz def sig_handler(self, signum, frame): print("Signal %d received" % signum) diff --git a/python/trx/radio_if.py b/python/trx/radio_if.py index d2afcf6..407e724 100644 --- a/python/trx/radio_if.py +++ b/python/trx/radio_if.py @@ -4,7 +4,7 @@ # GR-GSM based transceiver # Follow graph implementation # -# (C) 2016-2017 by Vadim Yanitskiy <axilirator@gmail.com> +# (C) 2016-2018 by Vadim Yanitskiy <axilirator@gmail.com> # (C) 2017 by Piotr Krysik <ptrkrysik@gmail.com> # # All Rights Reserved @@ -29,6 +29,7 @@ import grgsm from math import pi +from gnuradio import eng_notation from gnuradio import digital from gnuradio import blocks from gnuradio import uhd @@ -59,6 +60,7 @@ class dict_toggle_sign(gr.basic_block): class radio_if(gr.top_block): # PHY specific variables + freq_offset_hz = None rx_freq = 935e6 tx_freq = 890e6 osr = 4 @@ -274,11 +276,21 @@ class radio_if(gr.top_block): return self.ppm / 1.0e6 * 2 * pi * fc / self.sample_rate def set_rx_freq(self, fc): + if self.freq_offset_hz is not None: + fc += self.freq_offset_hz + print("[#] Shifting RX freq. to %s (offset is %s)" + % (eng_notation.num_to_str(fc), + eng_notation.num_to_str(self.freq_offset_hz))) self.phy_src.set_center_freq(fc, 0) self.rotator_src.set_phase_inc(self.calc_phase_inc(fc)) self.rx_freq = fc def set_tx_freq(self, fc): + if self.freq_offset_hz is not None: + fc += self.freq_offset_hz + print("[#] Shifting TX freq. to %s (offset is %s)" + % (eng_notation.num_to_str(fc), + eng_notation.num_to_str(self.freq_offset_hz))) self.phy_sink.set_center_freq(fc, 0) self.rotator_sink.set_phase_inc(-self.calc_phase_inc(fc)) self.tx_freq = fc |