CSI信号的处理


说明:自己的一点实践记录,可能有很多地方写的不好或者不对,望指正


matlab处理数据

1、timestamp_low:时间戳,相连两包此值差单位为微秒,通过验证发现100hz的发包频率此差值为10000,20hz的发包频率此差值为50000,此参数可以确定出波形的横轴时间

当发包频率过大会出现接收端停止收数的情况:20Hz正常,200Hz和1000Hz的采样频率,收端最多接收一分多钟的的数据(原因是recv函数接收数据阻塞导致)

1、将包长变小后还是有同样的问题。

2、由数据速率引起的,它太高,程序无法处理(可以尝试设置非阻塞)

 

2、0x4101决定了主机仅一根天线发送数据,因此此处的Ntx值为1,另外采用的是OFDM模式

如果想要收端接收到发端两根天线的数据(CSI的格式为2×3×30),只需要把第14、15位均设置为1,即在发送端的脚本里面设置为0xC101

注:关于0x4101的具体说明如下

14-16位全设置为1,表示分别打开天线1、2、3

13位:保护间隔,1表示0.4微秒,0表示0.8微秒

12位:duplicate data,重复数据?

11位:WiFi信道的带宽,1表示40MHz,0表示20MHz

10位:

9位:调制类型,CCK-1,OFDM-0

8位:高吞吐率模式速率-1,传统模式速率-0

5-7位:默认3个0

3-4位:单流-0,双流-2,三流-3

0-2位:速率选择位

总共17位

 

1、数据提取

csi_trace = read_bf_file('sample_data/walk_LoS.dat');

for i=1:200%这里是取的数据包的个数
        csi_entry = csi_trace{i};
        csi = get_scaled_csi(csi_entry); %提取csi矩阵    
        csi =csi(1,:,:);
        csi1=abs(squeeze(csi).');          %提取幅值(降维+转置)
        
        %只取一根天线的数据
        first_ant_csi(:,i)=csi1(:,1);           %直接取第一列数据(不需要for循环取)
        second_ant_csi(:,i)=csi1(:,2)
        third_ant_csi(:,i)=csi1(:,3)
                     
%         for j=1:30
%             csi15_end(i,:)=csi1(j,:);           %3个信道第j个子载波
%         end
end

%画第一根天线的载波
%plot(first_ant_csi.')
plot(second_ant_csi.')
%plot(third_ant_csi.')

直接获取CSI数据的幅度,csi1=abs(squeeze(csi).'),csi是1×3×30的复数矩阵,取绝对值后得到CSI的幅度

一个channel中,30个子载波随数据包/时间的的变化波形

到此CSI随时间变化的幅度值获取到(这里横轴的间隔是有发送设备决定的,在发包时第5个参数设置了发包间隔时间)

说明:在网卡上接上外接天线后的原始数据效果非常好,相比于没有加天线的网卡,加天线后原始数据周期性很明显(外接天线是必须的)

 

 

2、异常点去除

利用Hampel identifier去除异常点,离开封闭区间的点就当做异常点处理,μ表示一个波形的中位数,σ表示一个波形的the median
absolute deviation (MAD)(不同这个含义),γ一般取默认值3

疑问:异常点移除后加入的是什么值(加入的是中位数值)

不选均值和标准差的原因:

 

3、插值(Interpolation)

不能保证接收端数据包不丢失,因此必须插值(linear interpolation)

通过时间戳的差值计算发现:每次有大概20%左右的包丢失

点数×采样间隔所得时间要小于首尾时间戳的差,因此中间丢失了一些数据包(实际的点数是偏小的,时间戳对应的横轴也就是不是等间隔的)

差值方法:严格按照0.05s一个值来进行补全,通过两点确定出的直线来确定所要插入值的纵坐标

 

4、卡尔曼平滑滤波

平滑曲线

说明:说明可以尝试用PCA滤波方法,相对保留呼吸和心率的主成分来说,这种方法效果要好得多

参考链接:https://www.bbsmax.com/A/E35pNWXAzv/

 

5、去噪:用的小波变换

去燥不一定要用小波变换,可以多尝试一些滤波器,如Savitzky-Golay flter)

小波变换示意图:

加粗曲线是选择出来的最佳子载波

 

6、最佳载波选择和去除直流分量

6.1子载波选择:熵值选取/方差选取

选择更加具有周期性的波形。用递归图来处理
①画出RP图

数据处理过程参考链接:https://ww2.mathworks.cn/matlabcentral/fileexchange/58246-tool-box-of-recurrence-plot-and-recurrence-quantification-analysis

返回个参数含义:https://en.wikipedia.org/wiki/Recurrence_quantification_analysis#Example

 

recurrence plot(递归图):对于连续波形,如果两点值的差小于一个固定常数,那么将前一个点的横坐标值作为横轴值,后一个点的横坐标值作为纵轴画在坐标系中
如果信号是周期的,相邻值差基本为0,即每一个点都满足如下条件

如果是周期信号就会画出多条平行的直线

 

6.2去除直流分量:纵轴的相对位置改变,即幅度的相对位置改变

直接用信号减去信号的均值,发现只是相对幅度改变了。但是频谱分析时,蓝色波形频谱只有0处有值,去除直流分量的的红色波形频谱就正常了(未去除直流分量的频谱只有0频率处有幅度)

 

7、频谱分析和带通滤波

问题:同样的带通程序,用在ppg信号中不能获取很好的结果(没有看频率成分)

带通模型重新设计,使用切比雪夫滤波器

参考链接:https://zhidao.baidu.com/question/423138525.html(滤波模型可以自己调整切比雪夫滤波器的参数)

调整参数后的模型:

对最佳子载波进行FFT变换

带通滤波器保留0.3-0.5Hz的频率成分

带通滤波后与加速计波形对比

 

 

8、呼吸频率估计

使用滑动窗口,对窗口中的信号进行频谱变化,每个窗口中信号频谱的最高幅度对应的频率当做呼吸频率

滑动窗口取2048个点(相当于利用4个完整的波形进行估计),窗口每次移动500的步长,从而获取到随时间变化的呼吸速率值

 

注:呼吸参考指标有下面三项:

①每分钟多少次:The breathing frequency of a normal adult is 12 to 20 times per min in a resting state [5], and the heart rate is 60 to 100 beats per min [6]。

②频率:breathing from 0.2 Hz to 0.33 Hz [5] and heartbeat cycles from 1 Hz to 1.33 Hz [6](频率已知,可以通过滤波器提取出有用的信号)

③bpm:breathing rate ranges from 10 to 37 bpm [18, 19], and heart rate ranges from 60 to 80 bpm [20]



心率估计

1、带通的方法(为了获取ppg的波形,带通范围应该大一些,0.5-4Hz)

 

最主要的问题是模型上升沿和下降沿的问题

呼吸成分占主要部分的问题(带通无法将呼吸成分完全去除)

 

2、AutoEncode方法

时间对标要求严格的问题

一个ppg波形对应的csi数据波形问题

改进:同时平滑带通

 

3、主成分分析法

 

 

问题:

1、信号的CM能100%的检测呼吸,而单一用幅度或者相位处理可检测率不高

用天线1和2的共轭相乘尝试过,之前没有做过带通

数据实时显示的问题:

https://github.com/dhalperi/linux-80211n-csitool-supplementary/issues/90

 

  • 51
    点赞
  • 391
    收藏
    觉得还不错? 一键收藏
  • 60
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 60
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值