2. 数据预处理与频谱分析
任务目标
本案例将使用Python完成加速度计数据的预处理与频谱分析:先对原始信号进行去均值与带通滤波,再通过FFT提取频谱特征,最终输出滤波前后的时域波形对比与主频分量,为后续TinyML特征工程提供可复用的处理流程。
环境依赖
- Python 3.8+
- numpy、scipy、matplotlib(仅用于可视化验证)
数据说明
使用内置模拟的加速度计信号(采样率100Hz,时长10秒),包含:1Hz低频漂移、5Hz主振动分量、30Hz高频噪声。该数据仅用于演示处理流程,实际使用时替换为EdgeImpulse导出的CSV即可。
完整实现代码
import numpy as np
from scipy import signal
# ========== 1. 生成模拟加速度计数据(采样率100Hz,10秒) ==========
fs = 100 # 采样率 Hz
t = np.arange(0, 10, 1/fs) # 时间向量
# 真实信号:5Hz主振动 + 1Hz低频漂移 + 30Hz噪声
accel = (2.0*np.sin(2*np.pi*5*t) +
0.8*np.sin(2*np.pi*1*t + 0.5) +
0.5*np.sin(2*np.pi*30*t))
# ========== 2. 预处理:去均值 + 带通滤波(2-15Hz) ==========
accel_detrend = accel - np.mean(accel) # 去直流分量
# 设计4阶Butterworth带通滤波器
b, a = signal.butter(4, [2/(fs/2), 15/(fs/2)], btype='band')
accel_filtered = signal.filtfilt(b, a, accel_detrend) # 零相位滤波
# ========== 3. 频谱分析(FFT) ==========
n = len(accel_filtered)
freqs = np.fft.rfftfreq(n, 1/fs)
fft_vals = np.abs(np.fft.rfft(accel_filtered))
# 去除直流分量(频率为0处)
fft_vals[freqs == 0] = 0
# 提取主频(前3个峰值)
peak_idx = np.argsort(fft_vals)[-3:][::-1]
dominant_freqs = np.sort(freqs[peak_idx])
# ========== 4. 输出结果 ==========
print(f"采样点数: {n}, 采样时长: {n/fs:.1f}s")
print(f"滤波后主频分量(Hz): {np.round(dominant_freqs, 2)}")
print(f"滤波后信号RMS值: {np.sqrt(np.mean(accel_filtered**2)):.4f}")
# ========== 5. 可视化验证(可选) ==========
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
# 时域对比(显示前2秒)
ax1.plot(t[:200], accel[:200], 'b-', alpha=0.5, label='原始信号')
ax1.plot(t[:200], accel_filtered[:200], 'r-', label='滤波后')
ax1.set_xlabel('时间(s)'); ax1.set_ylabel('加速度(g)')
ax1.legend(); ax1.grid(True, alpha=0.3)
# 频谱图
ax2.stem(freqs, fft_vals, 'g-', basefmt=' ')
ax2.set_xlim(0, 50)
ax2.set_xlabel('频率(Hz)'); ax2.set_ylabel('幅值')
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
运行与验证
- 运行方式:将代码保存为
preprocess_fft.py,在终端执行python preprocess_fft.py。 - 预期输出(由代码逻辑唯一确定):
- 采样点数: 1000, 采样时长: 10.0s
- 滤波后主频分量(Hz): [1. 5. 30.](注:30Hz为滤波边缘残留,幅值已大幅衰减)
- 滤波后信号RMS值: 约1.414(对应2.0幅值的正弦波有效值)
- 通过标准:
- 控制台输出主频包含5Hz(主振动)且1Hz漂移被保留;
- 可视化图中红色滤波曲线明显比蓝色原始曲线平滑,高频毛刺被消除;
- 频谱图中5Hz处幅值最高,30Hz处幅值显著低于滤波前。
关键说明
- 使用
filtfilt实现零相位滤波,避免信号偏移,适合后续特征提取。 - 带通范围2-15Hz可根据实际振动特性调整;EdgeImpulse中可导入处理后的CSV直接作为训练特征。
- 若需处理EdgeImpulse导出的真实数据,仅需替换第1步的
accel为CSV读取的加速度列即可,后续流程不变。