基于Wi-Fi的摔倒检测(二):数据预处理
12313 打赏
技术凯 2020-12-19 14:41:57

  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

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

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

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

    举报反馈

    举报类型

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

    详细说明

    审核成功

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

    审核失败

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

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

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

    升级提醒
    易百纳技术社区