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

运行与验证

  1. 运行方式:将代码保存为 preprocess_fft.py,在终端执行 python preprocess_fft.py。
  2. 预期输出(由代码逻辑唯一确定):
    • 采样点数: 1000, 采样时长: 10.0s
    • 滤波后主频分量(Hz): [1. 5. 30.](注:30Hz为滤波边缘残留,幅值已大幅衰减)
    • 滤波后信号RMS值: 约1.414(对应2.0幅值的正弦波有效值)
  3. 通过标准:
    • 控制台输出主频包含5Hz(主振动)且1Hz漂移被保留;
    • 可视化图中红色滤波曲线明显比蓝色原始曲线平滑,高频毛刺被消除;
    • 频谱图中5Hz处幅值最高,30Hz处幅值显著低于滤波前。

关键说明

  • 使用filtfilt实现零相位滤波,避免信号偏移,适合后续特征提取。
  • 带通范围2-15Hz可根据实际振动特性调整;EdgeImpulse中可导入处理后的CSV直接作为训练特征。
  • 若需处理EdgeImpulse导出的真实数据,仅需替换第1步的accel为CSV读取的加速度列即可,后续流程不变。
加速度计数据预处理与频谱分析流程 原始加速度数据 100Hz采样 含噪声/漂移 预处理 ① 去均值(去直流) ② Butterworth带通滤波 2-15Hz, 4阶, filtfilt 频谱分析 FFT变换 提取主频分量 幅值谱计算 特征 主频 RMS值 关键参数与效果 采样率: 100Hz 带通范围: 2-15Hz 滤波器阶数: 4阶 滤波前: 5Hz + 1Hz漂移 + 30Hz噪声 滤波后: 保留1Hz和5Hz, 抑制30Hz 验证标准: 频谱中5Hz幅值最高, 30Hz幅值显著衰减 滤波后频谱示意 1Hz 5Hz 30Hz