Skip to content

Commit

Permalink
apps/grgsm_trx: add baseband frequency shift feature
Browse files Browse the repository at this point in the history
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
  • Loading branch information
axilirator committed Sep 4, 2018
1 parent 840885f commit 97dc84e
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
14 changes: 13 additions & 1 deletion apps/grgsm_trx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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 % (
Expand All @@ -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()
Expand Down Expand Up @@ -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)
Expand Down
14 changes: 13 additions & 1 deletion python/trx/radio_if.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# GR-GSM based transceiver
# Follow graph implementation
#
# (C) 2016-2017 by Vadim Yanitskiy <[email protected]>
# (C) 2016-2018 by Vadim Yanitskiy <[email protected]>
# (C) 2017 by Piotr Krysik <[email protected]>
#
# All Rights Reserved
Expand All @@ -29,6 +29,7 @@

from math import pi

from gnuradio import eng_notation
from gnuradio import digital
from gnuradio import blocks
from gnuradio import uhd
Expand Down Expand Up @@ -59,6 +60,7 @@ def change_sign(self, msg):

class radio_if(gr.top_block):
# PHY specific variables
freq_offset_hz = None
rx_freq = 935e6
tx_freq = 890e6
osr = 4
Expand Down Expand Up @@ -274,11 +276,21 @@ def calc_phase_inc(self, fc):
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
Expand Down

0 comments on commit 97dc84e

Please sign in to comment.