科研记录2.2 python处理CSI信号

目标:脱离CSI信号总用MATLAB进行处理分析,改为用Python

一、python调用Matlab的脚本和函数文件

1、liunux下安装MATLAB
参考:
https://blog.csdn.net/m0_37775034/article/details/80876362?spm=1001.2014.3001.5501
2、两步解决python调用Matlab的脚本和函数文件
参考:
http://blog.csdn.net/sunny_xsc1994/article/details/79254196
用于 Python 的 MATLAB 引擎 API :
注:帮助文档网址:
https://ww2.mathworks.cn/help/matlab/matlab-engine-for-python.html?s_tid=CRUX_lftnav

1、检查您的系统是否具有受支持的 Python 版本和 MATLAB R2014b 或更新版本。有关详细信息,请参阅 MATLAB 产品(按版本)所支持的 Python 版本。
2、找到 MATLAB 文件夹的路径。启动 MATLAB,并在命令行窗口中键入 matlabroot。复制 matlabroot 所返回的路径PATH。
3、安装引擎 API
要安装引擎 API,请选择以下选项之一。您必须在指定的文件夹中调用此 python 安装命令。
1)在 Windows 操作系统提示符下(您可能需要管理员特权才能执行这些命令)-

cd "PATH\extern\engines\python"
python3 setup.py install

2)在 macOS 或 Linux 操作系统提示符下(您可能需要管理员特权才能执行这些命令)-

(venv) zhutao@zhutao-B360M-POWER:~/PycharmProjects/pythonProject$ cd /usr/local/MATLAB/R2018a/extern/engines/python
(venv) zhutao@zhutao-B360M-POWER:/usr/local/MATLAB/R2018a/extern/engines/python$ python3 setup.py install
Writing /usr/local/lib/python3.6/dist-packages/matlabengineforpython-R2018a.egg-info

去/usr/local/lib/python3.6/dist-packages文件夹把matlab文件夹和文件复制到/home/zhutao/PycharmProjects/pythonProject/venv/lib/python3.6/site-packages路径中,然后按照官方方法即可。

例子脚本:
在某个目录有一个test.m文件,则在同样的目录运行一个Test.py,内容如下:
import matlab.engine
eng = matlab.engine.start_matlab()
eng.test(nargout=0)
指定 nargout=0。尽管脚本会打印输出,但它不会向 Python 返回任何输出参数。

总结:在python3.6及matlab2018ra下进行调用matlab是可行的,主要应用命令行中的python3命令和matlab.engine api接口进行。
理论上read_bf_socket功能已经在python实现,但因为更新环境导致tcpip协议在收集实时数据时不可用。

二、用python读取dat文件

参考:https://blog.csdn.net/YuanDianO/article/details/99936627
下面先是一段理论方面的介绍,主要也是根据上面这博主的,心急的可以先去看第三部分,那是重点!!!!!,包括一些我扩展的python代码介绍和代码git地址。
总体而言,收到的csi数据是一个由n个bfee数据组成的bfee_list列表:
科研记录2.2 python处理CSI信号_第1张图片
open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError的错误。
接下来介绍一下每个bfee数据的数据结构:
在这里插入图片描述
前两字节是field_len(字段长度),之后一字节是code(编码),再之后便是可变长度的field。field_len等于code+field的字长。值得注意的是,只有当code为187时,表示field中是信道信息;不是187时,表示field中是其他信息。所以对于我们而言可依据这个进行数据解析中的判断,若不是信道信息直接跳过即可:
科研记录2.2 python处理CSI信号_第2张图片
对于所需数据最后存在dicts[]数组里面,其中信道数据的结构如下:
科研记录2.2 python处理CSI信号_第3张图片
科研记录2.2 python处理CSI信号_第4张图片
可简单的把field字段分为头部数据及最后含有csi信号数据的payload可变载荷数据,头部中包含了主要的信道信息。而其中最重要的csi矩阵,分为30个subc,保存在有效载荷中。分别对应30个子载波。根据这个设计dicts[]的结构,并用append()函数给数组赋值。
科研记录2.2 python处理CSI信号_第5张图片
补充1:dict[]数组中的元素的相应解释:
‘timestamp_low’: NIC网卡1MHz时钟的低32位。它大约4300s(72min)重复一回。
‘bfee_count’: 驱动程序记录并发送到用户空间的波束形成度量的总数。内核和用户空间之间的netlink通道是有损的,因此可以使用这些通道检测掉入该管道的测量值。
‘Nrx’: 接收端使用的天线数量。
‘Ntx’: 发送端使用的天线数量。
‘rssi_a’,‘rssi_b’,‘rssi_c’:由接收端NIC网卡测量出的RSSI值,对应于每个天线端口输入端接收NIC测量的RSSI。
‘noise’: 噪声值
‘agc’:
‘antenna_sel’: 天线_选择,用来计算perm。
‘perm’: NIC如何将来自3个接收天线的信号置换到处理测量数据的3个RF链中,eg.数据(perm=[1 2 3])表示天线A被发送到RF链A,天线B被发送到RF链B,天线C被发送到RF链C。
‘len’:
‘fake_rate_n_flags’: 数据包发送的速率,天线位被省略了,因为接收器无法知道使用了哪些发射天线
‘calc_len’:
‘csi’: 是csi本身,规范化为一个内部引用。它是一个Ntx Nrx 30的三维矩阵,其中第三维是跨OFDM信道的30个子载波。

正确的数据解析步骤应该是:
1.从文件将头部信息和csi矩阵读取到字典,即read_bfee_file()
2.依次从字典中取出标准化CSI,即get_scale_csi()
3.将所有csi整合到一起,保存为csv

三、python处理CSI信号代码

Git地址:https://gitee.com/forrest_jackson/csi_-python.git
git仓库一般操作推荐一定要会,常用的方法参考我的另一篇文章:https://blog.csdn.net/qq_43702219/article/details/118095062

1、get_csi目录:

1.get_wifi.py:
脚本文件,利用os.system()函数实现运行单个命令行,利用os.popen()函数实现运行多个命令行,设置参数“gnome-terminal -e ”实现多进程同时打开多个终端。
实现舍弃原有项目中收数多行多步操作的繁琐,运行即采集数据,存为dat格式。
2.read_bf_socket.py:
还未实现,目标实时监控。
3.sudo_matlab.py
4.test.py

2、read_csi目录:

根据正确的数据解析步骤:
1.从文件将头部信息和csi矩阵读取到字典,根据官方read_bfee_file()函数,在read_csi文档中创建了dat_dict.py文件;
2.依次从字典中取出标准化CSI,根据官方get_scale_csi()函数,在read_csi目录中创建了dict_standard.py文件;
3.将所有csi整合到一起,保存为csv,在read_csi文档中创建了standard_csv.py文件;
在read_csi文件夹创建以下两个文件:
1.Demo_plot.py:
利用matploylib库和numpy库,调用解析步骤中的1、2步中的文件,实现画出csi信号的初步图像;
2.Demo_save_csv.py:
实现将dat数据转化为标准化格式并以csv格式的文件储存;
test_sub.py:
数据提取+画子载波变换
wifilib.py
参考所用

你可能感兴趣的:(CSi信号科研记录)