aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2018-08-10 05:29:23 +0700
committerVadim Yanitskiy <axilirator@gmail.com>2018-09-05 02:36:08 +0700
commit97dc84e9f37a3d5dffdf81d647301e3b572d7d11 (patch)
tree6b6890ad561bf0342bbe9d3e73cf1ddf1da0e897
parent840885fe3cf08d725ef0ca2f3845ee6ae9ef9712 (diff)
apps/grgsm_trx: add baseband frequency shift feature
An ability to shift the baseband frequency would allow one to run both base stations and (OsmocomBB-based) mobile stations on any frequency (e.g. in 2.4 GHz WiFi band)! This is achieved by adding a given frequency offset to the result of "ARFCN -> RX/TX frequency" calculation. Usage example: grgsm_trx --freq-offset -500M Both RX (Downlink) and TX (Uplink) frequencies will be shifted by 500 MHz back, e.g. tuning request to ARFCN 105 would result in tuning the radio to 456.0 MHz (instead of 956.0 MHz). Related: OS#3520 (https://osmocom.org/versions/136) Change-Id: I42e397e47402a87f4141ef31b25eff4c8c1267e2
-rwxr-xr-xapps/grgsm_trx14
-rw-r--r--python/trx/radio_if.py14
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