解决方案|科普 | 从解决方案到底层实现:你的手机是这样进行睡眠监测的( 四 )


深浅睡和快速眼动(REM)这些基本数据都会有 。 入睡前有催眠曲 , 叫醒时会使用闹钟提醒起床 , 并且必须通过某些小测验才能解锁并停止闹钟 , 以证明你真的清醒了 。 当然 , 这对那些梦里都能操作的人来说 , 或许……没什么用 。

解决方案|科普 | 从解决方案到底层实现:你的手机是这样进行睡眠监测的
文章图片

Sleep as Android
cSleep as Android 用户手册
睡眠追踪如何监测睡眠
下面就是重点了 , 我们从软件到硬件层面聊一下睡眠监测的技术实现方式和原理 。
通过传感器获取原始数据
不管是系统应用还是三方应用 , 其实应用软件本身在原始数据采集这一步能做的事情并不是很多 , 重点还是在数据的二次加工及使用上 。 比如 Apple 和国内 Android 厂商的系统级健康 App , 其数据采集方式都是差不多的 。
在手机设备上 , 它们无非是通过加速度传感器、光学传感器、扬声器/麦克风等元器件记录设备整晚的位移变化、光强度变化、声音变化信息 , 这些数据有分散也有连贯的 。 一些较为特殊的指标比如心率、血氧等 , 就依赖手表等穿戴设备来获取 。
简单地讲 , 加速度传感器的数据源是最为重要的 , 它往往作为睡眠类 App 的主要训练分析对象 , 其他数据源作为辅助优化训练结果 。 我之前在使用小米健康的时候 , 它就会请求身体运动信息等类似权限 , 并告诉你尽量放在枕边 , 保证你自己和手机睡在同一张床上 , 以此来监测你入眠后翻身、扭头等动作带来的振动 , 作为深浅睡的识别依据 。
例如 , 对 Android 应用开发者来说 , 监听部分传感器的数据实现起来也非常简单 , 系统底层框架已经屏蔽了不同手机设备的硬件差异 。
参考:运动传感器 - Android Developers
private SensorManager sensorManager; private Sensor sensor; // 直接使用Android SDK提供的系统服务即可 sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // 数据将以周期性事件的形式回调给开发者 , 加速度传感器是很多其他传感器的基础 public void onSensorChanged(SensorEvent event){ // In this example, alpha is calculated as t / (t + dT), // where t is the low-pass filter's time-constant and // dT is the event delivery rate. final float alpha = 0.8; // Isolate the force of gravity with the low-pass filter. gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; // Remove the gravity contribution with the high-pass filter. linear_acceleration[0] = event.values[0] - gravity[0]; linear_acceleration[1] = event.values[1] - gravity[1]; linear_acceleration[2] = event.values[2] - gravity[2]; }

推荐阅读