基于Wi-Fi的摔倒检测(二):数据预处理

技术凯 2020-12-19 14:41:57 15753

  Hello 各位小伙伴,上篇文章我们展示了如何进行CSI数据的导入,本文我们正式开始我们数据处理环节。实际测试得到的数据都是‘脏’的,不能直接使用,必须用数学方法进行‘清洗’才能继续使用。所以本文讲述如何将最明显的噪声滤除掉-Hampel.
  由于商用WiFi设备的硬件缺陷以及环境中的电磁干扰以及不可避免的白噪声导致原始的CSI数据有很多噪声成分,这些噪声后续会严重影响我们进行摔倒特征的提取。因此在导入原始数据后的下一步我们要进行数据的降噪处理。
  降噪方法有很多,就是使用各种滤波器的组合提取出我们想要的时域信息或者频域成分。首先我们应去除的是最明显的离群点,本文使用最常用的hampel 异常值滤波器。
  我们可以直接使用MATLAB 直接自带的Hampel数从原始数据矩阵中直接去噪,但是为了在对所有数据进行使用Hampel去噪时尽可能不用每一根天线单独写, 所以我们先在导入数据时进行数据的合并,将三根天线上30个子载波990个数据包合并成一个3x990x30的三维矩阵y。
矩阵合并的代码如下:

clc
clear all
warning('off')
csi_trace = read_bf_file('sample_data/logfalls11.dat');
subcarrier=zeros(3,990,30);
for k=1:3
for j=1:30
for i=1:990
    csi_entry = csi_trace{i};
    csi = get_scaled_csi(csi_entry);
    csi=csi(1,:,:);%1*3*30
    csi1=squeeze(csi).';% 30*3 complex
    csiabs=db(abs(csi1));%30*3 
    csiabs=csiabs(:,k);
       csi1=csi1(:,k)
    subcarrier(k,i,j)=csiabs(j);
      if(subcarrier(k,i,j)>=35)
        subcarrier3(k,i,j)=35;
    else if(subcarrier(k,i,j)<=1)
            subcarrier(k,i,j)=1;

        end
    end
end
end
end
y=subcarrier;

得到合并的y矩阵后,直接使用Hampel语句进行去除异常点。
(选择每是个点求中值判断,超出三倍绝对中值差判定为异常值滤除)。

for j=1:30
    for i=1:3
        y(i,:,j)=hampel(y(i,:,j),4,3);
    end
end

如果我们想观察,哪些点被去掉了?
返回值i会告诉我们序列中被去掉值在数组中的位置索引,我们将该位置索引标记即可。
代码如下:

[y,i,xmedian,xsigma] = hampel(x,4,3);
n = 1:990;
   figure(k)
plot(n,x)
hold on
plot(find(i),x(i),'sr')
hold off;

结果如图(红色方框表示为被去掉的点):第一根天线第二根子载波:

第二根天线第二根子载波:

第三根天线第二根子载波:

我们想观察究竟超出什么范围的值会被最终判定为异常值呢?也就是异常值的边界到底是什么形状呢? 异常值的滤除会不会使得我们丢失掉信息呢从而影响后续的特征提取呢?
我们取Hampel中的返回值[xmedian,xsigma]进行绘图:
代码如下:

[y,i,xmedian,xsigma] = hampel(x,10,4); %每10个点值取平均,超出4倍的绝对中位差被认为是异常值
n = 1:990;
   figure(k)
plot(n,x)
hold on
 plot(n,xmedian-3*xsigma,n,xmedian+3*xsigma)
plot(find(i),x(i),'sr')
hold off
legend('Original signal','Lower limit','Upper limit','Outliers') %曲线意义标注

结果如下:
第一根天线低2号子载波为例:

第二根天线低2号子载波为例:

第三根天线低2号子载波为例:

以上就是Hampel异常值滤除的所有步骤了。下面将给出本篇文章所有步骤的完整代码:

clc
clear all;
csi_trace = read_bf_file('sample_data/logfallr111.dat');
antenna=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
 antenna(k,:)=subcarrier;
     figure(k)

     %hampel
x=subcarrier;
[y,i,xmedian,xsigma] = hampel(x,10,4);% 每四个点值取平均,超出三倍的绝对中位差被认为是异常值
n = 1:990;
   figure(k)
plot(n,x)
hold on
 plot(n,xmedian-3*xsigma,n,xmedian+3*xsigma)
plot(find(i),x(i),'sr')
hold off
legend('Original signal','Lower limit','Upper limit','Outliers')
end

  接下来将详细讲述,异常值去除掉之后,如何使用各种高性能滤波器和时频变换方法对高频噪声进行滤除。如果还有什么问题,可以在下方评论区提问交流。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 2 9 评论 打赏
评论
1个
内容存在敏感词
手气红包
  • 嘀嘀嘀 2022-11-02 16:18:06
    回复
    大佬,函数或变量 'x' 无法识别。这是什么情况
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
技术凯
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

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

举报反馈

举报类型

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

详细说明

审核成功

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

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区