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:
parent
90526bca2e
commit
f5bdb26c94
|
@ -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)
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue