传感数据分析——傅里叶滤波与小波滤波
传感数据分析——傅里叶滤波与小波滤波
前言
傅里叶滤波的原理:
 傅里叶滤波是基于傅里叶变换的一种信号处理方法,它的原理如下:
 傅里叶变换: 将时域信号转换为频域信号。傅里叶变换将信号分解成一系列正弦和余弦函数的频谱成分,表示了信号在不同频率上的贡献。
 频域滤波: 在频域中,可以通过滤波操作来去除或弱化不需要的频率分量。通常,通过设定一个截止频率,将高于该频率的分量置零,达到滤波的效果。这也被称为频域截断。
 逆傅里叶变换: 将经过滤波后的频域信号转换回时域。逆傅里叶变换恢复了滤波后的信号,得到最终的处理结果。
 傅里叶滤波的优点是简单易懂,而缺点包括对非平稳信号的处理不够灵活,可能导致频谱泄漏等问题。
 小波滤波的原理:
 小波滤波是基于小波变换的一种信号处理方法,其原理如下:
 小波变换: 将信号分解成不同尺度和频带的小波系数。小波变换提供了信号在时域和频域上的局部信息,因此具有更好的时频分辨率。
 阈值处理: 对小波系数进行阈值处理,通过将较小的系数置零来抑制噪声。阈值通常基于系数的能量或统计性质计算。
 小波逆变换: 将处理后的小波系数反变换回原始信号。逆变换产生了去噪后的信号。
 小波滤波的优点包括对非平稳信号的适应性强,能够更好地处理瞬态信号和局部特征。然而,小波滤波也可能需要更复杂的计算,并且对于不同的小波基和阈值方法,效果可能有所不同。
 综合来看,傅里叶滤波更注重全局频域特性,而小波滤波更注重局部时频特性,选择其中一种方法通常取决于信号的特征和具体的应用需求。
 本文将调用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()
结果图
 
 由图可知,傅里叶滤波更注重全局频域特性,滤波后展现趋势性,而小波滤波更注重局部时频特性,对局部跳变较大的数据滤波效果更佳。
总结
以上就是本文关于传感信号分析中傅里叶滤波与小波滤波的对比,全部代码见上,还望多多收藏点赞,后续将会更新与分享更多传感数据处理的代码。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!