utils: Import some utilities to actually receive and process signals

This includes an utility to easily identify what ARFCNs are visible in
a given capture made by osmocom_fft and a utility to do live captures
using GNURadio.

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
This commit is contained in:
Sylvain Munaut 2016-09-14 07:04:28 -06:00
parent 90526bca2e
commit f5bdb26c94
2 changed files with 1240 additions and 0 deletions

118
utils/gmr1_process_recording.py Executable file
View File

@ -0,0 +1,118 @@
#!/usr/bin/env python
#
# (C) 2011-2019 by Sylvain Munaut <tnt@246tNt.com>
# All Rights Reserved
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
from collections import namedtuple
import datetime
import os
import sys
import re
EXEC_GMR1_DEMOD = 'gmr1_rx_live'
EXEC_GMR1_SPLIT = 'gmr1_rx_sdr.py'
CHAN_BW = 31.25e3
Recording = namedtuple('Recording', 'center samplerate timestamp')
def parse_filename(fn):
m = re.match('^.*-f([0-9\.e+-]*)-s([0-9\.e+-]*)-t([0-9]{14})\.cfile$', fn)
if not m:
return m
return Recording(
float(m.group(1)),
float(m.group(2)),
datetime.datetime.strptime(m.group(3), '%Y%m%d%H%M%S'),
)
def arfcn_to_freq(arfcn, band='L'):
base = {
'L': 1525e6,
'S': 2170e6 + 15.625e3,
}
return base[band] + 31.25e3 * arfcn
def arfcn_fifo(arfcn):
return "/tmp/arfcn_%d.cfile" % arfcn
def main(argv0, capture_fn):
# Parse filename
p = parse_filename(capture_fn)
# Derive upper and lower band
ll = p.center - p.samplerate / 2 + CHAN_BW
ul = p.center + p.samplerate / 2 - CHAN_BW
# Select band
band = 'S' if ul > 2e9 else 'L'
n_arfcns = {
'L': 1087,
'S': 960,
}
# List all visible arfcns
visible_arfcns = [x for x in range(0,n_arfcns[band]+1) if ll <= arfcn_to_freq(x, band) <= ul]
# Create all FIFOs
#for arfcn in visible_arfcns:
# if os.path.exists(arfcn_fifo(arfcn)):
# print "Output FIFO already exists, aborting !"
# return -1
#for arfcn in visible_arfcns:
# os.mkfifo(arfcn_fifo(arfcn))
#
exec_split = [
EXEC_GMR1_SPLIT,
'-s', '%f' % p.samplerate,
'-f', '%f' % p.center,
'-B', band,
'--args', 'file=%s,freq=%f,rate=%f,throttle=false,repeat=false' % (capture_fn, p.center, p.samplerate),
]
for arfcn in visible_arfcns:
exec_split.extend(['-a', '%d' % arfcn])
print ' '.join(exec_split)
#
exec_rx = [
EXEC_GMR1_DEMOD, '4',
]
for arfcn in visible_arfcns:
exec_rx.append('%d:%s' % (arfcn, arfcn_fifo(arfcn)))
print ' '.join(exec_rx)
# Cleanup all FIFOs
#for arfcn in visible_arfcns:
# os.unlink(arfcn_fifo(arfcn))
if __name__ == '__main__':
main(*sys.argv)

1122
utils/gmr1_rx_sdr.py Executable file

File diff suppressed because it is too large Load Diff