赞
踩
本篇主要讲读取完数据后如何对包含大量噪声的原始数据做降噪处理。介绍了三种降噪算法,Hampel极值点去除、低通滤波、小波变换。本教程参考了发表在Ebaina上的
基于Wi-Fi的摔倒检测(二):数据预处理_专栏_易百纳技术社区 (ebaina.com)
基于Wi-Fi CSI的摔倒检测(三):CSI 数据降噪_专栏_易百纳技术社区 (ebaina.com)
在此基础上做了修改以及有一些自己的想法。
本博客紧接着上一篇博客
WIFI信号状态信息 CSI 数据处理篇之读取数据与数据解析_csi信息_Silver_777的博客-CSDN博客
是数据读取后的降噪处理,根据自己的数据,选择合适的算法即可。
目录
可以看到,在前一个博客中,原始数据充满了噪声,振幅曲线并不平滑。噪声是信号非常常见的现象,可能是软硬件不理想、环境的干扰、数据传输失真等等。因此对信号除噪是非常基本的操作,这方面的算法也很成熟,matlab中有丰富的信号处理函数。
信号的降噪是一个过程,旨在从信号中减少或消除噪声,从而提高信号的质量。降噪的关键是在去除噪声的同时,尽量保留信号的原始信息。过度的降噪可能会导致信号的失真或重要信息的丢失。
接下来介绍几个基本的降噪算法,选择适用自己实验数据的就可以。
Hampel算法或称Hampel滤波器是用于异常值检测的一个非常有效的方法,特别是用于时间序列数据。这个方法使用了移动窗口,在窗口内部比较每个点与窗口的中位数,并决定是否将某些点视为异常值。代码如下
- %% 降噪一:hample极值点去除
- % 这一节得到是降噪后的result_matrix
- % 需要设置的参数:window_size、num_dev
- % 获取振幅数据
- amplitude_data = result_matrix(:, 1:90);
-
- % 可视化
- figure;
- % 画出原始数据
- subplot(2, 1, 1); % 2x1的子图布局,选中第1个子图
- plot(amplitude_data);
- xlabel('时间');
- ylabel('振幅');
- title('振幅随时间的变化(原始)');
- hold on
-
- % 设定hampel滤波器参数
- window_size = 5; % 窗口大小,可根据需要调整
- num_dev = 2; % 定义异常值的标准偏差范围
-
- % 对每一个子载波进行处理
- for k = 1:90
- % 使用hampel函数进行滤波
- filtered_data = hampel(amplitude_data(:, k), window_size, num_dev);
-
- % 存回到result_matrix
- result_matrix(:, k) = filtered_data;
- end
-
- % 画出经Hampel处理后的数据
- subplot(2, 1, 2); % 2x1的子图布局,选中第2个子图
- plot(result_matrix(:, 1:90));
- xlabel('时间');
- ylabel('振幅');
- title('振幅随时间的变化(Hampel)');
- hold off
运行结果如图所示,有变化,但不多。
低通滤波器是一种常用的信号处理工具,主要用于消除信号中的高频噪声,只保留低频成分。其工作原理是允许频率低于某个截止频率的信号通过,而阻止高于这个截止频率的信号通过。
在数字信号处理中,数字滤波器的频率规格是以“Nyquist频率”为单位的。Nyquist频率是采样频率的一半。对于30Hz的采样频率,Nyquist频率是15Hz。
代码如下:
- %% 降噪二:低通滤波器处理
- % 这一节得到是降噪后的result_matrix
- % 需要设置的参数:Fc、order、Fs
-
- % 提取振幅和相位数据
- amplitude_data = result_matrix(:, 1:90);
-
- % 可视化
- figure;
- % 画出原始数据
- subplot(2, 1, 1); % 2x1的子图布局,选中第1个子图
- plot(amplitude_data);
- xlabel('时间');
- ylabel('振幅');
- title('振幅随时间的变化(原始)');
- hold on
-
- % 设计低通滤波器
- Fc = 10; % 截止频率,根据实际情况进行调整,但确保小于15Hz
- order = 25; % 滤波器阶数,可以根据需要进行调整
- Fs = 30; % 采样频率,已经给出是30Hz
- lowpass_filter = designfilt('lowpassiir', 'FilterOrder', order, 'HalfPowerFrequency', Fc, 'SampleRate', Fs, 'DesignMethod', 'butter');
-
- % 对每个子载波上的振幅和相位数据应用低通滤波器
- filtered_data = zeros(size(amplitude_data));
- for i = 1:90
- filtered_data(:, i) = filtfilt(lowpass_filter, amplitude_data(:, i));
- end
-
- % 将滤波后的振幅和相位数据保存回result_matrix
- result_matrix(:, 1:90) = filtered_data;
-
- % 画出经低通滤波器处理后的数据
- subplot(2, 1, 2); % 2x1的子图布局,选中第2个子图
- plot(result_matrix(:, 1:90));
- xlabel('时间');
- ylabel('振幅');
- title('振幅随时间的变化(lowpass)');
- hold off
运行结果如图所示,可以看到还是平滑了不少。
小波变换是一种时频分析方法,它能够在不同的分辨率上分析信号。与傅立叶变换不同,小波变换提供了时间和频率的局部信息,这使其成为许多应用(如信号去噪、图像压缩)的理想选择。
离散小波变换通过递归地将信号分解为近似和细节来工作。近似是信号的低分辨率表示,而细节包含高频部分。通过保留近似并消除或减少细节,可以达到对信号进行去噪的目的。
在MATLAB中,wden
函数可以用来自动执行小波去噪。该函数有多个参数:
代码如下:
- %% 降噪三:离散小波变换
- % 这一节得到是降噪后的result_matrix
- % 提取振幅和相位数据
- amplitude_data = result_matrix(:, 1:90);
- % 可视化
- figure;
- % 画出原始数据
- subplot(2, 1, 1); % 2x1的子图布局,选中第1个子图
- plot(amplitude_data);
- xlabel('时间');
- ylabel('振幅');
- title('振幅随时间的变化(原始)');
- hold on
-
- % 初始化去噪后的数据矩阵
- filtered_data = zeros(size(amplitude_data));
-
- % 对每个子载波上的振幅和相位数据应用小波去噪
- for i = 1:90
- maxLevel = wmaxlev(size(amplitude_data, 1), 'sym4'); % 获取最大可能的分解级别
- level = min(10, maxLevel); % 保证选择的分解级别不超过最大可能级别
- filtered_data(:, i) = wden(amplitude_data(:, i), 'heursure', 's', 'one', level, 'sym4');
- end
-
- % 将去噪后的振幅和相位数据保存回result_matrix
- result_matrix(:, 1:90) = filtered_data;
-
- % 画出经小波变换处理后的数据
- subplot(2, 1, 2); % 2x1的子图布局,选中第2个子图
- plot(result_matrix(:, 1:90));
- xlabel('时间');
- ylabel('振幅');
- title('振幅随时间的变化(DWT)');
- hold off
运行结果如图所示:
可以看到,小波变换的平滑效果非常好,同时也保留了明显特征。
1. HAMPEL(基于中位数的去噪方法)
2. 低通滤波
3. DWT(离散小波变换)
总结,选择哪种方法取决于具体的应用和信号特性。在某些情况下,可能需要结合多种方法来达到最佳的降噪效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。