1 问题描述
已知用户实际的轨迹,和基站的位置,能不能得到用户所连接的基站,以及基站的信号强度RSRP?
1.1 几个假设
这里我们做几个假设:
- 每个用户有80%的概率连接最近的基站,有20%的概率选择其他的基站连接
- 其他的基站不会太远离用户的位置,用户300m内的某个基站
- 至于计算RSRP:
- 而路径距离,这里我们采用‘Urban Area Path loss Propagation Prediction and Optimisation Using Hata Model at 800MHz’论文里面提及的Okumura-Hata公式
-
- A,B是根据功率强度f决定的
- L是路径损耗(dB)
- F是频率(MHz)
- hBS是基站天线高度(m)
- hMS是手机高度(m)
- d是手机和基站的距离(km)
- A,B是根据功率强度f决定的
-
- 而路径距离,这里我们采用‘Urban Area Path loss Propagation Prediction and Optimisation Using Hata Model at 800MHz’论文里面提及的Okumura-Hata公式
- 为了进行计算,我们需要知道基站的发射功率、天线增益以及使用的频率。
- 由于这些信息通常不会公开,我们将假设一些标准值:
- 基站的发射功率为35瓦
- 天线增益为10dBi
- 用户设备的天线增益为0dBi
- 使用的频率为2.1GHz(2100MHz)
- 天线高度 30m
- 手机高度 1.6m
- 这些都是典型的值,但在实际情况中可能会有所不同。
- 由于这些信息通常不会公开,我们将假设一些标准值:
2 找寻基站轨迹
from scipy.spatial.distance import cdist
from sklearn.neighbors import KDTree
import numpy as np
import pandas as pd
2.1 读取基站轨迹数据
- 公开的数据,可以通过OpenCellID的数据处理而得
一下是一个人为伪造模型的数据
2.1.1 读取数据
cell=pd.read_csv('celltable.csv')
cell
2.1.2 筛选基站+Cell ID去重
cell=cell[cell['Network System']=='LTE']
cell
cell=cell.drop_duplicates(subset='Cell ID',keep='first')
cell
2.2 将经纬度转化成Web Mercator坐标
2.2.1 经纬度至Web墨卡托 转化方法
地理知识:墨卡托坐标系-CSDN博客
def lonlat_to_Mercator_(lon,lon_y):
x=lon*20037508.34/180
y=math.log(math.tan((90 + lon_y) * math.pi / 360)) / (math.pi / 180)
y=y*20037508.34/180
return x,y
def Webmercater2latlon(mer_x,mer_y):
lon_x=mer_x/20037508.34*180
lon_y=mer_y/20037508.34*180
lon_y=180/math.pi*(2*math.atan(math.exp(lon_y*math.pi/180))-math.pi/2)
return(lon_x,lon_y)
2.2.2 cell中的经纬度转化成Web墨卡托
cell['mer_x'],cell['mer_y']=zip(*cell.apply(lambda row:lonlat_to_Mercator_(row['Longitude'],row['Latitude']),axis=1))
cell=cell[['Cell ID','mer_x','mer_y','Site Name','Site Address']]
cell
2.2.3 去除重复位置
cell=cell.drop_duplicates(['mer_x','mer_y'])
cell
2.2.4 根据基站的墨卡托坐标创建KD树
# Extract the relevant data for the KD Tree (Web Mercator X and Y coordinates)
lte_cells_mercator = cell[['mer_x','mer_y']].values
lte_cells_mercator
'''
array([[11562113.25547015, 145284.49757409],
[11547895.59195217, 148544.54957278],
[11560513.65623184, 153805.87319286],
...,
[11543354.99361167, 149843.63229047],
[11557325.28048347, 144718.47725593],
[11557490.7136156 , 139442.78908455]])
'''
tree_mercator = KDTree(lte_cells_mercator)
3 读取用户轨迹
人为给定一条
user_points = np.array([
[1.342520, 103.681236],
[1.342196, 103.679179],
[1.340511, 103.682740],
[1.343717, 103.686724],
[1.346773, 103.690370],
[1.343203, 103.692289],
[1.338421, 103.695795],
[1.337798, 103.696571],
[1.340250, 103.705373],
[1.338572, 103.704885],
[1.339684, 103.705642],
[1.338408, 103.706127],
[1.344021, 103.720346],
[1.344426, 103.722062],
[1.341786, 103.722293],
[1.341259, 103.725101],
[1.339582, 103.727067],
[1.338587, 103.725448]
])
3.1 用户轨迹转化为Web墨卡托轨迹
user_locations_mercator =[lonlat_to_Mercator_(lon,lat) for lat,lon in user_points]
user_locations_mercator
'''
[(11541742.394730601, 149462.31994029254),
(11541513.410538072, 149426.24252432864),
(11541909.819244731, 149238.61776834572),
(11542353.31609599, 149595.60599074847),
(11542759.186959365, 149935.8921435887),
(11542972.809062168, 149538.372039615),
(11543363.095196836, 149005.89644030613),
(11543449.47912168, 148936.52547995208),
(11544429.313279504, 149209.55542897113),
(11544374.989368005, 149022.71027123014),
(11544459.258222522, 149146.5313626564),
(11544513.24817555, 149004.44889199687),
(11546096.100014921, 149629.456426657),
(11546287.124261094, 149674.5532310448),
(11546312.839063464, 149380.58901097745),
(11546625.424193569, 149321.90755505234),
(11546844.278312437, 149135.1736702744),
(11546664.05205687, 149024.38051939345)]
'''
4 找到用户连接的基站
connected_cells_mercator= pd.DataFrame()
#用户对应的基站 DataFrame
probability_nearest=0.8
#多少比例的数据
radius=300
#距离用户多近的基站可以被考虑
for location_mercator in user_locations_mercator:
#对于用户轨迹的每一个点
dist_mercator, ind_mercator = tree_mercator.query([location_mercator], k=1)
#通过基站的KD树找到距离用户最近的基站的id
nearest_cell_mercator = cell.iloc[ind_mercator[0]]
#id对应的那一行基站
if np.random.random() <= probability_nearest:
#比0.8小——就是最近的基站,比0.8大——从300m内的基站中选一个
if(len(connected_cells_mercator)==0):
connected_cells_mercator=nearest_cell_mercator
else:
connected_cells_mercator=pd.concat([connected_cells_mercator,nearest_cell_mercator])
#基站对应的那一行加入返回的DataFrame中
else:
indices_mercator = tree_mercator.query_radius([location_mercator], r=radius)[0]
#找到距离用户300m内的所有基站,按照从近到远排序
indices_mercator = indices_mercator[indices_mercator != ind_mercator[0]]
#剔除最近的基站
if len(indices_mercator) == 0:
#len(indices_mercator) == 0,表示300m内只有最近的基站这一个基站
if(len(connected_cells_mercator)==0):
connected_cells_mercator=nearest_cell_mercator
else:
connected_cells_mercator=pd.concat([connected_cells_mercator,nearest_cell_mercator])
else:
random_cell_index_mercator = np.random.choice(indices_mercator)
#随机地选择一个其他基站
random_cell_mercator = cell.iloc[np.array([random_cell_index_mercator])]
if(len(connected_cells_mercator)==0):
connected_cells_mercator=random_cell_mercator
else:
connected_cells_mercator=pd.concat([connected_cells_mercator,random_cell_mercator])
#connected_cells_mercator.append(random_cell_mercator)
connected_cells_mercator
4.1 基站轨迹从墨卡托坐标转化为经纬度
connected_cells_mercator['lon'],connected_cells_mercator['lat']=zip(*connected_cells_mercator.apply(lambda row:Webmercater2latlon(row['mer_x'],row['mer_y']),axis=1))
connected_cells_mercator
5 可视化用户轨迹和对应的基站轨迹
connected_cells=connected_cells_mercator[['lat','lon']].values
import folium
m=folium.Map(location=[1.341505, 103.682498],
zoom_start=14)
for i in range(len(connected_cells)):
folium.Marker(connected_cells[i],
icon=folium.Icon(icon='wifi',
prefix='fa',
color='red',
icon_color='yellow')).add_to(m)
for i in range(len(user_points)):
folium.Marker(user_points[i],
icon=folium.Icon(icon='phone',
prefix='fa',
color='green',
icon_color='blue')).add_to(m)
folium.PolyLine(user_points,color='green').add_to(m)
folium.PolyLine(connected_cells,color='red').add_to(m)
m
6 估算RSRP
6.1 假设和原理(回顾)
- 计算RSRP:
- 而路径距离,这里我们采用‘Urban Area Path loss Propagation Prediction and Optimisation Using Hata Model at 800MHz’论文里面提及的Okumura-Hata公式
-
- A,B是根据功率强度f决定的
- L是路径损耗(dB)
- F是频率(MHz)
- hBS是基站天线高度(m)
- hMS是手机高度(m)
- d是手机和基站的距离(km)
- A,B是根据功率强度f决定的
-
- 而路径距离,这里我们采用‘Urban Area Path loss Propagation Prediction and Optimisation Using Hata Model at 800MHz’论文里面提及的Okumura-Hata公式
- 为了进行计算,我们需要知道基站的发射功率、天线增益以及使用的频率。
- 由于这些信息通常不会公开,我们将假设一些标准值:
- 基站的发射功率为35瓦
- 天线增益为10dBi
- 用户设备的天线增益为0dBi
- 使用的频率为2.1GHz(2100MHz)
- 天线高度 30m
- 手机高度 1.6m
- 这些都是典型的值,但在实际情况中可能会有所不同。
- 由于这些信息通常不会公开,我们将假设一些标准值:
6.2 参数设置
transmit_power_dbm = 35 # 基站的发射功率
antenna_gain_dbi = 10 # 天线增益
device_gain_dbi = 0 # 用户设备的天线增益
frequency_hz = 2100 # 使用的频率
speed_of_light = 3e8 # 光速
antenna_h=30 #基站天线高度
antenna_u=1.6 #手机高度
6.3 计算路径损失的函数
def calclate_pl(distance_m,freq_mhz):
path_loss=46.3+39.9*math.log10(freq_mhz)
path_loss-=13.82*math.log10(antenna_h)
path_loss-=(3.2*((math.log10(11.75*antenna_u))**2)-4.97)
path_loss+=(44.5-6.55*math.log10(antenna_h))*math.log10(distance_m/1000)
return path_loss
6.4 计算rsrp的函数
def calculate_rsrp(fspl_db, transmit_power_dbm, antenna_gain_dbi, device_gain_dbi):
rsrp_dbm = transmit_power_dbm + antenna_gain_dbi + device_gain_dbi - fspl_db
return rsrp_dbm
6.5 计算每一个用户点的RSRP
connected_cells_mercator_value=connected_cells_mercator[['mer_x','mer_y']].values
rsrp_values = []
for user_location_mercator, connected_cell in zip(user_locations_mercator, connected_cells_mercator_value):
#迭代每一个用户位置,和对应的基站位置
distance_x = user_location_mercator[0] - connected_cell[0]
distance_y = user_location_mercator[1] - connected_cell[1]
distance_m = np.sqrt(distance_x**2 + distance_y**2)
#计算每一个用户位置和基站位置的距离
fspl_db = calclate_pl(distance_m, frequency_hz)
#计算相应的路径损失
rsrp_dbm = calculate_rsrp(fspl_db, transmit_power_dbm, antenna_gain_dbi, device_gain_dbi)
#计算相应的RSRP
rsrp_values.append(rsrp_dbm)
connected_cells_mercator['rsrp']=rsrp_values
connected_cells_mercator
一般来说RSRP的取值为:
- Excellent Signal: -44 dBm to -80 dBm
- Good Signal: -81 dBm to -90 dBm
- Fair Signal: -91 dBm to -100 dBm
- Poor Signal: -101 dBm to -110 dBm
- Very Poor Signal: -111 dBm to -120 dBm
- No Signal: -121 dBm to -140 dBm
可以看到大部分信号都在excellent 和good 之间