Loading...
首页专栏正文

基于Wi-Fi CSI的摔倒检测(一):CSI数据的导入

 
1人已赏
技术凯 发布于 2021-05-10 15:45:57 浏览 6686 点赞 89 收藏 13

一、问题背景

  随着我国人口老龄化问题的日益加重以及独居老人数量的日益增加,无人监管情况下老人摔倒导致的死亡案例也在日益增加,一款非可穿戴被动式的摔倒检测工具成为必要以保证老人的安全。随着Wi-Fi设备的日益普及,使用Wi-Fi来进行摔倒检测可以大大地降低我们的研制成本,而且相比于其他相应的可穿戴设备,不会对老人的生活便利性产生任何影响,而且老人们不用刻意地穿戴专门的设备,实现随时随地的摔倒检测。此外,相比于基于摄像头的视觉摔倒检测,不会侵犯老人的隐私,而且可以实现无盲区监测。

二、什么是CSI

  在介绍如何通过Wi-Fi检测摔倒之前,首先我们需要明白,什么是CSI?它的全称是Channel State Information,即信道状态信息。因为人体的运动会影响空间电磁场的分布,导致信号的传播路径和相位时延发生改变,因此我们可以通过分析信道状态信息来提取动作的变化情况,从而分析出是否有摔倒事件的发生,若检测到相应情况,则联系紧急联系人进行报警。

二、数据的导入

  使用CSI工具来获取Intel5300网卡上各种动作的CSI数据。每个动作的样本数据是一个999x3x30矩阵。990表示它在10秒内接收到990个数据包。每个包有一个struct,它包含三个链路中30个子载波的幅度和相位信息(发射天线的数目乘以接收天线的数目),它是一个3×30矩阵。各结构信息如下图所示: Intel5300网卡获取的数据会存储到.data文件中,我们通过编写相应的Matlab代码进行数据的导入,代码如下:

clc
clear all;
csi_trace = read_bf_file('sample_data/logfallr111.dat');
for j=1:3
  for i=1:990%这里是取的数据包的个数
    csi_entry = csi_trace{i};
    csi = get_scaled_csi(csi_entry); %提取csi矩阵    
    csi =csi(1,:,:);
    csi1=abs(squeeze(csi).');          

    %天线选择

    ant_csi(:,i)=csi1(:,j);             

  end
  figure(j);
  plot(ant_csi.');
  hold on
end

这样,收集了摔倒CSI的原始数据集。 导入MATLAB后,比较了三种不同天线在摔倒的变化。可见,第二天线在摔倒时间上有明显的波动,即它能更好地反映摔倒,并呈现出明显的多普勒频移。 如果我们要对比三根天线某个序号的子载波,可以这样做:

clc
clear all;
csi_trace = read_bf_file('sample_data/logfallr111.dat');
sub_case=zeros(3,990);
j=2;%子载波序号选择
for k=1:3
  for i=1:990;
    csi_entry=csi_trace{i};
    csi=get_scaled_csi(csi_entry);
    csi1=squeeze(csi(1,:,:)).';% 30*3 complex

    csiabs=db(abs(csi1));

    csiabs=csiabs(:,k);
    csi1=csi1(:,k);
    subcarrier(i)=csiabs(j);%10子载波幅度

    if(subcarrier(i)>=25)
       subcarrier(i)=25;
    else if(subcarrier(i)<=1) %若采集的数据产生了无穷值或者异常值可用该语句限幅
       subcarrier(i)=1;
    end
  end

end
sub_case(k,:)=subcarrier;

figure(1)

plot(sub_case(k,:));

hold on
xlabel('time(s)');
ylabel('Amplitude(dB)')
title('fall-signal');

axis([0 1000 0 35]);
end
legend('sub_case(1,:)','sub_case(2,:)','sub_case(3,:)');

效果如下: 如果要单独选择某根天线某个子载波进行观察,可以这样做:

clc
clear all;
csi_trace = read_bf_file('sample_data/logfallr111.dat');
j=2;
   for i=1:990;
     csi_entry=csi_trace{i};
     csi=get_scaled_csi(csi_entry);
     csi1=squeeze(csi(1,:,:)).';% 30*3 complex

     csiabs=db(abs(csi1));

     csiabs=csiabs(:,2);
     csi1=csi1(:,2);
     subcarrier(i)=csiabs(j);%10子载波幅度

     if(subcarrier(i)>=25)
        subcarrier(i)=25;
     else if(subcarrier(i)<=1) %若采集的数据产生了无穷值或者异常值可用该语句限幅
        subcarrier(i)=1;
     end
  end

end

figure(1)

plot(subcarrier);
hold on
xlabel('time(s)');
ylabel('Amplitude(dB)');
title('fall-signal');
axis([0 1000 0 35]);

效果如下: 接下来,我们将在之后的文章中介绍如何进行天线和子载波的选择以及初始信号处理。

*本文仅代表作者观点,不代表易百纳技术社区立场。系作者授权易百纳技术社区发表,未经许可不得转载。

精彩评论

  • 我の名字 评论于 2021-04-11 19:56:14

    请问能留联系方式嘛?

    0
  • 技术凯 评论于 2021-05-10 15:46:38

    @我の名字:qq:1411489005

    0
  • 变有钱变好看 评论于 2021-05-14 16:40:39

    加您了,但是有验证问题,加不上,请问您可以加一下我吗?qq:2794946763

    0
  • 二仙桥 评论于 2021-05-19 20:56:53

    大神您好,请问您真实名字是啥

    0
  • M. 评论于 2021-06-16 16:30:42

    您好,想问您一些csi的问题 可否给个联系方式呀

    0
内容存在敏感词
打赏
打赏作者
技术凯
您的支持将鼓励我继续创作!
金额:
¥1 ¥5 ¥10 ¥50 ¥100
支付方式:
微信支付
支付宝支付
微信支付
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区