本篇主要讲读取完数据后如何对包含大量噪声的原始数据做降噪处理。介绍了三种降噪算法,Hampel极值点去除、低通滤波、小波变换。本教程参考了发表在Ebaina上的
基于Wi-Fi的摔倒检测(二):数据预处理_专栏_易百纳技术社区 (ebaina.com)
基于Wi-Fi CSI的摔倒检测(三):CSI 数据降噪_专栏_易百纳技术社区 (ebaina.com)
在此基础上做了修改以及有一些自己的想法。
本博客紧接着上一篇博客
WIFI信号状态信息 CSI 数据处理篇之读取数据与数据解析_csi信息_Silver_777的博客-CSDN博客
是数据读取后的降噪处理,根据自己的数据,选择合适的算法即可。
目录
什么是信号降噪?
可以看到,在前一个博客中,原始数据充满了噪声,振幅曲线并不平滑。噪声是信号非常常见的现象,可能是软硬件不理想、环境的干扰、数据传输失真等等。因此对信号除噪是非常基本的操作,这方面的算法也很成熟,matlab中有丰富的信号处理函数。
信号的降噪是一个过程,旨在从信号中减少或消除噪声,从而提高信号的质量。降噪的关键是在去除噪声的同时,尽量保留信号的原始信息。过度的降噪可能会导致信号的失真或重要信息的丢失。
接下来介绍几个基本的降噪算法,选择适用自己实验数据的就可以。
降噪算法一:Hample极值点去除
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
函数可以用来自动执行小波去噪。该函数有多个参数:
- 输入信号。
- 噪声估算策略,例如'heursure'。
- 软硬阈值化,例如's'代表软阈值化。
- 处理模式,例如'one'代表单阈值。
- 分解级别。
- 所选的小波,例如'sym4'
代码如下:
%% 降噪三:离散小波变换
% 这一节得到是降噪后的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(离散小波变换)
- 原理:通过多分辨率分析,将信号分解为不同的频率子带,然后在每个子带上进行去噪。
- 优点:
- 可以在多个分辨率水平上考察信号,为复杂信号提供更好的分析框架。
- 不仅可以去除噪声,还可以进行其他处理,如信号压缩。
- 与传统滤波器相比,对信号边缘有更好的保护作用。
- 缺点:
- 参数选择多,如小波基、阈值方法、分解级别等,需要经验或多次尝试来确定。
- 对于非常简单或短的信号,可能不如其他简单方法高效。
总结,选择哪种方法取决于具体的应用和信号特性。在某些情况下,可能需要结合多种方法来达到最佳的降噪效果。