用python将一个以500HZ下采样的电压值的.csv文件下将数据画成时域图和频域图后进行滤波,并生成滤波后的图片,然后用机器学习的去噪代码
时间: 2024-05-10 13:21:41 浏览: 66
来对比滤波前后的效果。
首先,我们需要读取.csv文件并绘制时域图和频域图。
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# 读取.csv文件
data = pd.read_csv('data.csv')
# 获取电压值
voltage = data['voltage'].values
# 计算采样频率
fs = 500
# 计算时间轴
time = np.arange(len(voltage)) / fs
# 绘制时域图
plt.plot(time, voltage)
plt.xlabel('Time (s)')
plt.ylabel('Voltage (mV)')
plt.show()
# 计算FFT
freq, fft = signal.periodogram(voltage, fs)
# 绘制频域图
plt.plot(freq, fft)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power Spectral Density (V^2/Hz)')
plt.show()
```
接下来,我们使用巴特沃斯滤波器进行滤波,并绘制滤波后的时域图和频域图。
```python
# 设计巴特沃斯滤波器
b, a = signal.butter(4, 20, 'low', fs=fs)
# 应用滤波器
filtered_voltage = signal.filtfilt(b, a, voltage)
# 绘制滤波后的时域图
plt.plot(time, filtered_voltage)
plt.xlabel('Time (s)')
plt.ylabel('Voltage (mV)')
plt.show()
# 计算滤波后的FFT
freq, filtered_fft = signal.periodogram(filtered_voltage, fs)
# 绘制滤波后的频域图
plt.plot(freq, filtered_fft)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power Spectral Density (V^2/Hz)')
plt.show()
```
最后,我们可以使用机器学习的去噪代码(如Wavelet去噪)对比滤波前后的效果。这里我们使用pywt库实现Wavelet去噪。
```python
import pywt
# 设置Wavelet去噪参数
wavelet = 'db4'
level = 4
threshold = 0.1
# 进行Wavelet去噪
coeffs = pywt.wavedec(filtered_voltage, wavelet, level=level)
for i in range(1, len(coeffs)):
coeffs[i] = pywt.threshold(coeffs[i], threshold * max(coeffs[i]))
denoised_voltage = pywt.waverec(coeffs, wavelet)
# 绘制去噪后的时域图
plt.plot(time, denoised_voltage)
plt.xlabel('Time (s)')
plt.ylabel('Voltage (mV)')
plt.show()
```
通过比较滤波前后的效果和Wavelet去噪后的效果,我们可以选择最适合我们数据的方法进行去噪。
阅读全文