当前位置: 首页 > news >正文

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 之间

相关文章:

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

1 问题描述 已知用户实际的轨迹&#xff0c;和基站的位置&#xff0c;能不能得到用户所连接的基站&#xff0c;以及基站的信号强度RSRP&#xff1f; 1.1 几个假设 这里我们做几个假设&#xff1a; 每个用户有80%的概率连接最近的基站&#xff0c;有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 流量削峰 前言 …...

人工智能面面观

人工智能简介 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机能够模拟和执行人类智能任务的科学和技术领域。它致力于开发能够感知、理解、学习、推理、决策和与人类进行交互的智能系统。人工智能的背景可以追溯到上世纪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计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】Multi-entity Video Transformers for Fine-Grained Video Representation Learning 论文地址&…...

人工智能对当代生活的影响

人工智能&#xff08;AI&#xff09;是指通过模拟人类智能的方式&#xff0c;使机器能够执行某些需要智能的任务。随着技术的快速发展和应用的广泛推广&#xff0c;人工智能已经深入到我们的日常生活中&#xff0c;对我们的生活和社会产生了深远的影响。本文将探讨人工智能对当…...

笔记:如何搭建一套前端监控系统?(持续更新中)

数据敏感处理 数据加密&#xff0c;对涉及用户隐私的数据做到加密防护 独立部署&#xff0c;不和其它应用共享监控系统 不采集具体数据&#xff0c;只采集用户操作数据 错误采集 Runtime Error: JS运行错误&#xff0c;可通过error监听器捕获 load Error: 资源加载错误&#x…...

在 Ubuntu 上安装最新版的 Calibre

目录 前言 方法1&#xff1a;从 Ubuntu 的仓库安装 Calibre 卸载 Calibre 方法2&#xff1a;获取最新版本的 Calibre 卸载 Calibre 结语 前言 Calibre 是一款自由开源的电子书软件。下面介绍如何在 Ubuntu Linux 上安装它。 作为电子书管理的瑞士军刀&#xff0c;Calibre …...

docker基础学习笔记

文章目录 Docker简介Linux下安装DockerDocker常用命令Docker网络Docker存储docker-composedockerfile制作镜像私有仓库镜像导入导出参考 Docker简介 定义&#xff1a;Docker是一个开源的应用容器引擎优势&#xff1a; 一键部署&#xff0c;开箱即用&#xff1a;容器使用基于im…...

Could not resolve all files for configuration ‘:app:androidJdkImage‘.

在使用./gradlew build编译项目时候遇到了该问题&#xff0c;整体错误如下: * 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个村庄&#xff0c;编号从1到N&#xff0c;你应该建造一些道路&#xff0c;使每个村庄都可以相互连接。 两个村A和B是相连的&#xff0c;当且仅当A和B之间有一条道路&#xff0c;或者存在一个村C使得在A和C之间有一条道路&#xff0c;并…...

flutter 无法从H5 WebView 访问摄像头和录音权限

AndroidManifest.xml需要在 中添加以下权限&#xff1a; <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支持桌面多路由配置&#xff0c;新开窗口弹窗开启路…...

高精度算法总结

高精度加法 题目链接&#xff1a; https://www.acwing.com/activity/content/problem/content/825/ 代码模版&#xff1a; #include <iostream> #include <vector>using namespace std;// C A B vector<int> add(vector<int> &A, vector<…...

EMQX-5.3.1单机集群部署并基于Nginx实现负载均衡

本例单机集群部署使用三个节点&#xff0c;分别为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…...

电商又有大动静,又一短视频进军电商领域!

我是电商珠珠 电商近几年来发展迅速&#xff0c;截止到23年的10月26日&#xff0c;电商零售平台市场份额是淘宝市场占比的53%&#xff0c;京东为20%&#xff0c;拼多多手握15%的市场占比&#xff0c;三者合计份额已经达到了88%。 剩下的抖音、快手、苏宁也在奋力抢占更多。 …...

C语言线性表的链式存储(框架)

线性表的链式存储 线性表的顺序存储&#xff1a;用一块连续的内存空间 线性表的链式存储&#xff1a;不连续的内存空间 链表是由一系列的节点组成&#xff0c;每个节点包含两个域&#xff0c;一个是数据域&#xff0c;一个是指针域 链表的插入和删除原理 单项链表框架的搭建 …...

webpack配置完热更新之后还是会刷新整个页面

可以在webpack文档中找到有关热更新的详细信息&#xff0c;意思就是&#xff0c;开启热更新之后&#xff0c;整个页面你改了哪里&#xff0c;就只更新哪里&#xff0c;其他没变的&#xff0c;或者保存在缓存里面的内容&#xff0c;都不会改变&#xff0c;感谢很神奇&#xff01…...

2023年第六届传智杯程序设计挑战赛(个人赛)B组 赛后复盘

传智杯赛后复盘 大家好 我是寸铁&#x1f44a; 2023年第六届传智杯程序设计挑战赛&#xff08;个人赛&#xff09;B组 赛后复盘 喜欢的小伙伴可以点点关注 &#x1f49d; 1. 字符串拼接 细节&#xff1a;一定要清楚nextLine()和next()的区别 nextLine()是遇到回车会停下来 nex…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...