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/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公式
      • 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_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 之间

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在mysql存储过程中间部分,使用游标遍历动态结果集(游标动态传参使用)

mysql游标动态传参实现&#xff08;动态游标&#xff09; 1.问题2.需求描述3.实现3.1.使用3.2.代码&#xff08;直接看这都可以&#xff09; 1.问题 众所周知&#xff0c;mysql存储过程功能是没有oracle的包功能强大的&#xff0c;但是在去O的趋势下&#xff0c;mysql存储过程的…

使用git下载远程所有分支到本地

使用git下载远程所有分支到本地&#xff1a; 打开gitbash 输入以下命令即可&#xff1a; git clone git地址 cd git文件夹 git branch -r | grep -v \-> | while read remote; do git branch --track "${remote#origin/}" "$remote"; done git fetch -…

灭火器二维码巡检卡制作教程

每个消防器材生成独立二维码&#xff0c;取代传统纸质巡检卡&#xff0c;微信扫码巡检&#xff0c;巡检记录汇总后台&#xff0c;随时登录后台查看导出数据&#xff0c;管理人员绑定凡尔码小程序即可随时了解消防巡检完成情况。 生成灭火器巡检码流程图&#xff1a; 1、开通后…

百家号MCN是什么?百家号MCN禁止拉子账号怎么解决?

在当今数字化时代&#xff0c;社交媒体平台已成为人们获取信息、分享观点和创作内容的重要渠道之一。百家号作为百度旗下的自媒体平台&#xff0c;吸引了众多创作者和机构入驻&#xff0c;以分享优质内容并获得收益。在百家号上&#xff0c;MCN矩阵扮演着重要的角色&#xff0c…

目标检测原理

一、什么是目标检测 目标检测的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定他们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状、姿态&#xff0c;再加上光照、遮挡等因素的干扰&#xff0c;目…

如何在Node.js和Express中设置TypeScript(2023年)

如何在Node.js和Express中设置TypeScript&#xff08;2023年&#xff09; 在这篇文章中&#xff0c;我们将介绍在Express应用程序中设置TypeScript的最佳方法&#xff0c;了解与之相关的基本限制。 文章目录 如何在Node.js和Express中设置TypeScript&#xff08;2023年&#x…

RT-DETR 更换损失函数之 SIoU / EIoU / WIoU / Focal_xIoU

文章目录 更换方式CIoUDIoUEIoUGIoUSIoUWIoUFocal_CIoUFocal_DIoUFocal_EIoUFocal_GIoUFocal_SIoU提示更换方式 第一步:将ultralytics/ultralytics/utils/metrics.py文件中的bbox_iou替换为如下的代码:class

图书管理系统源码,图书管理系统开发,图书借阅系统源码三框架设计原理和说明

TuShuManger项目简介和创建 这里一共设计了6个项目,主要是借助三层架构思想分别设计了主要的三层,包括model实体层,Dal数据库操作层,Bll业务调用层,其他有公共使用项目common层,DButitly提取出来的数据库访问层,下面我们分别创建每个项目和开始搭建整个过程 TuShuManger…

第二十一章 解读XML与JSON文件格式(工具)

XML 带分隔符的文件仅有两维的数据&#xff1a;行 & 列。如果我们想在程序之间交换数据结构&#xff0c;需要一种方法把层次结构&#xff0c;序列&#xff0c;集合和其它的数据结构编码成文本。 今天要说的 XML 是最突出的处理上述这种转换的标记格式&#xff0c;它使用标…

【深度学习】如何找到最优学习率

经过了大量炼丹的同学都知道&#xff0c;超参数是一个非常玄乎的东西&#xff0c;比如batch size&#xff0c;学习率等&#xff0c;这些东西的设定并没有什么规律和原因&#xff0c;论文中设定的超参数一般都是靠经验决定的。但是超参数往往又特别重要&#xff0c;比如学习率&a…

Seurat Tutorial 1:标准分析流程,基于 PBMC 3K 数据集

目录 1 设置 Seurat 对象2 标准预处理工作流程 2.1 QC 和选择细胞进行进一步分析3 数据归一化4 识别高变特征&#xff08;特征选择&#xff09;5 标准化数据6 执行线性降维7 确定数据集的维度8 细胞聚类9 运行非线性降维 (UMAP/tSNE)10 寻找差异表达特征&#xff08;cluster b…

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

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

小程序项目:springboot+vue基本微信小程序的宠物领养系统

项目介绍 当今科技发展迅速&#xff0c;交通环境也变得越来越复杂。人们的出行方式变得多元化&#xff0c;这给视障人士带来了一定的困扰。而导盲犬可以帮助视障人士外出行走&#xff0c;提高他们的生活质量。在我国&#xff0c;导盲犬的数量远远少于视障人士的数量。由于导盲…

WPF绘图技术介绍

作者&#xff1a;令狐掌门 技术交流QQ群&#xff1a;675120140 csdn博客&#xff1a;https://mingshiqiang.blog.csdn.net/ 文章目录 WPF绘图基本用法绘制直线在XAML中绘制直线在C#代码中绘制直线使用Path绘制直线注意 矩形绘制在XAML中绘制矩形在C#代码中绘制矩形设置矩形的位…

<JavaEE> Java中线程有多少种状态(State)?状态之间的关系有什么关系?

目录 一、系统内核中的线程状态 二、Java中的线程状态 一、系统内核中的线程状态 状态说明就绪状态线程已经准备就绪&#xff0c;随时可以接受CPU的调度。阻塞状态线程处于阻塞等待&#xff0c;暂时无法在CPU中执行。 二、Java中的线程状态 相比于系统内核&#xff0c;Java…

火锅店管理系统外卖点餐配送小程序的效果

火锅是餐饮行业重要的组成部分&#xff0c;在每个地方都受到追捧&#xff0c;其从业商家众多&#xff0c;头部连锁品牌也不少&#xff0c;近些年行业市场规模也一直增加&#xff0c;而随着消费升级及数字化转型&#xff0c;传统火锅店经营痛点不少&#xff1a; 火锅店的需求非…

智能优化算法应用:基于蚁狮算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蚁狮算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蚁狮算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蚁狮算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

SpringBoot中如何优雅地使用重试

1 缘起 项目中使用了第三方的服务&#xff0c; 第三方服务偶尔会出现不稳定、连接不上的情况&#xff0c; 于是&#xff0c;在调用时为了保证服务的相对高可用&#xff0c;添加了超时连接重试&#xff0c; 当连接第三方服务超时时&#xff0c;多重试几次&#xff0c;比如3次&a…

XML映射文件

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"org.mybatis.example.BlogMapper&q…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-7:软件定时器)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…