本文共 3632 字,大约阅读时间需要 12 分钟。
目标:脱离CSI信号总用MATLAB进行处理分析,改为用Python
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_lftnav1、检查您的系统是否具有受支持的 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 installWriting /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协议在收集实时数据时不可用。参考:https://blog.csdn.net/YuanDianO/article/details/99936627
下面先是一段理论方面的介绍,主要也是根据上面这博主的,心急的可以先去看第三部分,那是重点!!!!!,包括一些我扩展的python代码介绍和代码git地址。 总体而言,收到的csi数据是一个由n个bfee数据组成的bfee_list列表: open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError的错误。 接下来介绍一下每个bfee数据的数据结构: 前两字节是field_len(字段长度),之后一字节是code(编码),再之后便是可变长度的field。field_len等于code+field的字长。值得注意的是,只有当code为187时,表示field中是信道信息;不是187时,表示field中是其他信息。所以对于我们而言可依据这个进行数据解析中的判断,若不是信道信息直接跳过即可: 对于所需数据最后存在dicts[]数组里面,其中信道数据的结构如下: 可简单的把field字段分为头部数据及最后含有csi信号数据的payload可变载荷数据,头部中包含了主要的信道信息。而其中最重要的csi矩阵,分为30个subc,保存在有效载荷中。分别对应30个子载波。根据这个设计dicts[]的结构,并用append()函数给数组赋值。 补充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整合到一起,保存为csvGit地址:https://gitee.com/forrest_jackson/csi_-python.git
git仓库一般操作推荐一定要会,常用的方法参考我的另一篇文章:https://blog.csdn.net/qq_43702219/article/details/1180950621.get_wifi.py:
脚本文件,利用os.system()函数实现运行单个命令行,利用os.popen()函数实现运行多个命令行,设置参数“gnome-terminal -e ”实现多进程同时打开多个终端。 实现舍弃原有项目中收数多行多步操作的繁琐,运行即采集数据,存为dat格式。 2.read_bf_socket.py: 还未实现,目标实时监控。 3.sudo_matlab.py 4.test.py根据正确的数据解析步骤:
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: 参考所用