信号数据(eeg,ecg,心率等)- 深度学习
信号数据在送入网络前都需要对信号数据进行经过处理,降噪,去噪等;对于信号类数据去噪的方法有很多,比如:傅里叶变换,小波变换,中值滤波法等等。
左图为去噪前,中间子图为去噪后,右侧子图为去噪前后的对比图。
下面时随机生成的信号数据并进行滤波处理的代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, filtfilt# 参数
fs = 256 # 采样率
duration = 1 # 秒
n_samples = int(fs * duration)
t = np.arange(n_samples) / fs# 1. 生成“EEG 类似”随机信号 + 噪声
rng = np.random.default_rng(42)
eeg = rng.standard_normal(n_samples) * 3e-6 # 3 µV 随机 walk
eeg += 0.5e-6 * np.sin(2*np.pi*10*t) # 加 10 Hz α 成分
eeg += 1e-6 * np.sin(2*np.pi*50*t) # 50 Hz 工频# 2. 设计滤波器
low, high = 0.5, 40
b, a = butter(N=4, Wn=[low, high], btype='band', fs=fs)# 3. zero-phase 滤波
eeg_filt = filtfilt(b, a, eeg)
2.快速傅里叶变换
1)幅度谱
代码
N = len(eeg_filt)
X_fft = np.fft.rfft(eeg_filt) # 实信号单边谱
freqs = np.fft.rfftfreq(N, 1/fs) # 对应频率轴
amp = np.abs(X_fft) * 2 / N # 归一化幅度
2)二维图
N = len(eeg_filt)
X_fft = np.fft.rfft(eeg_filt) # 复数
freqs = np.fft.rfftfreq(N, 1/fs) # 频率轴
amp = np.abs(X_fft) # 幅度
# 可选:归一化到 0-1
amp_norm = (amp - amp.min()) / (amp.max() - amp.min() + 1e-12)# 2. 生成二维「图像」:把谱复制 N_row 行
N_row = 64 # 任意行数,可调
fft_img = np.tile(amp_norm, (N_row, 1)) # shape = (64, len(freqs))
彩色:
希尔伯特变换 → 得到解析信号
把信号所有频率分量相位推迟90度。
代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, filtfilt
from scipy.signal import stft
from scipy.signal import hilbert# 参数
fs = 256 # 采样率
duration = 1 # 秒
n_samples = int(fs * duration)
t = np.arange(n_samples) / fs# 1. 生成“EEG 类似”随机信号 + 噪声
rng = np.random.default_rng(42)
eeg = rng.standard_normal(n_samples) * 3e-6 # 3 µV 随机 walk
eeg += 0.5e-6 * np.sin(2*np.pi*10*t) # 加 10 Hz α 成分
eeg += 1e-6 * np.sin(2*np.pi*50*t) # 50 Hz 工频# 2. 设计滤波器
low, high = 0.5, 40
b, a = butter(N=4, Wn=[low, high], btype='band', fs=fs)# 3. zero-phase 滤波
eeg_filt = filtfilt(b, a, eeg)from scipy.signal import hilbert# 4. 希尔伯特变换 → 得到解析信号
eeg_h = hilbert(eeg_filt) # 复数数组
eeg_envelope = np.abs(eeg_h) # 包络(瞬时幅度)
eeg_phase = np.angle(eeg_h) # 瞬时相位(可选)
eeg_instant_freq = np.diff(np.unwrap(eeg_phase)) / (2*np.pi) * fs # 瞬时频率(可选)plt.figure(figsize=(6,3))
plt.plot(t, eeg_filt*1e6, label='Filtered EEG', alpha=0.7)
plt.plot(t, eeg_envelope*1e6, label='Envelope (Hilbert)', linewidth=2, color='tab:orange')
plt.xlabel('Time (s)'); plt.ylabel('Amplitude (µV)'); plt.legend(); plt.tight_layout(); plt.show()