码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 如何用MATLAB对CSI数据进行预处理(卡尔曼滤波篇)


    目录

    一、前言

    二、数据采集

    三、卡尔曼滤波算法

    1、什么是卡尔曼算法

    2、卡尔曼的大致实现过程

    3、卡尔曼滤波算法的核心计算式

    4、单维度数据处理 

    5、多维度数据处理 

    一、前言

    由于WiFi信号强度受多径效应和噪声的影响会导致定位精度低和性能不稳定等的问题。与RSSI相比,信道状态信息(channel status information,CSI)能有效避免多径效应给定位结果带来的不良影响,因此,采用CSI的值作为定位的特征值,建立Radio Map的位置指纹数据库,通过加权邻近算法匹配k组最近的指纹库数据可以估计出待测点的位置。

    二、数据采集

    这个阶段不做过多说明,怎么样采集及读取采集的csi数据也是一个难点。基于信道状态信息(channel status information,CSI)的室内定位法,其采用了正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)技术将通信信道分为多个不同频率的独立子信道,在每个子信道物理层收集CSI值作为指纹测量值。本文利用了配备Intel5300NIC网卡的台式机进行实验,设置64个样本点,每个样本点采集1500个数包,每个数据包有2*3*30条数据(2个发送天线,3个接收天线,见图1.1,30个子载波)。图1.2为标准采样点(蓝色)和测试点(红色),指纹地图由于涉及到实验保密性,故不展示。

    图1.1 实验采集设施  

     图1.2 样本点和测试点

    三、卡尔曼滤波算法

    1、什么是卡尔曼算法

    卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。卡尔曼滤波算法在估计值和观测值之间做了一个修正。

    姿态确定的扩展卡尔曼滤波Matlab
    application/x-rar 4星 超过75%的资源 394KB
    下载

    2、卡尔曼的大致实现过程

    卡尔曼的实现过程:使用上一次的最优结果预测当前的值,同时使用观测值修正当前值,得到最优结果。

    3、卡尔曼滤波算法的核心计算式

    本文就是根据以下公式,利用MATLAB进行数据处理

    4、单维度数据处理 

    每个点位采集的CSI数据有2*3*30*1500个幅度信息,我们采用第一根发射天线第一根接收天线的1500个单维幅度值进行卡尔曼滤波,MATLAB代码如下:

    1. close all
    2. clc
    3. r1=xlsread('1.xlsx',1,'A1:A1500' ); %读取采集的csi值
    4. csi_length = length(r1);%获取数据的长度
    5. Z=r1; %获取观测量
    6. A=1; %状态转移矩阵
    7. X(1)=15; %目标状态向量
    8. H=1; %观测矩阵
    9. P(1)=100; %第一步预测的状态协方差矩阵
    10. R=10e-4; %观测噪声方差
    11. Q=10e-4; %噪声协方差
    12. %有些变量会随迭代次数发生改变,所以给这些变量预先分配内存
    13. X_=zeros(1,csi_length);
    14. P_=zeros(1,csi_length);
    15. K=zeros(1,csi_length);
    16. for t=2:csi_length
    17. %预测
    18. X_(t)=A*X(t-1); %状态方程
    19. P_(t)=A*P(t-1)*A'+Q; %预测的协方差
    20. %更新校准
    21. K(t)=P_(t)*H'/(H*P_(t)*H'+R); %卡尔曼增益
    22. X(t)=X_(t)+K(t)*(Z(t)-H*X_(t)); %状态更新方程
    23. P(t)=(1-K(t)*H)*P_(t); %协方差更新方程
    24. end
    25. %绘图
    26. x1=1:csi_length;
    27. hold on
    28. plot(x1,Z,'b-',x1,X,'r-'); % 红色线最优化估算结果滤波后的值,%蓝色线表示观测值
    29. legend('观测值','滤波后的值','Location','northwest');
    30. xlabel('子载波(f)');ylabel('幅值(dB)');
    31. title('卡尔曼滤波');
    32. set(gca,'Ylim',[5,25]);
    33. hold off

    卡尔曼滤波效果如下图: 

    一维二维卡尔曼滤波
    zip 4星 超过75%的资源 2KB
    下载

    5、多维度数据处理 

    其实跟上面类似,只不过现在读取30列*5200行数据而已(换了个数据集)

    1. r2=xlsread('2.xlsx',1,'A1:AD5200' );
    2. csi_length = length(r2);%获取数据的长度
    3. Z=r2; %获取观测量
    4. A=1; %状态转移矩阵
    5. X(1)=27; %目标状态向量
    6. H=1; %观测矩阵
    7. P(1)=100; %第一步预测的状态协方差矩阵
    8. R=10e-4; %观测噪声方差
    9. Q=10e-4; %噪声协方差
    10. for t=2:csi_length
    11. %预测
    12. X_(t)=A*X(t-1); %状态方程
    13. P_(t)=A*P(t-1)*A'+Q; %预测的协方差
    14. %更新校准
    15. K(t)=P_(t)*H'/(H*P_(t)*H'+R); %卡尔曼增益
    16. X(t)=X_(t)+K(t)*(Z(t)-H*X_(t)); %状态更新方程
    17. P(t)=(1-K(t)*H)*P_(t); %协方差更新方程
    18. end
    19. %绘图
    20. figure('Position', [100 100 1000 500]);
    21. x1=1:csi_length;
    22. hold on
    23. subplot(1,2,1); plot(x1,Z,'b-'); % 红色线最优化估算结果滤波后的值,%蓝色线表示观测值
    24. legend('观测值','Location','northwest');
    25. xlabel('总子载波数(个)');ylabel('幅值(dB)');
    26. title('原始数据图');
    27. subplot(1,2,2); plot(x1,X,'r-');
    28. legend('Kalman滤波后的值','Location','northwest');
    29. xlabel('总子载波数(个)');ylabel('幅值(dB)');
    30. title('使用卡尔曼滤波算法之后的数据图');
    31. hold off

     卡尔曼滤波效果如下图: 

    注:上述多维度数据处理还是存在一些问题的(滤波前后维度不一致),仅供参考,仅供参考!!!,后续将慢慢优化 。其实我是想做成下图的,横坐标表示第一根发射天线第一根接收天线的子载波数(30个),纵坐标表示每个子载波的幅度值,每条线表示不同的数据包(这里是1500个数据包)。

          对室内CSI指纹定位感兴趣的可阅读下面的文章:室内定位之csi指纹定位_数产小黑娃的博客-CSDN博客随着WiFi技术的发展,IEEE802.11n系列通信协议及其之后的无线局域网协议应用了多输入多输出(multiple-input multiple-output,MI-MO)和正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)等技术,使得WiFi收发设备之间的信道特征可以在物理层进行估计,并以信道状态信息(channel status information,CSI)的形式存储下来。。...https://blog.csdn.net/qq_53860947/article/details/126180830

  • 相关阅读:
    Service Worker 简单学习
    OPENCV--Haar+Tesseract车牌识别;
    OpenAI董事会秒反悔!奥特曼被求重返CEO职位
    android framework之Applicataion启动流程分析(四)
    python-paddle报错‘ErnieTokenizer‘ object is not subscriptable
    如何在 Vue.js 中引入原子设计?
    spi.c、spi设备驱动以及spi控制器驱动
    安达发|APS排单软件中甘特图的应用
    QT对象树和菜单操作
    详解C语言const关键字(说明+案例)
  • 原文地址:https://blog.csdn.net/qq_53860947/article/details/126175335
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号