苹果手表测的心率还是脉率,是什么原理?

很多人手腕上戴着几千块的智能手表,看着手手表屏幕上跳动的心率数值,却没想过这玩意儿到底是怎么算出来的。

直接回答你的问题:苹果手表背面的那几颗发光的传感器,测的严格来说是“脉率(Pulse Rate)”,但在绝大多数健康人身上,它等效于“心率(Heart Rate)”。

真正意义上的“心率”测量是心电图(ECG),也就是测心脏起搏细胞发出的电信号。而手表背面的绿光,工程学上叫 光电容积脉搏波描记法(PPG, Photoplethysmography)

今天我们从底层硬件和数学逻辑来看看这到底是怎么回事。

1. 物理层:用绿光“看”血管的容积变化

翻过你的苹果手表,你会看到几颗绿色的 LED 灯和旁边黑色的光电二极管。

原理极其直接:血液是红色的,所以它反射红光,强烈吸收绿光。

手表背面的光学发射模块
  • 当你的心脏一收缩(射血),一股动脉血被泵入你手腕的微血管网。此时血管膨胀,血液容积达到巅峰,吸收了大量的绿光,导致反射回光电二极管的绿光瞬间减少。
  • 当心脏舒张时,血液回流,手腕血管里的血液容积变小,吸收的绿光变少,反射回去的绿光又变多了。

通过持续高频地闪烁绿光并记录反射光的强度,手表就把你每一次心跳导致的微血管容积的机械变化,硬生生转换成了一维的光电信号波动曲线。这就是 PPG。

血管反射绿光后被传感器捕捉,得到PPG波形

2. 数学层:用 FFT 找心跳

拿到 PPG 原始波形后,你以为直接数波峰就能算出 BPM(每分钟心跳数)了吗?

在真实场景中,你手臂随便晃一下、表带稍微松一点,或者环境光漏进去一点,都会在波形上砸出巨大的毛刺和基线漂移(运动伪影)。

传感器采集得到的PPG信号示意图

这时候,就轮到信号处理里的经典算法出马:快速傅里叶变换(FFT)

正常人的心跳频率是受限的,一般在 0.8 Hz 到 3 Hz 之间(对应 48 到 180 BPM)。

FFT 跑完后,我们只需要在这个特定的低频频带内,寻找能量(幅度)最高的那一根频谱柱,找到它对应的峰值频率,然后直接套公式:

\text{BPM} = f_{peak} \times 60

只要血液容积的周期性变化还在,FFT 就能在频域里把这个周期特征找出来。

FFT后的PPG信号:峰值乘以60就能估测你的心率

3. Talk is cheap, show me the code

无论是手表的 PPG 信号,还是我在前面专栏里聊过的 FMCW 毫米波雷达相位信号,它们在工程本质上是一模一样的:都是被严重噪声和体动污染的、微弱的一维生理信号。

理论看着简单,但当你自己上手去写代码、去处理真实的原始数据时,你才会发现滤波器的截止频率怎么设、窗函数怎么加、碰到同频干扰怎么解混,全都是深坑。

为了让大家少走弯路,直观感受底层算法是怎么把脏数据洗干净的,我在 GitHub 上开源了一套信号预处理工具箱:

👉 GitHub:

[CWT-PPG-Toolbox]

如果你对底层信号处理感兴趣,与其看干瘪的理论公式,不如直接 Clone 下来。跑一跑代码,自己做一下 FFT 和时频分析,看看真正的一维生理特征是怎么从噪声中被“挖”出来的。

我是phish,带你从物理层面探索生理信号的边界。如果这个解答对你有用,请点个Star吧~(也非常期待同行来Github参观我的Repo)

编辑于 2026-03-18 · 著作权归作者所有