diff options
author | Roman Khassraf <roman@khassraf.at> | 2016-09-23 07:23:05 +0200 |
---|---|---|
committer | Roman Khassraf <roman@khassraf.at> | 2016-09-23 07:23:05 +0200 |
commit | fb772f8228023ed47ad2870ada8405c725752961 (patch) | |
tree | 44392024eeda4c33525df337332e32b0ffe2af89 /python/misc_utils | |
parent | 385a606119ce43fd575c604717463f1453625c46 (diff) |
#154: fix for arfcn conversion
Diffstat (limited to 'python/misc_utils')
-rw-r--r-- | python/misc_utils/arfcn.py | 134 |
1 files changed, 75 insertions, 59 deletions
diff --git a/python/misc_utils/arfcn.py b/python/misc_utils/arfcn.py index e7edfb5..8836501 100644 --- a/python/misc_utils/arfcn.py +++ b/python/misc_utils/arfcn.py @@ -23,19 +23,19 @@ import collections - -# first uplink freq, first arfcn, last arfcn, downlink frequence distance +# first uplink freq, distance between uplink/downlink frequency, list of range tuple +# each tuple in a range tuple contains: first arfcn of the range, last arfcn of the range, offset of the range # entries are ordered by relevance __band_conf = collections.OrderedDict([ - ('P-GSM', {'first_freq': 890.2e6, 'first_arfcn': 1, 'last_arfcn': 124, 'downlink_dist': 45e6}), - ('DCS1800', {'first_freq': 1710.2e6, 'first_arfcn': 512, 'last_arfcn': 885, 'downlink_dist': 95e6}), - ('PCS1900', {'first_freq': 1850.2e6, 'first_arfcn': 512, 'last_arfcn': 810, 'downlink_dist': 80e6}), - ('E-GSM', {'first_freq': 880.2e6, 'first_arfcn': 975, 'last_arfcn': 1023, 'downlink_dist': 45e6}), - ('R-GSM', {'first_freq': 876.2e6, 'first_arfcn': 955, 'last_arfcn': 1023, 'downlink_dist': 45e6}), - ('GSM450',{'first_freq': 450.6e6, 'first_arfcn': 259, 'last_arfcn': 293, 'downlink_dist': 10e6}), - ('GSM480', {'first_freq': 479e6, 'first_arfcn': 306, 'last_arfcn': 340, 'downlink_dist': 10e6}), - ('GSM850', {'first_freq': 824.2e6, 'first_arfcn': 128, 'last_arfcn': 251, 'downlink_dist': 45e6}) - ]) + ('P-GSM', {'f_start': 890.0e6, 'distance': 45e6, 'ranges': [(1, 124, 0)]}), + ('DCS1800', {'f_start': 1710.2e6, 'distance': 95e6, 'ranges': [(512, 885, 512)]}), + ('PCS1900', {'f_start': 1850.2e6, 'distance': 80e6, 'ranges': [(512, 810, 512)]}), + ('E-GSM', {'f_start': 890.0e6, 'distance': 45e6, 'ranges': [(0, 124, 0), (975, 1023, 1024)]}), + ('R-GSM', {'f_start': 890.0e6, 'distance': 45e6, 'ranges': [(0, 124, 0), (955, 1023, 1024)]}), + ('GSM450', {'f_start': 450.6e6, 'distance': 10e6, 'ranges': [(259, 293, 259)]}), + ('GSM480', {'f_start': 479e6, 'distance': 10e6, 'ranges': [(306, 340, 306)]}), + ('GSM850', {'f_start': 824.2e6, 'distance': 45e6, 'ranges': [(128, 251, 128)]}), +]) __chan_spacing = 2e5 @@ -44,34 +44,17 @@ def get_bands(): return __band_conf.keys() -def get_first_arfcn(band): - """ - Returns the first arfcn (i.e. the one with the lowest number) in the given band. - """ - if band in __band_conf: - conf = __band_conf.get(band) - return conf['first_arfcn'] - - -def get_last_arfcn(band): - """ - Returns the last arfcn (i.e. the one with the highest number) in the given band - """ - if band in __band_conf: - conf = __band_conf.get(band) - return conf['last_arfcn'] - - def is_valid_arfcn(arfcn, band): """ Returns True if arfcn is valid in the given band, else False """ if band in __band_conf: conf = __band_conf.get(band) - first_arfcn = conf['first_arfcn'] - last_arfcn = conf['last_arfcn'] - if first_arfcn <= arfcn <= last_arfcn: - return True + for arfcn_range in conf['ranges']: + arfcn_start = arfcn_range[0] + arfcn_end = arfcn_range[1] + if arfcn_start <= arfcn <= arfcn_end: + return True return False @@ -79,49 +62,63 @@ def is_valid_uplink(freq, band): """ Returns True if the given frequency is a valid uplink frequency in the given band """ + result = None if band in __band_conf: conf = __band_conf.get(band) - first_freq = arfcn2uplink(conf['first_arfcn'], band) - last_freq = arfcn2uplink(conf['last_arfcn'], band) - if first_freq is None or last_freq is None: - return False - if first_freq <= freq <= last_freq: - return True - return False + result = False + for arfcn_range in conf['ranges']: + arfcn_start = arfcn_range[0] + arfcn_end = arfcn_range[1] + first_freq = arfcn2uplink(arfcn_start, band) + last_freq = arfcn2uplink(arfcn_end, band) + if first_freq is None or last_freq is None: + result = False + elif first_freq <= freq <= last_freq: + result = True + return result def is_valid_downlink(freq, band): """ Returns True if the given frequency is a valid downlink frequency in the given band """ + result = None if band in __band_conf: conf = __band_conf.get(band) - first_freq = arfcn2downlink(conf['first_arfcn'], band) - last_freq = arfcn2downlink(conf['last_arfcn'], band) - if first_freq is None or last_freq is None: - return False - if first_freq <= freq <= last_freq: - return True - return False + result = False + for arfcn_range in conf['ranges']: + arfcn_start = arfcn_range[0] + arfcn_end = arfcn_range[1] + first_freq = arfcn2downlink(arfcn_start, band) + last_freq = arfcn2downlink(arfcn_end, band) + if first_freq is None or last_freq is None: + result = False + elif first_freq <= freq <= last_freq: + result = True + return result def arfcn2uplink(arfcn, band): if band in __band_conf and is_valid_arfcn(arfcn, band): - conf = __band_conf.get(band) - freq_start = conf['first_freq'] - offset = conf['first_arfcn'] - # if (band == 'E-GSM' or band == 'R-GSM') and arfcn > 124: - # offset = 1024 - f = freq_start + (__chan_spacing * (arfcn - offset)) - return round(f, 1) + f_start = conf['f_start'] + offset = None + for arfcn_range in conf['ranges']: + arfcn_start = arfcn_range[0] + arfcn_end = arfcn_range[1] + if arfcn_start <= arfcn <= arfcn_end: + offset = arfcn_range[2] + + if offset is not None: + f = f_start + (__chan_spacing * (arfcn - offset)) + return round(f, 1) return None def arfcn2downlink(arfcn, band): if band in __band_conf and is_valid_arfcn(arfcn, band): conf = __band_conf.get(band) - distance = conf['downlink_dist'] + distance = conf['distance'] return round(arfcn2uplink(arfcn, band) + distance, 1) return None @@ -129,16 +126,35 @@ def arfcn2downlink(arfcn, band): def uplink2arfcn(freq, band): if band in __band_conf and is_valid_uplink(freq, band): conf = __band_conf.get(band) - freq_start = conf['first_freq'] - offset = conf['first_arfcn'] - return int(round(offset + ((freq - freq_start) / __chan_spacing), 0)) + f_start = conf['f_start'] + offset = None + for arfcn_range in conf['ranges']: + arfcn_start = arfcn_range[0] + arfcn_end = arfcn_range[1] + offset = arfcn_range[2] + arfcn = int(round(offset + ((freq - f_start) / __chan_spacing), 0)) + if arfcn_start <= arfcn <= arfcn_end: + return arfcn return None def downlink2arfcn(freq, band): if band in __band_conf and is_valid_downlink(freq, band): conf = __band_conf.get(band) - distance = conf['downlink_dist'] + distance = conf['distance'] freq_uplink = freq - distance return int(round(uplink2arfcn(freq_uplink, band), 0)) return None + + +def get_arfcn_ranges(band): + """ + Returns a list of arfcn tuples, each with first and last arfcn of the range. + """ + result = [] + if band in __band_conf: + conf = __band_conf.get(band) + for arfcn_range in conf['ranges']: + arfcn_tuple = (arfcn_range[0], arfcn_range[1]) + result.append(arfcn_tuple) + return result |