Python 小波变换提取特征信号:从 Excel 数据到时频域分析
要实现通过小波变换生成时频域图、添加白噪声、设定阈值剔除噪声信号并提取特征信号,我们可以借助pywt库来进行小波变换和逆小波变换。请确保你已经安装了该库。
以下是一个示例代码,用于读取Excel表格数据,绘制时域图,进行小波变换和逆小波变换,添加白噪声,设定阈值剔除噪声信号,并提取特征信号:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import pywt
# 读取Excel数据
data = pd.read_excel('your_excel_file.xlsx')
# 获取采样时间和输出电压列的数据
time = data.iloc[:, 0]  # 第一列采样时间
voltage = data.iloc[:, 1:5]  # 第2到5列输出电压
# 绘制时域图
plt.plot(time, voltage)
plt.xlabel('采样时间')
plt.ylabel('输出电压')
plt.legend(voltage.columns)  # 添加图例,显示每列的名称
plt.show()
# 小波变换
wavelet = 'db4'  # 选择小波函数
level = 5  # 小波变换的层数
coeffs = pywt.wavedec(voltage, wavelet, level=level)  # 进行小波变换
# 添加白噪声
noise_amplitude = 0.1  # 噪声振幅
noise = np.random.normal(0, noise_amplitude, size=voltage.shape)  # 生成白噪声
noisy_coeffs = [c + noise for c in coeffs]  # 加上噪声
# 设定阈值剔除噪声信号
threshold = 0.5 * np.max(np.abs(noisy_coeffs[-1]))  # 设置阈值为最后一层系数的最大值的一半
filtered_coeffs = [np.where(np.abs(c) > threshold, c, 0) for c in noisy_coeffs]  # 阈值剔除噪声信号
# 逆小波变换,得到特征信号
filtered_voltage = pywt.waverec(filtered_coeffs, wavelet)
# 计算时频域图
wavelet_name = 'db4'  # 小波名称
scales = np.arange(1, 128)  # 尺度范围
coefs, freqs = pywt.cwt(voltage.iloc[:, 0], scales, wavelet_name, sampling_period=time[1]-time[0])
# 绘制时频域图
plt.imshow(abs(coefs), extent=[time.min(), time.max(), scales.min(), scales.max()], cmap='jet', aspect='auto',
           vmax=abs(coefs).max(), vmin=-abs(coefs).max())
plt.colorbar(label='幅度')
plt.xlabel('时间')
plt.ylabel('尺度')
plt.title('时频域图')
plt.show()
在以上示例代码中,我们首先读取Excel文件中的第一列作为采样时间,第2到5列作为输出电压,并绘制了时域图。然后,我们使用小波变换函数pywt.wavedec对输出电压进行小波变换,并将噪声添加到小波系数中。接下来,我们设定一个阈值来剔除噪声信号,将系数的绝对值小于阈值的部分设为0,并使用逆小波变换函数pywt.waverec将过滤后的小波系数重构为特征信号。最后,我们使用连续小波变换函数pywt.cwt计算时频域图,并绘制显示。
请确保将your_excel_file.xlsx替换为实际的Excel文件路径。如果你想调整噪声振幅和阈值,请根据你的需求修改noise_amplitude和threshold的值。
希望这个示例能满足你的需求!如果还有其他问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/bj5D 著作权归作者所有。请勿转载和采集!