You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Wavelet Transform中排除零值,改善去噪效果

解决小波变换去噪中零值区域杂乱的问题

问题核心:你的代码对整段数据统一执行小波高频系数置零处理,零值区域本身无有效信号,强制置零高频系数后重构会引入伪波动,导致零值区域结果杂乱。要解决这个问题,我们可以仅对非零区域执行小波去噪,零值区域保持原始零值不变。

修改后的代码

import pywt
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 加载数据
df = pd.read_csv('1225JakariaRwalk2Min.csv', low_memory=False)
columns = ['Fx','Fy','Fz','Mx','My','Mz']
selected_df = df[columns]
FPDatas = selected_df[:15000]
FPData = np.array(FPDatas).astype('float64')

wavelet = 'db4'
filtered_data_dwt = np.copy(FPData)  # 初始复制原始数据,零值区域直接保留

for i in range(6):
    # 生成零值掩码(考虑浮点误差,判断是否接近0)
    zero_mask = np.isclose(FPData[:, i], 0, atol=1e-6)
    non_zero_data = FPData[~zero_mask, i]
    
    if len(non_zero_data) == 0:
        continue  # 全零通道跳过处理
    
    # 对非零区域做小波去噪
    coeffs = pywt.wavedec(non_zero_data, wavelet)
    # 置零最后3层高频系数
    coeffs[-1] = np.zeros_like(coeffs[-1])
    coeffs[-2] = np.zeros_like(coeffs[-2])
    coeffs[-3] = np.zeros_like(coeffs[-3])
    denoised_non_zero = pywt.waverec(coeffs, wavelet, mode='symmetric', axis=0)
    
    # 将去噪后的数据放回原位置
    filtered_data_dwt[~zero_mask, i] = denoised_non_zero

# 可视化对比
for i in range(6):
    plt.figure(figsize=(15,6))
    plt.plot(FPData[:2000, i], color='red')
    plt.plot(filtered_data_dwt[:2000, i], markerfacecolor='none', color='black')
    plt.legend(['原始数据', '去噪后数据'], loc='best')
    plt.title(f'通道 {columns[i]} 对比')
    plt.show()

关键改动说明

  • 零值掩码识别:用np.isclose判断数据是否接近零(避免浮点精度问题),精准区分零值和非零区域
  • 分区处理:仅对非零区域执行小波分解、高频系数置零和重构操作,零值区域不做额外处理
  • 结果回填:将去噪后的非零数据放回原数组对应位置,零值区域保持原始状态,彻底避免伪影引入

备选优化方向

如果零值区域并非完全为零,而是低幅值噪声区域,还可以:

  • 设置幅值阈值,仅处理超过阈值的信号部分
  • 在小波系数处理阶段,针对零值/低幅值区域保留原始系数,不执行置零操作

内容的提问来源于stack exchange,提问作者stack offer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:45:27