Loading...
首页专栏正文

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

 
1人已赏
技术凯 发布于 2020-12-23 18:17:01 浏览 3313 点赞 0 收藏 2

  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 ¥5 ¥10 ¥50 ¥100
支付方式:
微信支付
支付宝支付
微信支付
打赏成功!

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

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