信号数据预测方法分类

点对点:用前面几个时间点预测未来时间点

条对条:一段时间范围内得信号预测

块:一整个时间范围内得数据进行预测

信号数据在送入网络前都需要对信号数据进行经过处理,降噪,去噪等;对于信号类数据去噪的方法有很多,比如:傅里叶变换,小波变换,中值滤波法等等。

左图为去噪前,中间子图为去噪后,右侧子图为去噪前后的对比图。

下面时随机生成的信号数据并进行滤波处理的代码

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()

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐