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公式
- A,B是根据功率强度f决定的
- L是路径损耗(dB)
- F是频率(MHz)
- hBS是基站天线高度(m)
- hMS是手机高度(m)
- d是手机和基站的距离(km)
- A,B是根据功率强度f决定的
- 为了进行计算,我们需要知道基站的发射功率、天线增益以及使用的频率。
- 由于这些信息通常不会公开,我们将假设一些标准值:
- 基站的发射功率为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公式
- A,B是根据功率强度f决定的
- L是路径损耗(dB)
- F是频率(MHz)
- hBS是基站天线高度(m)
- hMS是手机高度(m)
- d是手机和基站的距离(km)
- A,B是根据功率强度f决定的
- 为了进行计算,我们需要知道基站的发射功率、天线增益以及使用的频率。
- 由于这些信息通常不会公开,我们将假设一些标准值:
- 基站的发射功率为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 之间
相关文章:
python 笔记 根据用户轨迹+基站位置,估计基站轨迹+RSRP
1 问题描述 已知用户实际的轨迹,和基站的位置,能不能得到用户所连接的基站,以及基站的信号强度RSRP? 1.1 几个假设 这里我们做几个假设: 每个用户有80%的概率连接最近的基站,有20%的概率选择其他的基站连…...
RocketMQ 安装部署及应用场景记录
文章目录 前言一、RocketMQ简介1.1 整体架构 二、RocketMQ安装部署2.1 RocketMQ 下载2.2 修改 JVM 参数2.3 启动 NameServer 和 Broker2.4 验证发送和接受消息2.5 停止 NameServer 和 Broker2.6 配置全局环境 三、RocketMQ应用场景3.1 异步处理3.2 应用解耦3.3 流量削峰 前言 …...
人工智能面面观
人工智能简介 人工智能(Artificial Intelligence,简称AI)是一门研究如何使计算机能够模拟和执行人类智能任务的科学和技术领域。它致力于开发能够感知、理解、学习、推理、决策和与人类进行交互的智能系统。人工智能的背景可以追溯到上世纪50…...
vue-router的使用技巧
一、安装 npm install vue-router 二、引入 main.ts引入 import { createApp } from vue import App from ./App.vue import router from ./routerconst app createApp(App)app.use(router) app.mount(#app)三、定义路由文件 路由的参数 meta添加路由的其他参数 redire…...
CV计算机视觉每日开源代码Paper with code速览-2023.11.21
点击CV计算机视觉,关注更多CV干货 论文已打包,点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构:Transformer】Multi-entity Video Transformers for Fine-Grained Video Representation Learning 论文地址&…...
人工智能对当代生活的影响
人工智能(AI)是指通过模拟人类智能的方式,使机器能够执行某些需要智能的任务。随着技术的快速发展和应用的广泛推广,人工智能已经深入到我们的日常生活中,对我们的生活和社会产生了深远的影响。本文将探讨人工智能对当…...
笔记:如何搭建一套前端监控系统?(持续更新中)
数据敏感处理 数据加密,对涉及用户隐私的数据做到加密防护 独立部署,不和其它应用共享监控系统 不采集具体数据,只采集用户操作数据 错误采集 Runtime Error: JS运行错误,可通过error监听器捕获 load Error: 资源加载错误&#x…...
在 Ubuntu 上安装最新版的 Calibre
目录 前言 方法1:从 Ubuntu 的仓库安装 Calibre 卸载 Calibre 方法2:获取最新版本的 Calibre 卸载 Calibre 结语 前言 Calibre 是一款自由开源的电子书软件。下面介绍如何在 Ubuntu Linux 上安装它。 作为电子书管理的瑞士军刀,Calibre …...
docker基础学习笔记
文章目录 Docker简介Linux下安装DockerDocker常用命令Docker网络Docker存储docker-composedockerfile制作镜像私有仓库镜像导入导出参考 Docker简介 定义:Docker是一个开源的应用容器引擎优势: 一键部署,开箱即用:容器使用基于im…...
Could not resolve all files for configuration ‘:app:androidJdkImage‘.
在使用./gradlew build编译项目时候遇到了该问题,整体错误如下: * What went wrong: Configuration cache state could not be cached: field generatedModuleFile of com.android.build.gradle.tasks.JdkImageInput bean found in field compilerArgumentProvider…...
GLP-1 , GLP-1R
-- 6VCB_GLP-1R G_protein, GLP-1 peptidea positive allosteric modulator...
【数据结构】F : 道路建设 (Ver. I)
F : 道路建设 (Ver. I) Description 有N个村庄,编号从1到N,你应该建造一些道路,使每个村庄都可以相互连接。 两个村A和B是相连的,当且仅当A和B之间有一条道路,或者存在一个村C使得在A和C之间有一条道路,并…...
flutter 无法从H5 WebView 访问摄像头和录音权限
AndroidManifest.xml需要在 中添加以下权限: <uses-permission android:name"android.permission.INTERNET"/> <uses-permission android:name"android.permission.CAMERA" /> <uses-permission android:name"android.per…...
electron27-react-mateos:基于electron+react18仿matePad桌面系统
基于Electron27React18ArcoDesign搭建桌面版OS管理系统。 electron-react-mateos 基于最新前端跨端技术栈electron27.xreact18arco-designzustand4sortablejs构建的一款仿制matePad界面多层级路由管理OS系统。 ElectronReactOS支持桌面多路由配置,新开窗口弹窗开启路…...
高精度算法总结
高精度加法 题目链接: https://www.acwing.com/activity/content/problem/content/825/ 代码模版: #include <iostream> #include <vector>using namespace std;// C A B vector<int> add(vector<int> &A, vector<…...
EMQX-5.3.1单机集群部署并基于Nginx实现负载均衡
本例单机集群部署使用三个节点,分别为node1、node2、node3 一、安装与配置 1 创建数据目录 mkdir -p node1/data node1/logs mkdir -p node2/data node2/logs mkdir -p mode3/data node3/logs 2 数据目录授权 chown 1000 node1/ node2/ node3/ chown 1000 n…...
电商又有大动静,又一短视频进军电商领域!
我是电商珠珠 电商近几年来发展迅速,截止到23年的10月26日,电商零售平台市场份额是淘宝市场占比的53%,京东为20%,拼多多手握15%的市场占比,三者合计份额已经达到了88%。 剩下的抖音、快手、苏宁也在奋力抢占更多。 …...
C语言线性表的链式存储(框架)
线性表的链式存储 线性表的顺序存储:用一块连续的内存空间 线性表的链式存储:不连续的内存空间 链表是由一系列的节点组成,每个节点包含两个域,一个是数据域,一个是指针域 链表的插入和删除原理 单项链表框架的搭建 …...
webpack配置完热更新之后还是会刷新整个页面
可以在webpack文档中找到有关热更新的详细信息,意思就是,开启热更新之后,整个页面你改了哪里,就只更新哪里,其他没变的,或者保存在缓存里面的内容,都不会改变,感谢很神奇!…...
2023年第六届传智杯程序设计挑战赛(个人赛)B组 赛后复盘
传智杯赛后复盘 大家好 我是寸铁👊 2023年第六届传智杯程序设计挑战赛(个人赛)B组 赛后复盘 喜欢的小伙伴可以点点关注 💝 1. 字符串拼接 细节:一定要清楚nextLine()和next()的区别 nextLine()是遇到回车会停下来 nex…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

