传感数据分析——傅里叶滤波与小波滤波
前言
傅里叶滤波的原理:
傅里叶滤波是基于傅里叶变换的一种信号处理方法,它的原理如下:
傅里叶变换: 将时域信号转换为频域信号。傅里叶变换将信号分解成一系列正弦和余弦函数的频谱成分,表示了信号在不同频率上的贡献。
频域滤波: 在频域中,可以通过滤波操作来去除或弱化不需要的频率分量。通常,通过设定一个截止频率,将高于该频率的分量置零,达到滤波的效果。这也被称为频域截断。
逆傅里叶变换: 将经过滤波后的频域信号转换回时域。逆傅里叶变换恢复了滤波后的信号,得到最终的处理结果。
傅里叶滤波的优点是简单易懂,而缺点包括对非平稳信号的处理不够灵活,可能导致频谱泄漏等问题。
小波滤波的原理:
小波滤波是基于小波变换的一种信号处理方法,其原理如下:
小波变换: 将信号分解成不同尺度和频带的小波系数。小波变换提供了信号在时域和频域上的局部信息,因此具有更好的时频分辨率。
阈值处理: 对小波系数进行阈值处理,通过将较小的系数置零来抑制噪声。阈值通常基于系数的能量或统计性质计算。
小波逆变换: 将处理后的小波系数反变换回原始信号。逆变换产生了去噪后的信号。
小波滤波的优点包括对非平稳信号的适应性强,能够更好地处理瞬态信号和局部特征。然而,小波滤波也可能需要更复杂的计算,并且对于不同的小波基和阈值方法,效果可能有所不同。
综合来看,傅里叶滤波更注重全局频域特性,而小波滤波更注重局部时频特性,选择其中一种方法通常取决于信号的特征和具体的应用需求。
本文将调用PyWavelets库对比傅里叶滤波与小波滤波方法。
本文正文内容
一、运行环境
系统: Windows 10 / Ubuntu 20.04
编程语言: Python 3.8
文本编译器: Vscode
所需库:matplotlib >= 2.2.2 , numpy >= 1.19.5, PyWavelets >= 1.4.1
二、Python实现
代码如下(示例):
# @copyright all reseved
# @author: Persist_Zhang
import numpy as np
import matplotlib.pyplot as plt
import pywt
def fourier_filter(signal, cutoff_frequency):
# 进行傅里叶变换
spectrum = np.fft.fft(signal)
# 设定高频分量为零
spectrum[int(cutoff_frequency):] = 0
spectrum[:1] = 0 # 去除直流分量
# 进行傅里叶逆变换
filtered_signal = np.fft.ifft(spectrum)
return filtered_signal.real
def wavelet_filter(signal, wavelet='db1', level=4, threshold_multiplier=0.1):
# 进行小波变换
coeffs = pywt.wavedec(signal, wavelet, level=level)
# 计算阈值
threshold = threshold_multiplier * np.sqrt(2 * np.log2(len(signal))) * np.median(np.abs(coeffs[-1]))
# 应用阈值
coeffs = [pywt.threshold(c, threshold, mode='soft') for c in coeffs]
# 进行小波逆变换
filtered_signal = pywt.waverec(coeffs, wavelet)
return filtered_signal
if __name__ == "__main__":
# 生成含噪声的信号
np.random.seed(42)
t = np.linspace(0, 1, 1000, endpoint=False)
signal = np.sin(2 * np.pi * 7 * t) + 0.5 * np.sin(2 * np.pi * 15 * t) + 0.1 * np.random.randn(1000)
# 设定傅里叶滤波的截止频率
cutoff_frequency = 20
# 进行傅里叶滤波
filtered_fourier = fourier_filter(signal, cutoff_frequency)
# 进行小波滤波
threshold_multiplier = 0.8 # 调整阈值以控制去噪程度
filtered_wavelet = wavelet_filter(signal, threshold_multiplier=threshold_multiplier)
# 绘制原始信号和滤波后的信号在同一张图上
plt.figure(figsize=(10, 6))
plt.plot(t, signal, label='Original Signal', color='blue')
plt.plot(t, filtered_fourier, label='Filtered (Fourier)', color='green')
plt.plot(t, filtered_wavelet, label=f'Filtered (Wavelet, Threshold Multiplier={threshold_multiplier})', color='orange')
plt.legend()
plt.title('Original Signal and Filtered Signals')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.savefig('./figure/Fourier_Wavelet_Filter.jpg')
plt.show()
结果图
由图可知,傅里叶滤波更注重全局频域特性,滤波后展现趋势性,而小波滤波更注重局部时频特性,对局部跳变较大的数据滤波效果更佳。文章来源:https://www.toymoban.com/news/detail-796966.html
总结
以上就是本文关于传感信号分析中傅里叶滤波与小波滤波的对比,全部代码见上,还望多多收藏点赞,后续将会更新与分享更多传感数据处理的代码。文章来源地址https://www.toymoban.com/news/detail-796966.html
到了这里,关于传感数据分析——傅里叶滤波与小波滤波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!