基于Wi-Fi CSI的摔倒检测(一):CSI数据的导入
26064 打赏
技术凯 2020-12-18 00:01:24

一、问题背景

  随着我国人口老龄化问题的日益加重以及独居老人数量的日益增加,无人监管情况下老人摔倒导致的死亡案例也在日益增加,一款非可穿戴被动式的摔倒检测工具成为必要以保证老人的安全。随着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]);

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

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
评论
7个
时间排序
内容存在敏感词
    0 条记录 第 0 /
    相关专栏
    打赏作者
    易百纳技术社区
    技术凯
    您的支持将鼓励我继续创作!
    打赏金额:
    ¥1 易百纳技术社区
    ¥5 易百纳技术社区
    ¥10 易百纳技术社区
    ¥50 易百纳技术社区
    ¥100 易百纳技术社区
    支付方式:
    微信支付
    支付宝支付
    易百纳技术社区 微信支付
    易百纳技术社区
    打赏成功!

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

    举报反馈

    举报类型

    • 内容涉黄/赌/毒
    • 内容侵权/抄袭
    • 政治相关
    • 涉嫌广告
    • 侮辱谩骂
    • 其他

    详细说明

    审核成功

    发布时间设置
    发布时间:
    是否关联周任务-专栏模块

    审核失败

    失败原因
    备注
    Loading...
    易百纳技术社区
    确定要删除此文章、专栏、评论吗?
    确定
    取消
    易百纳技术社区
    活动规则
    • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
    • 2.发布在平台的专栏需为原创技术专栏,且社区作为首次发布的平台,在其他平台发布需注明为转载
    • 3.周任务中的专栏需要达到一定质量才会被计入完成总数中。具体以平台审核为准,如有疑问,可联系社区客服(ebainacs)。
    • 4.专栏/资料的任务以审核通过的篇数为准,每个任务数量不做累计。
    • 5.任务完成后,现金奖励直接打款到微信账户EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换。
    易百纳技术社区
    升级提醒
    升级

    恭喜您的社区称号由 升级为 “社区游民”

    同时为了感谢您对社区的支持,我们将送出xxx礼品一份, 记得领取哦~

    升级提醒
    易百纳技术社区