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

# 生成示例信号：正弦波信号加上高斯白噪声
np.random.seed(0)
t = np.linspace(0, 1, 1000, endpoint=False)  # 时间序列，长度为1000
signal = np.sin(2 * np.pi * 20 * t)  # 20 Hz 的正弦波信号
noise = np.random.normal(0, 0.5, len(t))  # 高斯白噪声
signal_noisy = signal + noise  # 加噪声后的信号

# 进行小波变换
wavelet = 'db4'  # 选择小波基函数
levels = 5  # 分解的层数
coeffs = pywt.wavedec(signal_noisy, wavelet, level=levels)

# 对小波系数进行软阈值处理
threshold = 0.5  # 阈值
coeffs_thresh = [pywt.threshold(c, threshold, mode='soft') for c in coeffs]

# 重构信号
signal_denoised = pywt.waverec(coeffs_thresh, wavelet)

# 绘制结果
plt.figure(figsize=(10, 6))

plt.subplot(3, 1, 1)
plt.plot(t, signal, 'b', label='Original Signal')
plt.title('Original Signal')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.legend()

plt.subplot(3, 1, 2)
plt.plot(t, signal_noisy, 'g', label='Noisy Signal')
plt.title('Noisy Signal')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.legend()

plt.subplot(3, 1, 3)
plt.plot(t, signal_denoised, 'r', label='Denoised Signal')
plt.title('Denoised Signal')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.legend()

plt.tight_layout()
plt.show()
