传感数据分析——傅里叶滤波与小波滤波

发布时间:2024年01月09日

传感数据分析——傅里叶滤波与小波滤波


前言

傅里叶滤波的原理:
傅里叶滤波是基于傅里叶变换的一种信号处理方法,它的原理如下:
傅里叶变换: 将时域信号转换为频域信号。傅里叶变换将信号分解成一系列正弦和余弦函数的频谱成分,表示了信号在不同频率上的贡献。
频域滤波: 在频域中,可以通过滤波操作来去除或弱化不需要的频率分量。通常,通过设定一个截止频率,将高于该频率的分量置零,达到滤波的效果。这也被称为频域截断。
逆傅里叶变换: 将经过滤波后的频域信号转换回时域。逆傅里叶变换恢复了滤波后的信号,得到最终的处理结果。
傅里叶滤波的优点是简单易懂,而缺点包括对非平稳信号的处理不够灵活,可能导致频谱泄漏等问题。
小波滤波的原理:
小波滤波是基于小波变换的一种信号处理方法,其原理如下:
小波变换: 将信号分解成不同尺度和频带的小波系数。小波变换提供了信号在时域和频域上的局部信息,因此具有更好的时频分辨率。
阈值处理: 对小波系数进行阈值处理,通过将较小的系数置零来抑制噪声。阈值通常基于系数的能量或统计性质计算。
小波逆变换: 将处理后的小波系数反变换回原始信号。逆变换产生了去噪后的信号。
小波滤波的优点包括对非平稳信号的适应性强,能够更好地处理瞬态信号和局部特征。然而,小波滤波也可能需要更复杂的计算,并且对于不同的小波基和阈值方法,效果可能有所不同。
综合来看,傅里叶滤波更注重全局频域特性,而小波滤波更注重局部时频特性,选择其中一种方法通常取决于信号的特征和具体的应用需求。
本文将调用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://blog.csdn.net/weixin_39753819/article/details/135477429
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。