python 笔记 根据用户轨迹+基站位置,估计基站轨迹+RSRP

1 问题描述

已知用户实际的轨迹,和基站的位置,能不能得到用户所连接的基站,以及基站的信号强度RSRP?

1.1 几个假设

这里我们做几个假设:

  • 每个用户有80%的概率连接最近的基站,有20%的概率选择其他的基站连接
    • 其他的基站不会太远离用户的位置,用户300m内的某个基站
  • 至于计算RSRP:
    • 而路径距离,这里我们采用‘Urban Area Path loss Propagation Prediction and Optimisation Using Hata Model at 800MHz’论文里面提及的Okumura-Hata公式
      • L=A+B\log_{10}(f)-13.82\log_{10}(h_{BS})-a(h_{MS})+[44.9-6.55\log_{10}(h_{BS})]\log_{10}d
        • A,B是根据功率强度f决定的
        • L是路径损耗(dB)
        • F是频率(MHz)
        • hBS是基站天线高度(m)
        • hMS是手机高度(m)
        • d是手机和基站的距离(km)
  • 为了进行计算,我们需要知道基站的发射功率、天线增益以及使用的频率。
    • 由于这些信息通常不会公开,我们将假设一些标准值:
      • 基站的发射功率为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/180y=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*180lon_y=mer_y/20037508.34*180lon_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树找到距离用户最近的基站的idnearest_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_mercatorelse: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_mercatorelse: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_mercatorelse: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 foliumm=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公式
      • L=A+B\log_{10}(f)-13.82\log_{10}(h_{BS})-a(h_{MS})+[44.9-6.55\log_{10}(h_{BS})]\log_{10}d
        • A,B是根据功率强度f决定的
        • L是路径损耗(dB)
        • F是频率(MHz)
        • hBS是基站天线高度(m)
        • hMS是手机高度(m)
        • d是手机和基站的距离(km)
  • 为了进行计算,我们需要知道基站的发射功率、天线增益以及使用的频率。
    • 由于这些信息通常不会公开,我们将假设一些标准值:
      • 基站的发射功率为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_dbreturn 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)#计算相应的RSRPrsrp_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 之间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4/5G互操作 EPSFB讲解

今天我们来讲一下4/5G之间之间互操作&#xff0c;以及5G的EPSFB是基于什么实现的~ 目录 4/5G互操作 重选 切换 基于覆盖的切换 基于业务的切换 两个面试问题 想要加快4G切换5G的速度&#xff0c;调哪个参数怎么调高效&#xff1f; 想要减慢5G切换4G的速度调哪个参数怎…

2018年5月23日 Go生态洞察:更新Go行为准则

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

knime 中没有column expressions,怎么下载

knime 中没有column expressions&#xff0c;怎么下载 1、打开view&#xff0c;然后找到knime hub&#xff0c;column expression 2、往里面拖动&#xff0c;就可以安装了 3、然后会出现重启&#xff0c;搜索就可以出现啦

【SpringCloud】从单体架构到微服务架构

今天来看看架构的演变过程 一、单体架构 从图中可以看到&#xff0c;所有服务耦合在一起&#xff0c;数据库存在单点&#xff0c;一旦其中一个服务出现问题时&#xff0c;整个工程都需要重新发布&#xff0c;从而导致整个业务不能提供响应 这种架构对于小项目而言是没有什么…

OSG编程指南<十二>:OSG二三维文字创建及文字特效

1、字体基础知识 适当的文字信息对于显示场景信息是非常重要的。在 OSG 中&#xff0c;osgText提供了向场景中添加文字的强大功能&#xff0c;由于有第三方插件 FreeType 的支持&#xff0c;它完全支持TrueType 字体。很多人可能对 FreeType 和 TrueType 还不太了解&#xff0c…

【AUTOSAR】【通信栈】ComXf

AUTOSAR专栏——总目录_嵌入式知行合一的博客-CSDN博客文章浏览阅读292次。本文主要汇总该专栏文章,以方便各位读者阅读。https://xianfan.blog.csdn.net/article/details/132072415 目录 一、概述 二、限制说明

深度学习第3天:CNN卷积神经网络

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​ 文章目录 介绍 CNN的主要结构 卷积层 激励层 池化层 Kears搭建CNN 搭建代码 直观感受卷积的作用 结语 介绍 卷积神经网络&#xff08;Convol…

vs2019中出现Debug Error的原因

一般出现这种错误表示你的某个变量没有正确赋值&#xff0c;或者说本身在你的C程序中加了assert断言&#xff0c;assert的作用是先计算表达式expression,如果其值为假&#xff0c;那么它会打印一条错误信息 #include<assert.h> void assert(int expression); 例子&…

新手如何对一个web网页进行一次渗透测试

新手如何对一个web网页进行一次渗透测试 文章目录 新手如何对一个web网页进行一次渗透测试什么是渗透测试?渗透测试和红蓝对抗的区别那么拿到一个网站后如何进行一次优雅的渗透测试呢 什么是渗透测试? 在获得web服务运营的公司书面授权的情况下&#xff0c;模拟攻击者的行为…

JAVA - 阻塞队列

一、什么是堵塞队列 堵塞队列&#xff08;Blocking Queue&#xff09;是一种特殊类型的队列&#xff0c;它具有一些特定的行为和限制。在堵塞队列中&#xff0c;当队列为空时&#xff0c;尝试从队列中取出元素的操作将会被阻塞&#xff0c;直到队列中有可用元素&#xff1b;当…

windows运行Pangolin应用填坑心得——如何在window应用轻量级opengl软件Pangolin库显示3D界面及窗口

目录 0、前言1、最有效的安装打开方式准备工作安装git安装vcpkg&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装&#xff08;3&#xff09;集成至vs 安装cmake 安装pangolin 2、应用实例c工程&#xff08;1&#xff09;vs创建新工程&#xff08;2&#xff09;新工…

哈希思想的应用

目录 1.位图 位图的实现 题目变形一 题目变形二 题目变形三 总结&#xff1a; 2.布隆过滤器 概念 布隆过滤器的实现 3.哈希切割的思想 1.位图 哈希表和位图是数据结构中常用的两种技术。哈希表是一种数据结构&#xff0c;通过哈希函数把数据和位置进行映射&#xff0c…

前缀和+哈希表——525. 连续数组

文章目录 ⛏1. 题目&#x1f5e1;2. 算法原理⚔解法一&#xff1a;暴力枚举⚔解法二&#xff1a;前缀和哈希表 ⚒3. 代码实现 ⛏1. 题目 题目链接&#xff1a;525. 连续数组 - 力扣&#xff08;LeetCode&#xff09; 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最…

SQL Server秘籍:数据分隔解密,数据库处理新境界!

点击上方蓝字关注我 在数据数据过程中经常会遇到数据按照一定字符进行拆分&#xff0c;而在不同版本的SQL SERVER数据库中由于包含的函数不同&#xff0c;处理的方式也不一样。本文将列举2个版本的数据库中不同的处理方法。 1. 使用 XML 方法 在SQL SERVER 2016版本之前&#x…

中东客户亲临广东育菁装备参观桌面型数控机床生产

近日&#xff0c;中东地区的一位重要客户在广东育菁装备有限公司的热情接待下&#xff0c;深入了解了该公司生产的桌面型数控机床。这次会面不仅加强了双方在业务领域的交流&#xff0c;也为中国与中东地区的经济合作描绘出更美好的前景。 在育菁装备公司各部门主要负责人及工作…

2018年2月26日 Go生态洞察:2017年Go用户调查结果分析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

手机技巧:安卓微信8.0.44测试版功能介绍

目录 一、更新介绍 二、功能更新介绍 拍一拍撤回功能 聊天设置界面文案优化 关怀模式新增了非常实用的安静模式 微信设置中新增翻译设置选项 近期腾讯官方终于发布了安卓微信8.0.44测试版&#xff0c;今天小编继续给大家介绍一个本次安卓微信8.0.44测试版本更新的内容&am…

《大话设计模式》(持续更新中)

《大话设计模式》 序 为什么要学设计模式第0章 面向对象基础什么是对象&#xff1f;什么是类&#xff1f;什么是构造方法&#xff1f;什么是重载&#xff1f;属性与字段有什么区别&#xff1f;什么是封装&#xff1f;什么是继承&#xff1f;什么是多态&#xff1f;抽象类的目的…

字符串原地旋转

记录一下做的练习题 字符串原地旋转&#xff1a;五 三 mat [[1,2,3],[3,4,5],[4,5,6]] tag0 total 0 for i in mat:total total i[tag]tag 1 print(total) 四 X [[12,7,3],[4,5,6],[7,8,9]] Y [[5,8,1],[6,7,3],[4,5,9]] res [[0,0,0],[0,0,0],[0,0,0]] for i in rang…

如何快速搭建一个大模型?简单的UI实现

&#x1f525;博客主页&#xff1a;真的睡不醒 &#x1f680;系列专栏&#xff1a;深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 &#x1f498;每日语录&#xff1a;相信自己&#xff0c;一路风景一路歌&#xff0c;人生之美&#xff0c;正在于…