CSI指纹预处理(中值、均值、Hampel、维纳滤波、状态统计滤波器)

本文主要是介绍CSI指纹预处理(中值、均值、Hampel、维纳滤波、状态统计滤波器),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

1、箱线法

2、中值滤波器

3、均值滤波器

4、Hampel滤波器

5、维纳滤波

6、状态统计滤波器


 

前言

因为设备、温度和实验室物品摆设等因素的影响,未经处理的CSI数据不能直接使用,需要对数据进行异常值处理以保证数据的稳定性,同时减少环境中人的活动、突发性干扰对CSI的影响,下面将简单探讨MATLAB自带的几种滤波器对CSI幅值数据的处理,一些升级版的滤波程序由你们自主思考。

1、箱线法

箱线法主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较,我们可以先使用箱线法可视化异常值,下面给出了箱线法可视化异常值及箱线法对照图,感兴趣的可以自己去了解一下。

d96efe3d3e614df38a4b690f4d861078.png

  图1 箱线法可视化异常值

a2f8fbc9da884982b7f32311cdf9b235.jpeg

  图2 箱线法对照图 

2、中值滤波器

中值滤波是一种非线性滤波方法,可以有效去除信号中的噪声,同时保留信号中的边缘信息。中值滤波的基本思想是将信号中每个采样点的值替换为该点周围一定范围内的中值。

MATLAB中可以使用medfilt1函数对信号进行中值滤波。该函数的语法为:

y = medfilt1(x, w)

x表示我们要处理的数据;w表示均值滤波器的窗口大小,y表示滤波后的结果。

load('raw_amp');
best_amp= medfilt1(raw_amp, 5);
figure(1)
plot(raw_amp);
title('原始幅值');
ylabel('幅值');
figure(2)
plot(best_amp);
title('中值滤波');
ylabel('幅值');

中值滤波处理前后的幅值图像:

92c5be73253c40ef8f29eddc27e11371.png

 图3 中值滤波处理前

ad44b4a0e2a248249175c00736501f9f.png

  图4 中值滤波处理后

3、均值滤波器

均值滤波是一种线性滤波方法,可以用于平滑信号,去除噪声。均值滤波的基本思想是将每个采样点的值替换为该点周围一定范围内的平均值。

MATLAB中可以使用smoothdata函数对信号进行均值滤波。该函数的语法为:

y = smoothdata(x, 'movmean', w)

 x表示我们要处理的数据;w表示均值滤波器的窗口大小,y表示滤波后的结果。

best_amp2 = smoothdata(raw_amp, 'movmean', 5);
figure(3)
plot(raw_amp);
title('原始幅值');
ylabel('幅值');
figure(4)
plot(best_amp2);
title('均值滤波');
ylabel('幅值');

 均值滤波处理前后的幅值图像:

fda72cfd2433469fa253be22f91e2985.png

图5 均值滤波处理前 

1b77deb2c67a4c50897c3cdd9f43949f.png

图6 均值滤波处理后

4、Hampel滤波器

Hampel滤波是一种基于中位数的离群点检测和滤波方法。它通过对信号进行中位数滤波,并计算每个数据点与中位数之间的距离来识别离群点。如果距离大于某个阈值,则该数据点被视为离群点,并用中位数替换。该方法具有抗噪声能力和对离群点的较好识别能力。它常用于数据清洗、异常检测和信号预处理。

MATLAB中可以使用hampel函数对信号进行滤波。该函数的语法为: 

y=hampel(x,k,nsigma)

x表示我们要处理的数据;k表示可指定窗口中每个样本周围的样本数,默认为3;nsigma表示指定几倍的标准差;y表示滤波后的结果。 

great_data = hampel(raw_amp,5,2);
figure(5)
plot(1:1:30,raw_amp);
title('原始幅值');
ylabel('幅值');
figure(6)
plot(1:1:30,great_data);
title('Hampel低通滤波');
ylabel('幅值');

 Hampel滤波处理前后的幅值图像:

7938f66a35c54cde96ae5c5e3ab89897.png

图7  Hampel滤波处理前  

78b17f534e484b469d99212a2ec0e271.png

图8  Hampel滤波处理后  

5、维纳滤波

维纳滤波是一种二维自适应除噪滤波器,根据局部方差来调整滤波器效果。对于去除高斯噪声效果明显。

维纳滤波的两个函数wiener2与deconvwnr都能够完成维纳滤波的功能,但两者具有差异性,感兴趣的可以自己去了解,MATLAB中维纳滤波代码如下:

y=wiener2(x,[m,n]);

x指原始CSI的幅值;y指维纳滤波后的幅值;[m,n]指定滤波器窗口大小为m*n,默认值为3*3。

load('raw_amp');
m=5;
n=5;
best_amp3=wiener2(raw_amp,[m,n]);
figure(7)
plot(raw_amp);
title('原始幅值');
ylabel('幅值');
figure(8)
plot(best_amp3);
title('维纳滤波');
ylabel('幅值');

  维纳滤波处理前后的幅值图像:

2e2df11362df42f6b36f2007a5fd1d94.png

 图9 维纳滤波处理前  

51c4c78ef9294780bf1728611c290f1e.png

 图10  维纳滤波处理后  

6、状态统计滤波器

它的滤波概念是中值滤波的推广,中值滤波是对于给定的n个数值{al ,a2,...,an},将它们按大小顺序排列,取中间的那个值作为滤波器的输出。而状态统计滤波器将n个非零数值按小到大排序后处于第k个位置的元素作为滤波器的输出。MATLAB中状态统计滤波器可以用ordfilt2函数表示:

y=ordfilt2(x,order,domain);

x指原始CSI的幅值;y指状态统计滤波后的幅值;order 为滤波器输出的顺序值;domain为滤波窗口;

(1)y=ordfilt2(x,13,ones(5,5)),在模板内的像素值都为非零时,相当于模板为5×5的中值滤波(order=13,刚好为窗口的中间值);

(2)y=ordfilt2(x,1,ones(5,5)),在模板内的像素值都为非零时,相当于5×5的最小值滤波(order=1,刚好为窗口的最小值);

(3)y=ordfilt2(x,25,ones(5,5)),在模板内的像素值都为非零时,相当于5×5的最大值滤波(order=25,刚好为窗口的最大值);

load('raw_amp');
order = 10;
domain = ones(5,5);
best_amp4=ordfilt2(raw_amp,order,domain);
figure(8)
plot(raw_amp);
title('原始幅值');
ylabel('幅值');
figure(9)
plot(best_amp4);
title('状态统计滤波器');
ylabel('幅值');

 状态统计滤波器处理前后的幅值图像:

7a8ca49976bc472492aba0bc67796259.png

  图11  状态统计滤波器处理前

63fc0c4633054268b627c00240f9f7d8.png

图12  状态统计滤波器处理后 

CSI的相关文章请参考:CSI数据预处理之卡尔曼滤波、高斯滤波、简单平均_rssi高斯滤波_数产小黑娃的博客-CSDN博客卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。卡尔曼滤波算法在估计值和观测值之间做了一个修正。........................https://blog.csdn.net/qq_53860947/article/details/126175335

室内定位之CSI指纹定位_数产小黑娃的博客-CSDN博客随着WiFi技术的发展,IEEE802.11n系列通信协议及其之后的无线局域网协议应用了多输入多输出(multiple-input multiple-output,MI-MO)和正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)等技术,使得WiFi收发设备之间的信道特征可以在物理层进行估计,并以信道状态信息(channel status information,CSI)的形式存储下来。https://blog.csdn.net/qq_53860947/article/details/126180830

这篇关于CSI指纹预处理(中值、均值、Hampel、维纳滤波、状态统计滤波器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274057

相关文章

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

hdu3006状态dp

给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead