在移动健康领域,使用Android设备直接对接EEG脑电图采集硬件已经成为一种低成本的技术方案。不同于传统台式机配合专业采集卡的模式,Android端需要处理蓝牙低功耗传输、系统调度延迟以及有限的运算资源。EEG信号本身是非常微弱的毫伏级甚至微伏级电位差,如果不加处理直接绘制,看到的往往只是噪声。因此,从硬件拿到数据到在屏幕上呈现出有意义的脑波节律,中间必须经过严格的通道解析、滤波和特征提取步骤。

BLE通信与EEG数据帧解析
绝大多数消费级EEG设备通过BLE GATT协议向Android手机推送数据。在Android中,我们使用BluetoothGattCallback来接收通知。每一帧通常包含多个通道的样本,有的设备还会在帧头放入时间戳和包序号。解析时必须注意字节序,EEG原始数据一般是小端排列的短整型,直接强转会出现符号错位。建议在onCharacteristicChanged里用ByteBuffer以ByteOrder.LITTLE_ENDIAN读取,避免手动移位带来的bug。
下面是一段典型的解析代码,假设一帧含八个通道,每个通道两个字节:
private void parseEegFrame(byte[] frame) {
// 帧头两个字节为包序号
ByteBuffer bb = ByteBuffer.wrap(frame).order(ByteOrder.LITTLE_ENDIAN);
int seq = bb.getShort() & 0xFFFF;
int channels = 8;
short[] samples = new short[channels];
for (int i = 0; i < channels; i++) {
samples[i] = bb.getShort(); // 小端有符号短整型
}
// 将samples送入处理队列
EegPipeline.getInstance().feed(samples, seq);
}
在真实测试环境中,Android的BLE回调并不保证等间隔到达。我们曾用示波器比对过某款设备的广播间隔和手机端接收时间,发现系统Doze模式会让部分帧延迟上百毫秒。因此在数据解析之外,必须记录每个包的到达时间戳,后续做重采样时才能还原真实采样率。这也是很多开发者在Android EEG分析测试中得出错误频段功率的根本原因。
端侧滤波与工频干扰抑制
EEG信号最头疼的问题是五十赫兹工频干扰,以及由肌肉运动带来的高频伪迹。在Android端做实时滤波,首选有限冲激响应滤波器,因为它的相位线性,不会让波峰位置偏移。我们可以设计一个低通加陷波的组合:低通截止在三十五赫兹保留脑波主体,陷波中心放在五十赫兹消除电网噪声。相比无限冲激响应滤波器,FIR在移动端用定点运算也能跑得很稳。
下面给出一段FIR滤波的实现片段,使用直接型结构,系数由MATLAB导出后硬编码:
public class FirFilter {
private final float[] coeff; // 滤波系数
private final float[] buf; // 延迟线
private int pos = 0;
public FirFilter(float[] coeff) {
this.coeff = coeff;
this.buf = new float[coeff.length];
}
public float process(float x) {
buf[pos] = x;
float sum = 0f;
int idx = pos;
for (int i = 0; i < coeff.length; i++) {
sum += coeff[i] * buf[idx];
idx = (idx - 1 + buf.length) % buf.length;
}
pos = (pos + 1) % buf.length;
return sum;
}
}
在Android EEG脑电图分析测试时,不要指望在UI线程跑滤波。我们一般用HandlerThread或者Executors.newSingleThreadExecutor把数据喂给滤波对象。测试表明,在骁龙六系列芯片上,八通道四阶以上FIR每样本耗时就接近零点一毫秒,若叠加快速傅里叶变换,必须控制每次变换的窗口长度,否则会出现不可接受的卡顿。合理的做法是每两百毫秒做一次零点五秒的滑动窗频谱。
分析测试指标与性能对比
完成采集与滤波后,EEG分析测试的核心指标包括各频带相对功率、注意力指数以及信号质量标志。Alpha波八到十三赫兹反映放松状态,Beta波十三到三十赫兹关联专注度。我们可以在Android端用自写的Goertzel算法提取单频点能量,比完整FFT更省电。测试阶段应同时记录CPU占用和内存波动,中低端机建议把缓冲队列上限设为两秒数据,防止OOM。
下表列出了两种处理模式的资源占用对比,基于同一款八通道设备、采样率二百五十赫兹的实测:
| 处理模式 | 平均CPU | 内存峰值 | 延迟 |
|---|---|---|---|
| 实时滤波加FFT | 18% | 42MB | 220ms |
| 离线导出后分析 | 3% | 20MB | 无实时性 |
从表里能看出,实时分析测试对资源要求明显更高,但在需要反馈训练的场景中不可避免。我们推荐在Android端只做轻量滤波和频带能量,把原始数据同时写入文件,方便后续用Python做精细溯源。这样既不丢失信息,也保证了App在旧设备上不闪退。经过多轮Android EEG脑电图分析测试,这种分层策略已被验证为最稳妥的工程落地方式。