首页 > 技术知识 > 正文

  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;

结果如图(红色方框表示为被去掉的点):第一根天线第二根子载波: 基于Wi-Fi的摔倒检测(二):数据预处理 第二根天线第二根子载波: 基于Wi-Fi的摔倒检测(二):数据预处理1 第三根天线第二根子载波: 基于Wi-Fi的摔倒检测(二):数据预处理2

我们想观察究竟超出什么范围的值会被最终判定为异常值呢?也就是异常值的边界到底是什么形状呢? 异常值的滤除会不会使得我们丢失掉信息呢从而影响后续的特征提取呢? 我们取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号子载波为例: 基于Wi-Fi的摔倒检测(二):数据预处理3 第二根天线低2号子载波为例: 基于Wi-Fi的摔倒检测(二):数据预处理4 第三根天线低2号子载波为例: 基于Wi-Fi的摔倒检测(二):数据预处理5

以上就是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
<

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

猜你喜欢