安卓计步算法论文详解

333 阅读38分钟

论文标题

《A Smartphone Step Counter Using IMU and Magnetometer for Navigation and Health Monitoring Applications》

论文链接

www.mdpi.com/1424-8220/1…


2025-06-09 更新:

运行示例一:实际跑步 52,算法结果 52. 246641749453762_.pic.jpg

运行示例二:实际跑步 100,算法结果 101. 246651749453783_.pic.jpg

运行示例三:实际跑步 281,算法结果 283. 246661749453812_.pic.jpg

运行示例四:实际走路 50,算法结果 50. 246681749453865_.pic.jpg

运行示例五:实际走路 100,算法结果 101. 246691749453890_.pic.jpg

总体准确率 99.8%,远超现有市面上传统计步算法。

后续计划更新(TODO LIST):

  1. 实时数据计算。
  2. 采样率实时预估(现阶段是固定 50Hz).
  3. 身高、性别对初始阈值的影响。
  4. LS 方向估计。
  5. 位移验证。
  6. 陀螺仪、磁力计周期性验证。

处理流程和逻辑结构

智能手机计步算法总体上包括传感器信号预处理、步伐候选检测、多传感器融合验证和最终步伐确认等步骤 。图1以流程图形式概括了该算法的处理流程:

flowchart TD
    Start([开始: 传感器原始数据]) --> Filter[自适应IIR低通滤波<br/>去除噪声]
    Filter --> AccNorm[计算加速度合成幅值<br/>(加速度范数)]
    AccNorm --> PeakDet[峰/谷值检测<br/>(滑动窗口3点)]
    PeakDet --> TimeFilter[时间阈值过滤<br/>(更新/拒绝区间)]
    TimeFilter --> AmpFilter[幅值差过滤<br/>(峰谷差与伪零线)]
    AmpFilter --> UpdateCutoff[根据步速更新滤波截止频率<br/>和时间阈值]
    UpdateCutoff --> HighMotion{高姿态变化?\(陀螺仪/磁场高方差)}
    HighMotion -- 是 --> SensorFusion[陀螺仪&磁力计峰/谷提取<br/>及与加速度峰对齐验证]
    HighMotion -- 否 --> SkipFusion[跳过姿态传感器验证]
    SensorFusion --> StepValidation[步伐验证<br/>(双积分位移)]
    SkipFusion --> StepValidation
    StepValidation --> Valid{步伐位移 > 阈值?}
    Valid -- 是 --> Count[计步 +1]
    Valid -- 否 --> Reject[剔除假步]
    Count & Reject --> End([结束])

图1:智能手机计步算法流程图

首先对IMU传感器数据进行自适应低通滤波,计算三轴合成加速度并检测初始峰/谷候选 。接着应用时间过滤幅值过滤去除紧邻或幅值不足的伪峰伪谷 。在设备剧烈运动(如手持晃动)情况下,陀螺仪磁力计通道将执行条件分支:提取其主轴的周期峰/谷并要求与加速度峰同步匹配,否则判为干扰 。最后对每个检测到的步伐区间进行线性加速度双积分计算位移,并与动态阈值比较验证步伐的真实性 。

完整技术方案及实施步骤

本文提出了一种无需预设阈值和分类器的自适应计步算法 。完整方案面向自由手持设备,在不同步态(如快走、慢走、跑步)和不同持机方式(手持悬垂、打字、通话、口袋等)下都能鲁棒检测步伐 。其实施步骤如下:

  1. 惯性传感器数据采集与预处理:从智能手机的加速度计和陀螺仪读取三轴加速度和角速度,以及磁力计的三轴磁场强度。首先对这些原始信号应用自适应低通滤波,衰减高频噪声和瞬态抖动 。滤波器采用低阶Butterworth IIR,以保证实时性(低延迟)和足够的过渡带陡度 。滤波截止频率根据最近步伐频率连续调整,以在不损失有效步伐信息的前提下最大程度滤除运动噪声 。例如,行走变慢则降低截止频率,行走加快则提高截止频率,避免固定截止频率造成信号过滤或欠滤 。

  2. 加速度峰谷候选检测:计算滤波后加速度三轴的合成加速度幅值(加速度范数)an=ax2+ay2+az2a_n=\sqrt{a_x^2 + a_y^2 + a_z^2},作为后续步态特征分析的基础 。采用滑动窗口(长度3)的极值检测算法识别合成加速度波形中的局部峰值和谷值候选点 。判定准则是窗口中心点大于相邻点则标记为“峰”,小于相邻点则标记为“谷” 。公式(3)形式化描述了该判断条件。每检测到一个峰或谷,将其时间戳和幅值记录为步伐可能事件,进入候选列表。

  3. 自适应时间过滤(Temporal Filtering) :由于噪声可能导致连续出现两个紧邻的峰(或谷),需要时间间隔上的约束来消除伪峰/谷 。算法维护一个更新区间拒绝区间: 当新峰/谷出现过快(在上一次事件之后过短时间内),则落入拒绝区间而被忽略,因为正常步态在峰到谷的过渡阶段(拒绝区)不应出现新的峰/谷 。如果在合理时间后出现,则进入更新区间,有可能替换之前检测的峰/谷 。具体地,算法根据前一对峰/谷时间间隔自适应设定新的时间阈值:起始阈值thsths约为上一半步时长的一半(50%),终止阈值thethe约为当前峰/谷间隔的30% 。在实际实现中,当新峰/谷出现且距上一个事件超过thsths时,才认为进入更新区,可以考虑更新;若此新事件在出现时间上距离原事件小于thethe,且幅值更高(峰)或更低(谷),则用新事件替换旧事件 。如此动态调整,可滤除异常尖刺并确保每个步态周期仅保留一对峰谷。公式(4)–(8)给出了时间过滤过程中各阈值计算和替换判据。

  4. 峰谷幅值差与伪零线计算:每确认一对峰/谷之后,计算该步态周期的峰谷差Δan=apnavn\Delta a_n = a_{p_n} - a_{v_n},反映当前步伐的加速度振幅 。同时计算峰值和谷值幅度的平均值作为伪零交叉水平,pzc,pzc(pseudo zero crossing)。此平均值近似对应步态信号的基线,在步态转换(峰转谷或谷转峰)时刻加速度将通过该水平。pzcpzc也代表当前步结束和下一步开始的加速度幅值水平。基于最近几步的Δa\Delta a,算法自适应调整滤波器的截止频率以及下一步峰/谷期望出现的时间间隔阈值,以适应步速的渐变。例如,若最近峰谷差值持续增大,表明步速加快,则相应提高滤波带宽并缩短时间阈值;反之则降低带宽并延长阈值。算法通过监测当前与上一周期峰谷差之差ΔanΔan1\Delta a_n-\Delta a_{n-1}是否超出预设的“提速阈值”或“减速阈值”来检测步速的突然变化。当检测到显著加速或减速时(例如ΔanΔan1>suth\Delta a_n-\Delta a_{n-1}>su_{th}<sdth<sd_{th}),根据公式(12)重新计算滤波参数索引或步频估计值,从而实时调节滤波器

  5. 陀螺仪数据融合验证:在某些使用情况下(如手持悬摆手机行走),设备会产生明显的周期性旋转运动。算法通过陀螺仪角速度信息来辅助验证步伐峰值 。具体做法是对一定时间窗口内陀螺仪三轴角速度计算方差σωx,σωy,σωz\sigma_{\omega x}, \sigma_{\omega y}, \sigma_{\omega z},选取方差最大的轴作为主要摆动方向 。对该主轴的角速度信号应用与加速度相同的方法提取周期峰/谷。在正常行走中,人体手臂(或持手机)摆动频率通常是步频的一半 (每跨两步手臂完成一个全摆动周期)。因此陀螺仪主轴信号的峰/谷应与加速度峰一一对应或每两个加速度峰对应一个陀螺峰,且呈现固定的相位关系 。算法将检测到的陀螺仪峰/谷与最近的加速度峰进行时间匹配:只有当陀螺仪峰在加速度峰的预定时间窗口内出现,才认为该加速度峰有效 。如果出现高角速度变化但与加速度信号的峰不吻合,则怀疑该加速度峰可能由非步行动作引起(比如挥动手机)而不是真实步伐 。这种情况下,可标记该步伐候选为不可靠,等待后续进一步验证(如最终位移验证将否决它)。

  6. 磁力计数据融合验证:磁力计测量的环境磁场在短时间内应基本恒定,除非设备姿态改变导致磁场在机体系下的分量发生变化 。因此,手机在手中晃动时,磁力计轴向读数也会出现与步伐同步的周期波动。算法类似地计算磁力计三轴在滑动窗口内的方差σmx,σmy,σmz\sigma_{mx},\sigma_{my},\sigma_{mz},选取变化最大的轴作为主要参考 。计算该主轴磁场分量的峰/谷,并与加速度峰进行匹配验证 。由于每一步行走中设备姿态改变引起的磁场强度变化通常频率也约为步频的一半 ,故磁力计的峰值应周期性出现并与对应步伐的加速度峰在时间上接近。算法要求磁力计峰与加速度峰同步匹配,否则判定存在磁干扰或异常情况 。例如,如果陀螺仪检测到周期运动而磁力计信号杂乱无峰,则意味着环境磁场受干扰,磁力计数据不可靠,此时算法可依赖陀螺仪进行验证 ;反之,如果磁力计出现周期变化而陀螺仪没有对应峰,也可能表明磁场变化并非由惯性运动引起,需要谨慎对待。这种多传感器交叉验证机制提高了步伐检测的鲁棒性,在高动态运动情况下有效降低误检率。

  7. 步伐位移双积分验证:最终,对通过上述筛选的每一对峰/谷(代表一步)进行线性加速度的双积分计算位移,以验证该步伐是否产生了足够的位移运动 。首先使用手机姿态解算(例如引用文献[47]的方法)将机体加速度转换到当地水平坐标系,从中剔除重力分量,得到纯粹的线性加速度 。然后在当前步伐时间窗口内(从步开始峰到步结束峰对应的时间段)对线性加速度信号进行两次积分,得到该步的位移dnd_n 。计算过程中采用高速采样率下的离散积分(数值近似双积分),累加步态全过程的速度和位移增量。接着,基于最近kk步(论文中取k=3k=3)的平均步长,计算自适应步幅阈值thsths,一般取为最近平均步移的60% 。这一比例系数0.6是为了补偿从跑步突然减速为走路时步幅急剧下降的情况,并过滤掉仅由手臂晃动而无实质位移的假步 。最后,将当前步位移dnd_n与阈值thsths比较:若dn>thsd_n > ths则判定为有效步伐,计入步数;否则认为可能是手机静止状态下的虚假计步信号,将其剔除不计 。步幅阈值会随步态变化持续更新,以适应用户行走速度的变化 。

通过以上步骤,算法可在实时处理传感器数据的同时,自适应地调节检测阈值,无需人工设置固定参数,就能够精准捕捉步伐。整个流程在每个传感器采样周期(epoch)进行一次峰/谷检测延迟,具有实时性 。算法模块化地由滤波峰检测时间/幅值过滤陀螺仪验证磁力计验证步伐确认等组成,各模块对应论文中的算法1至算法6,主控制流程见算法7 。这一技术方案全面融合了IMU的线性和角运动信息及磁场变化信息,能适应不同姿态和步态,较传统单一加速度计方法更鲁棒可靠。

核心算法解析

本节提炼论文中的核心算法,包括传感器信号处理方法、步态检测机制、传感器数据融合策略、阈值滤波策略和步伐验证逻辑等。

1. 自适应传感器信号预处理:采用IIR巴特沃斯低通滤波器对加速度计和陀螺仪数据进行实时平滑 。滤波器阶数选得较低(论文中为2阶左右),以减少群延迟,满足实时性要求 。为弥补低阶滤波过渡带较缓的问题,算法通过自适应调整截止频率来抑制未滤尽的高频噪声 。具体而言,算法根据最近步伐的时长/频率估计结果,动态更新低通滤波器的截止频率fcf_c:步频升高则提高fcf_c,步频降低则降低fcf_c,从而跟踪步态频率的变化 。这样的自适应滤波保证了在各种步速下,信号中的主要步伐成分(通常在0.5–3Hz范围)能够通过滤波保留下来,而高于此带宽的噪声被显著衰减 。该模块对应算法1和算法2的部分功能,即持续接收传感器数据并更新滤波参数。

2. 峰/谷步态候选检测:滤波后的加速度在每个轴方向仍会叠加重力分量和低频漂移。为消除姿态影响,论文采用加速度合成向量的范数an=ax2+ay2+az2a_n=\sqrt{a_x^2+a_y^2+a_z^2}来检测步伐 。由于重力是恒定的,在行走过程中合成加速度ana_n将围绕一个平均值上下波动,形成接近周期正弦的波形 (见论文Figure 1)。算法通过3点窗口极值比较来初步识别波形的峰值和谷值 。窗口长度为3意味着比较当前样本与其前后相邻样本:若当前合成加速度an1|a_{n-1}|同时高于前一时刻an2|a_{n-2}|和后一时刻an|a_{n}|,则判定时刻(n1)(n-1)为一峰值;若低于两邻点则判为谷值 。这一判据如公式(3)所示。本步骤得到的一系列峰/谷候选对应加速度波动的局部极值点,可能对应实际步伐,也可能由于噪声造成伪检测。状态变量SS用于标记当前期待下一个极值的类型(峰或谷),以确保峰谷交替序列的正确性 。

3. 峰/谷时间间隔滤波:为滤除不合理的紧邻极值,算法设定动态时间阈值避免过短时间内重复计步 。利用前一次检测到的两个峰/谷事件之间的时间间隔Δt1\Delta t_1(如上一次峰到前一次峰的间隔或上一次谷到前一次谷,取决于步态的半周期),算法计算起始阈值ths=0.5×Δt1ths = 0.5 \times \Delta t_1 。这意味着新的峰/谷若在不到上一周期一半时间内出现,就很可能是上一步伐中的噪声尖刺,应予忽略 。当检测到一个峰/谷候选后,算法启动一个“更新窗口”,其起点即thsths,终点由结束阈值thethe决定 。结束阈值取当前候选与前一有效事件时间差Δt2\Delta t_2的30%,即the=0.3×Δt2the = 0.3 \times \Delta t_2 。这样,如果在初始候选出现后的较短时间内(不超过;the;;the;)又出现更大的峰(或更小的谷),则认为先前候选可能是噪声,引发候选更新:用新出现的峰/谷替换之前的候选 。若无更大候选,超过thethe后该峰/谷被确认,不再接受替换 。这实现了一种*“双保险”*:既防止过短间隔的重复计步,又允许在一定窗口内更新更精准的极值点,从而提高对实际峰谷位置和幅值的测量准确性。该逻辑对应论文的算法3,利用公式(4)–(8)实现阈值计算与峰/谷更新判断。

4. 峰谷幅度差与步频调整:每当确认一对新的峰/谷后,算法计算峰谷幅度差Δan=apnavn\Delta a_n = a_{p_n} - a_{v_n},反映当前这一步的振幅大小 。同时计算该峰和谷的平均值作为伪零交叉点pzcn=apn+avn2pzc_n = \frac{a_{p_n}+a_{v_n}}{2}pzcnpzc_n可看作加速度信号的动态基线,接近人在步行中重力和惯性力平衡的位置 。如果将加速度信号相对该基线看,则每一步开始或结束时加速度穿越此“零线” 。算法利用Δan\Delta a_n序列的变化来检测步速的改变:比较当前步幅值Δan\Delta a_n和前一步Δan1\Delta a_{n-1}的差异。如果Δan\Delta a_n相较之前大幅增加超过提速阈值suthsu_{th},或者大幅减少低于减速阈值sdthsd_{th}(通常sdth=suthsd_{th}=-su_{th}) ,则认为行走速度发生明显改变。此时算法将调整滤波器参数和时间阈值。例如,若检测到加速,则先按公式(12)根据当前半步时长估计新的步频f~s\tilde f_s ;随后选取相应的滤波器截止频率(论文中预先定义了5档滤波器频率,对应f~s\tilde f_s映射的索引Fi)和更新后的时间阈值范围,用于处理接下来的加速度数据 。反之,对于减速则降低滤波频率并放宽阈值。这种闭环自适应确保无论步态如何渐变,算法参数都会随之调整,始终保持对步伐信号的敏感度和对噪声的抑制力。峰谷差和伪零线还用于识别异常步态:例如若在理论“拒绝区间”内出现一个幅度足够大的反向峰且对pzcpzc有显著偏离,也可能暗示一次突发运动(比如突然跳动),算法可据此进一步处理 。

5. 陀螺仪融合验证算法:陀螺仪角速度提供了设备旋转运动的信息。在手臂悬摆手机行走的情形下,陀螺仪信号呈现与步伐相关的周期振荡 。算法通过主轴提取峰匹配实现加速度与陀螺仪的融合:

主轴提取:在每个新的步伐候选确认后,取陀螺仪最近一个步长时间窗口ω(n)\omega(n)的数据,计算各轴的方差σωx,σωy,σωz{\sigma_{\omega x},\sigma_{\omega y},\sigma_{\omega z}} 。选取方差最大的轴作为主要运动轴(对应手持方向的最大摆动平面),假设其反映了当前步态的主要摇摆模式 。仅对该轴的角速度信号执行峰/谷检测,以提取其半周期振荡特征。由于人的手臂摆动频率是步频的一半,陀螺仪主轴信号每出现一个峰对应两步(左右脚各一步) 。但在算法实现上,为了简单起见,也可以将每个陀螺峰与相邻的两个加速度步伐峰进行比较匹配。

峰同步匹配:对选定的陀螺仪轴提取出峰值序列后,算法将加速度峰时间陀螺仪峰时间进行比对。如果某次步伐检测到的加速度峰附近不存在陀螺仪峰(在允许的时间偏差范围内未匹配上),则该步伐标记为可疑 。反之,如果每个加速度峰都能找到对应的陀螺峰(可能一一或一对二的关系),则增加置信度。通过这种双传感器一致性检查,可以剔除一些仅由加速度瞬态变化但无身体摆动支撑的误检步伐。例如,用户站立不动但挥动手机造成加速度峰,这时陀螺仪也会有变化但可能不同步;算法发现不同步则不会计为有效步伐。

值得注意的是,陀螺仪和加速度的峰匹配并非绝对一一对应:在正常步行中,加速度每一步出现一个峰,而陀螺仪可能每摆动周期在双步中出现一个峰。因此论文中对峰匹配允许一定灵活性,只要求它们在时间上窗口重合即可 。如果陀螺仪显示明显周期运动而加速度未检测到相应峰,那可能算法漏检了步伐,此时陀螺仪峰可以促使算法补检(不过论文主要聚焦避免误检)。相反情况即加速度峰无陀螺峰相伴,则提示误检。如遇特殊情况——例如用户手持手机原地旋转但未走动,加速度计可能检测到假步,此时陀螺仪会有峰而磁力计无规律峰,算法可结合磁力计进一步判断(见下一步)。

6. 磁力计融合验证算法:磁力计提供了设备相对于地磁场方向变化的信息。在步行过程中,地磁场本身近似恒定不变(若无外界磁干扰),所以磁力计读数的变化主要源自手机姿态变化 。当手机随手臂摆动时,其朝向不断改变,在某一轴上的磁场投影会呈现周期性起伏(如同正弦波),周期与手臂摆动周期相同 。算法借鉴陀螺仪的处理,对磁力计数据窗口m(n)m(n)计算方差σmx,σmy,σmz{\sigma_{mx},\sigma_{my},\sigma_{mz}},选主变化轴并提取该轴的磁强度峰/谷序列 。然后将这些磁力计峰与对应的加速度峰进行时间比对。如果磁力计峰与加速度峰能较好对齐,则说明磁场变化与步伐一致,可增强步伐信号的置信度 。反之出现以下情况将降低置信度甚至判为干扰:

磁扰动识别:若陀螺仪显示显著周期运动而磁力计读数杂乱无显著峰,可能是环境磁场出现了短时扰动(例如附近有磁性物体或电流产生的磁场干扰)。论文指出,当检测到角速度峰而磁强度变化剧烈却没有同步峰时,就视作磁干扰 。算法在此情况下会忽略磁力计数据在步伐验证中的作用,避免被其误导,同时依赖陀螺仪和加速度继续判断。

纯磁变化剔除:反过来,如果磁力计出现了周期波动峰而陀螺仪没有对应峰,这可能意味着手机处于某种周期旋转的磁场环境中但身体没有产生对应的惯性运动。这种情况较少见,但算法同样会感知不一致,从而不单凭磁力计峰来计步。

通过陀螺仪和磁力计的双重条件,算法能应对各种复杂的持机姿态和环境。例如,在用户打字行走(手机姿态变化剧烈)或打电话行走(手机基本固定)等场景下,无论加速度信号如何变化,另两传感器的信息都用于确认步伐事件的可靠性 。

7. 步伐位移验证算法:这是最后的把关步骤,用以区分真正的行走步伐伪步伐(即手机动作引起的假步信号)。具体实现为对步骤2检测到并经步骤3-6筛选通过的每个峰-谷对,计算该区间内的线性加速度两次积分位移dnd_n 。在计算前,加速度先经过姿态旋转到水平-垂直系使重力对准竖直轴,然后减去重力,得到线性运动加速度序列 。采用数值积分求解:例如利用梯形法累积速度和位移,或其他数值滤波方法减小漂移误差。论文使用参考[47]的方向跟踪算法将加速度投影到局部水平坐标后积分 。得到步移dnd_n后,算法计算最近3步位移的平均值dˉ\bar d,取其60%作为当前步的位移阈值thsth_s 。若dn>thsd_n > th_s,则此步被确认为有效步伐;否则,如果dnd_n远小于近期平均步移(例如用户突然站定挥动手机导致峰谷振幅但无实际位移),就视为无效步伐,从计步结果中剔除 。阈值比例0.6的作用,是在跑步转走路时允许步移骤减仍能计步,同时又能过滤掉手机在静止时的小幅晃动 。步移阈值会随行走状态自适应更新(滑动窗口平均),以兼顾灵敏度和特异性。在实验中,这一简单的双积分验证对杜绝误计步非常有效:哪怕传感器噪声或其他算法环节有误报,只要没有产生实际位移,最终就不会计为步伐。

以上核心算法环环相扣:滤波提供平滑信号,峰/谷检测给出步伐候选,时间和幅值过滤提升准确性,陀螺仪/磁力计验证保障稳健性,最后位移积分确保真实性。整个方法无需训练模型,全程基于物理和统计阈值自适应调整,实现了高鲁棒性的计步检测 。

论文公式整理与解释

论文中出现的所有公式如下,根据原文顺序逐一列出并解释含义(括号中编号对应论文公式编号)。

公式 (1)ax=fx+gx,ay=fy+gy,az=fz+gz\displaystyle a_x = f_{x} + g_{x},\quad a_y = f_{y} + g_{y},\quad a_z = f_{z} + g_{z}

解释:这是加速度计测量值的分量表达式,表示在机体坐标系下,测得的总加速度[ax,ay,az][a_x,a_y,a_z]线性加速度(又称比力或惯性加速度)[fx,fy,fz][f_x,f_y,f_z]重力加速度[gx,gy,gz][g_x,g_y,g_z]之和构成 。其中gx,gy,gzg_x,g_y,g_z在静止时通常为[0,0,,9.81],m/s2[0,0,,-9.81],\text{m/s}^2(取决于坐标系方向)。简而言之,加速度计输出 = 惯性加速度 + 重力(忽略噪声和偏置)。该关系用于解释步行时加速度计读数的组成,为后续通过过滤和坐标变换分离重力打下基础。

单位:加速度分量单位为m/s²。

公式 (2)Acc2=Facc2+g22,Facc;g;cos(φ)\displaystyle Acc^2 = F_{\text{acc}}^2 + g^2 - 2,F_{\text{acc}};g;\cos(\varphi)

解释:这是加速度合成幅值的平方展开式,其中Acc=ax2+ay2+az2Acc=\sqrt{a_x^2+a_y^2+a_z^2}为加速度向量范数(净加速度幅值),Facc=fF_{\text{acc}}=|\mathbf{f}|是线性加速度的幅值(即比力大小),g=gg=|\mathbf{g}|是重力加速度大小,φ\varphi为线性加速度方向与重力方向之间的夹角 。该公式由向量余弦定理得出,表明加速度计读数的大小取决于线性运动强度和方向相对于重力的夹角。当φ=0\varphi=0(加速方向向下,与重力同向)时,Acc=FaccgAcc = |F_{\text{acc}}-g|达到最小;当φ=180\varphi=180^\circ(向上,与重力反向)时,Acc=Facc+gAcc = F_{\text{acc}}+g最大。此关系说明了步行时合成加速度将围绕重力值上下波动产生周期变化(对应步伐的上下加速和减速) 。例如,在平直行走中,FaccF_{\text{acc}}gg夹角周期变化,导致AccAcc呈近似正弦振荡。

单位:两边都是加速度平方,单位(m/s²)²。

公式 (3)峰判据an1<an>an+1a_{n-1} < a_{n} > a_{n+1}谷判据an1>an<an+1a_{n-1} > a_{n} < a_{n+1}

解释:滑动窗口极值检测条件:对于当前加速度幅值序列中的第nn个样本ana_n,若满足ana_n大于前后相邻样本(an1a_{n-1}an+1a_{n+1}),则ana_n被标记为一个峰值;若ana_n小于前后相邻值,则标记为谷值 。该公式实际包含两条不等式,对峰和谷分别给出判定准则。这实现了局部极大/极小值检测,用于初步识别步伐信号中的峰和谷候选点。如图9所示,蓝色区域表示新的峰/谷可更新范围,红色区域表示拒绝范围 (这与公式(4)–(8)定义的时间阈值有关,见下)。

单位:涉及比较的都是加速度幅值ana_n(m/s²),不涉及单位转换。

公式 (4)Δt1=t(pv)n1t(pv)n2\displaystyle \Delta t_{1} = t_{(p|v) *{n-1}} - t*{(p|v)_{n-2}}

解释:时间间隔计算。t(pv)it_{(p|v) *{i}}表示第ii峰或谷发生的时间(无论峰或谷,用pvp|v表示泛指)* 。因此Δt1\Delta t*{1}是最近两次检测到的峰/谷事件之间的时间差。例如,若上一次识别的是峰,其前一个事件可能是谷,则Δt1\Delta t_1实际上代表上一个完整步伐周期的一半时间(峰到谷)或完整周期(峰到峰/谷到谷),取决于算法对索引的定义。根据论文描述,Δt\Delta t被解释为峰到谷之间的时间* 。很可能Δt1\Delta t_1对应上一个步伐的半周期时长,用于推算本步的时间阈值。

单位:若时间用秒计,则单位为s;实现中时间可能以采样点计,此时Δt1\Delta t_1为点数。

公式 (5)ths=0.5×Δt1\displaystyle th_{s} = 0.5 \times \Delta t_{1}

解释起始时间阈值计算。thsth_s代表允许下一个峰/谷出现的最短时间,设定为上一周期时间的一半 。也就是说,在上一次峰/谷发生后的0.5Δt10.5\Delta t_1时间内,新的峰/谷应被视为过早(处于拒绝区间)而忽略 。这样可避免由于噪声在上一步未结束时就误判出新的步伐事件。例如,若上一半步耗时0.5秒,则ths=0.25th_s=0.25秒,在此间隔内不应出现新的有效峰/谷。

单位:同Δt1\Delta t_1,若以秒计则ss

公式 (6)ths<Δt2=t(pv)nt(pv)n1\displaystyle th_{s} < \Delta t_{2} = t_{(p|v) *{n}} - t*{(p|v)_{n-1}}

解释更新区间起点条件Δt2\Delta t_{2}表示当前检测到的新峰/谷与上一确认事件之间的时间差 。公式(6)实际上包含一个条件和一个定义:当且仅当Δt2\Delta t_{2}大于thsth_s时,才认为新事件到来在合理时间之后,可以进入更新区域考虑替换 ;同时将该时间差定义为Δt2\Delta t_{2}。换言之,如果Δt2ths\Delta t_2 \le th_s,新事件落在拒绝区,不予考虑 。满足Δt2>ths\Delta t_2 > th_s后,新事件被暂存为候选峰/谷,并用于计算结束阈值the(见公式7)。

单位:时间,与thsth_s单位相同。

公式 (7)the=0.3×Δt2\displaystyle th_{e} = 0.3 \times \Delta t_{2}

解释结束时间阈值计算。theth_e表示从当前候选事件开始计算的更新区间长度,设定为当前峰/谷与上次事件时间差的30% 。即在新峰/谷出现后的theth_e时间窗内,如果又出现更“极端”的峰/谷(更高的峰或更低的谷),则判定之前候选可能不是真正峰/谷,需要更新替换 。反之,经过theth_e后若无更佳候选,则锁定当前峰/谷为有效。选择0.3倍主要是经验值,使更新窗口足够小以免延迟过久,又能捕获紧随其后的极值。

单位:时间单位(秒或采样间隔),同Δt2\Delta t_2

公式 (8)t(pv)n/rt(pv)n<the\displaystyle t_{(p|v) *{n/r}} - t*{(p|v) *{n}} < th*{e}

解释峰/谷替换条件t(pv)n/rt_{(p|v)_{n/r}}表示候补(replacement)峰/谷的时间 。公式(8)判断候补事件与当前事件的时间差是否小于结束阈值theth_e。如果是,则说明候补出现在更新区间之内,应与当前候选比较幅值大小,若更“极端”则替换当前峰/谷 。通过(6),(8)的配合,实现了论文所述“蓝色更新区间”和“红色拒绝区间”的逻辑 :thsth_s定义更新区起点,theth_e定义更新区长度,在更新区内出现的新峰谷即可用来更新,否则过了theth_e窗口就不再替换。

单位:时间差,单位同上。

(注:公式(4)–(8)共同实现了自适应时间过滤机制,用于剔除异常紧邻的极值并动态调整下一步的搜索窗口。公式(6)和(8)以不等式形式出现,实际在算法实现中对应if条件判断。)

公式 (9)pzcn=avg(apn,,avn)=apn+avn2\displaystyle pzc_n = \text{avg}(a_{p_n},,a_{v_n}) = \frac{a_{p_n} + a_{v_n}}{2}

解释伪零交叉(pseudo zero crossing)计算。apna_{p_n}avna_{v_n}分别是当前第nn步检测到的峰值和谷值加速度幅度 。二者的平均值pzcnpzc_n定义为步态信号的零交叉参考线,即在该幅值处认为步伐由“向上加速”切换为“向下加速”或反之 。物理上,它近似等于这一周期中重力和惯性力的平衡点加速度。因此,当加速度超过pzcnpzc_n向上运动,再降到pzcnpzc_n以下即完成一次上下往复。这一值用于标记步伐的开始/结束和后续判断异常峰(如判断拒绝区内峰相对pzcpzc的偏离程度) 。同时pzcnpzc_n随每步变化,可用于跟踪重力基线缓慢漂移或不同步态下基线变化。

单位:加速度 (m/s²)。

公式 (10)Δan=apnavn,Δan1=apn1avn1\displaystyle \Delta a_n = a_{p_n} - a_{v_n}, \qquad \Delta a_{n-1} = a_{p_{n-1}} - a_{v_{n-1}}

解释峰谷差分Δan\Delta a_n是当前步的峰值加速度与谷值加速度之差,表示该步伐加速度振幅;Δan1\Delta a_{n-1}是前一步的峰谷差 。这两个值用来衡量步与步之间步态幅度的变化。如果Δan\Delta a_n显著大于Δan1\Delta a_{n-1},说明步伐力度变大(走得更用力或速度加快);反之变小则可能减速。算法正是通过比较Δan\Delta a_nΔan1\Delta a_{n-1}来检测步速变化趋势。需要注意峰谷差与实际步长不完全线性相关,但通常步幅增加、步速加快会导致合成加速度振幅加大。

单位:加速度 (m/s²)。

公式 (11)ΔanΔan1>suth,ΔanΔan1<sdth\displaystyle \Delta a_n - \Delta a_{n-1} > su_{th}, \qquad \Delta a_n - \Delta a_{n-1} < sd_{th}

解释步速变化判据。该式给出了判断当前步伐强度变化是否超过阈值的条件: 若Δan\Delta a_n较上一步增加超过上升阈值suthsu_{th},则认为用户在加速行走;若减少超过下降阈值sdthsd_{th}则认为在减速行走。其中sdthsd_{th}通常取为suth-su_{th},即大小相等符号相反 。当满足任一条件时,算法认定步态发生显著改变,将触发自适应参数调整(公式12)。这些阈值可以通过经验或离线统计确定,论文中并未给出具体数值,但强调算法性能与阈值选择的鲁棒性:因为正常情况下步幅变化是逐渐的,不会每步剧烈波动,所以阈值可以设置为略大于自然波动范围即可。

单位:加速度差 (m/s²)。

公式 (12)f~s=FΔt×2\displaystyle \tilde{f}_s = \Big\lceil \frac{F}{\Delta t \times 2} \Big\rceil

解释步频估计。当检测到步速变化时,使用公式(12)估计当前的步频f~s\tilde f_s,即每秒走的步数 。FF为传感器采样频率(Hz),Δt\Delta t表示最近一次检测到的峰-谷时间差(半步时长)以采样点计。FΔt×2\frac{F}{\Delta t \times 2}相当于采样频率半步采样数×2\frac{\text{采样频率}}{\text{半步采样数}\times 2},化简即12Δt\frac{1}{2 \Delta t’}Δt\Delta t’为半步时间秒数),也就是当前步伐的频率(Hz)或两倍于半步频率。上式对该值取上限(天花板\lceil \cdot \rceil),可能是为了得到一个整数索引或保守估计频率。论文在算法实现中可能将f~s\tilde f_s用于选择滤波器预设参数,例如对应不同频率范围的滤波器系数索引Fi 。总之,公式(12)提供了依据最近步时长估算步频的方法,用于实时调整滤波和阈值参数,从而跟上步态变化 。

单位f~s\tilde f_s单位为Hz(每秒步数)。例如采样频率F=100F=100Hz,若峰到谷间隔Δt=50\Delta t=50点,则f~s=100/(50×2)=1=1\tilde f_s = \lceil 100/(50\times2)\rceil = \lceil 1 \rceil = 1Hz,即约每秒1步。

公式 (13)Mk=mxk2+myk2+mzk2\displaystyle M_k = \sqrt{m_{x_k}^2 + m_{y_k}^2 + m_{z_k}^2}

解释磁场强度合成MkM_k表示第kk时刻磁力计三轴读数[mxk,myk,mzk][m_{x_k},m_{y_k},m_{z_k}]的合成磁场强度(范数) 。在无外界磁扰的环境中,MkM_k应基本恒定,即Mk1MkM_{k-1} \approx M_k(见公式14)。通过计算磁场合成值,可以监测环境磁场是否稳定。若MkM_k出现显著变化,往往意味着有强磁干扰出现,因为地磁场不太可能瞬间大幅变化 。在算法中,MkM_k主要用于判断磁力计信号整体是否平稳,以便区别磁场变化由姿态引起(正常)还是环境突变引起(干扰)。

单位:磁感应强度,典型单位μT(微特斯拉)或mG(毫高斯)。

公式 (14)Mk1Mk\displaystyle M_{k-1} \approx M_k

解释地磁场近似恒定。该关系表示相邻时刻测得的磁场强度大小几乎相等 。在无干扰情况下,地磁场变化极其缓慢,因此MM的变化主要来自手机姿态改变而不是环境改变。公式(14)强调了这一点,用“\approx”表示在短时间步长内MM基本不变。算法利用这一假设,当观测到MM值异常波动时,就可判断出现了磁扰动(破坏了Mk1MkM_{k-1}\approx M_k),需降低对磁力计数据的信任度 。

单位:同MkM_k,μT。

公式 (15) :$\displaystyle \begin{cases}

m_{x_k} = M_k \cos(\theta_{x_k})[6pt]

m_{y_k} = M_k \cos(\theta_{y_k})[6pt]

m_{z_k} = M_k \cos(\theta_{z_k})

\end{cases}$

解释磁场分量投影关系θxk,θyk,θzk\theta_{x_k},\theta_{y_k},\theta_{z_k}分别是地磁场向量(大小MkM_k)与机体坐标各轴之间的夹角 。上式表示磁力计在机体各轴的读数等于地磁场矢量在该轴上的投影,即MkM_k乘以与轴的夹角余弦。由于MkM_k近似不变(公式14),当手机姿态改变时,不同轴的cos(θ)\cos(\theta)会周期性变化,从而导致mxk,myk,mzkm_{x_k},m_{y_k},m_{z_k}的周期变化,但三轴合成MkM_k保持恒定 。这一性质被算法利用:如果观测到磁力计某轴呈现与步伐同步的正弦变化,同时合成强度MkM_k不变,则确认这是由于手机在地磁场中的周期摆动引起,可作为步伐存在的佐证 。反之若MkM_k也剧烈变化,则意味着外部磁场变化,无法用于正常步伐判断。公式(15)本身揭示了手机旋转与磁场读数变化的几何关系。

单位:各分量mxk,myk,mzkm_{x_k},m_{y_k},m_{z_k}单位与MkM_k相同(μT)。

公式 (16)dn=tste!!tstealin(t);dt2\displaystyle d_n = \int_{t_s}^{t_e}!!\int_{t_s}^{t_e} a_{\text{lin}}(t);dt^2

解释步伐位移计算。dnd_n是第nn步的位移,计算方式为在该步起始时间tst_s到结束时间tet_e内对线性加速度alin(t)a_{\text{lin}}(t)进行两次时间积分 。线性加速度是已经扣除重力后的加速度,所以积分得到的dnd_n表示人体在该步期间相对于地面的位移(通常主要是水平方向位移)。由于加速度计存在噪声和偏置,直接双积分容易累积误差,但因为积分时间窗口很短(一个步周期约<1秒),且重新归零,每步的误差不会严重积累。实际实现中常用离散积分:例如vk=vk1+alin,kΔt v_k = v_{k-1} + a_{\text{lin},k}\Delta txk=xk1+vkΔt x_k = x_{k-1} + v_{k}\Delta t来迭代计算末速度和位移,其中Δt\Delta t为采样周期。公式(16)概念上表示这一过程。通过dnd_n,算法能够判定该步是否真正移动了足够距离。

单位:位移mm(米),计算中dtdt以秒计则标准国际单位。

公式 (17)ths=0.6×1ki=1kdni\displaystyle th_{s} = 0.6 \times \frac{1}{k}\sum_{i=1}^{k} d_{n-i}

解释步幅阈值计算。thsth_s这里表示步伐位移阈值(注意不与时间阈值混淆) 。算法取前kk步(论文中k=3k=3)的位移平均值,再乘以0.6得到当前步的显著运动阈值 。公式中1ki=1kdni\frac{1}{k}\sum_{i=1}^{k} d_{n-i}即最近kk步平均位移,乘以0.6相当于取其60%。这个经验系数用于应对步态模式转变:特别是在跑步转走路时,前几步(跑步)的平均位移较大,而刚转为走路的步伐位移会骤降,用60%可以适当降低阈值以免漏计这些步;反之在正常情况下,这一阈值又足够高,可以滤除仅有轻微晃动的假步 。总之,thsth_s作为一个动态阈值,持续根据用户最近的步幅更新,使算法既能适应步幅变化又能剔除异常小的“步伐”。

单位:位移m。

公式 (18)dn>ths\displaystyle d_n > th_{s}

解释步伐判定条件。当当前第nn步计算得到的位移dnd_n大于阈值thsth_s时,判定该步为有效步伐 ;否则若dnthsd_n \le th_s,则认为该步可能是由于用户并未真正移动而产生的伪步信号,将其排除,不计入步数 。这是算法的最终判据,确保计入的每一步都对应显著的身体位移,极大减少了误报率。论文中提及,若dnd_n不达标,该候选步将被标记为false positive并移除 。通常行走时每步水平位移远大于0,因此正常步伐dnd_n肯定高于阈值,而假步dnd_n接近0难以越过阈值,从而实现有效区分。

单位:判定不涉及单位比较,因为thsth_sdnd_n同为位移(m)。

以上公式涵盖了论文算法的主要计算过程和判定条件。从加速度与重力的分解(1)(2),到峰谷检测(3),时间区域阈值(4)-(8),步态幅值及步频调整(9)-(12),再到磁场变化(13)-(15)以及步伐位移验证(16)-(18)。每个公式在算法中都有特定作用:例如(1)(2)用于解释加速度信号特点,(3)-(8)用于峰谷提取策略,(9)-(12)用于自适应调整滤波/阈值,(13)-(15)用于磁力计融合判断,(16)-(18)保证最终结果可靠。所有这些组成了论文提出的完整计步方案的一环环逻辑。

算法实用性、可行性与正确性分析

论文提出的计步算法在实用场景中表现出高准确度、强鲁棒性和实时性,具有很高的实用价值。以下从多个方面分析其可行性和正确性,并结合实验结果说明:

适用广泛,设备姿态无关:算法对智能手机的摆放方式和用户的步行模式不敏感 。无论手机是在口袋、手中悬Swing、拿在耳边通话,还是用户在慢走、快走或跑步,算法均可自动调整参数检测步伐。其自适应滤波和阈值调节机制使之不需要针对特定用户或场景进行校准,真正做到“一次部署,普遍适用”。实验采用10名不同性别年龄的用户,在6种持机方式和4种步行模式下各走100步,算法平均检测准确率达99.6% 。这意味着总2000步中仅漏检8步,几乎每步都能捕获,充分验证了姿态无关性和普适性。

无需训练模型,实时计算:与依赖机器学习分类器的计步方法不同,本算法完全基于规则推理 。它通过自适应调整阈值和多传感器条件判断来解决复杂情况,不需要预先收集大量数据训练模型。这样做的好处是计算量小、解释性强、实时性能高。在资源受限的手机上运行也毫无压力。论文强调算法“在实时操作模式下完成任务” ,经过优化,处理每个新数据epoch只需简单的比较和累加运算,能够跟上典型传感器采样频率(100Hz以上)。实验中算法实时运行在Android手机上,未出现漏步或延迟。

高准确率和鲁棒性:综合多源传感器信息使算法对环境噪声和特殊动作具有很强鲁棒性。实验结果表明,在固定姿态下有场景达到100%检出率,而最困难场景(如缓慢行走且同时打字导致杂波较多)准确率最低也有99.1% 。不同使用场景分开的平均准确率为:低姿态动态变化场景99.6%,高动态变化场景99.47% 。即使面对剧烈的手机晃动或外界磁干扰,算法也能通过陀螺仪和磁力计的验证机制辨别真正步伐信号与伪信号 。论文与两款商用手环(Fitbit Flex2和小米手环2)对比测试,结果显示本算法精度全面超越手环:所有测试中智能手机算法准确率平均99.47%,而两款手环分别为98.31%和98.02% 。这说明利用手机内多传感器融合可以胜过单纯依赖手臂摆动计步的手环设备。

自适应能力和准确判别:算法的关键在于自适应——它会根据步速快慢自动调滤波参数和峰谷判定阈值 。因此,无论用户突然加速跑步还是减速停下,算法都能即时响应调整,不会错判连续快速步伐,也不会把缓慢移动错漏为无步。同时,多重验证保证了正确性:只有当加速度、陀螺仪、磁力计信息一致地表明发生了步伐,并且积分位移也显著非零时,才最终确认计步 。这样的多条件“投票”极大降低了误报。例如,用户在原地摇晃手机,可能产生加速度峰,但陀螺仪和磁力计不会呈现典型步伐周期,也没有位移,算法据此正确地不计步。反过来,若因偶发噪声导致加速度某一步未识别峰,但陀螺仪检测到规律运动,磁力计也匹配,则算法不会漏掉该步信号。这种互补提高了检出率。

可行性与实现简便:论文方法在实现上基于常见的传感器读数处理,无需专用硬件。现代智能手机都配备MEMS加速度计、陀螺仪和磁力计,因此只需一个App即可实现计步 。论文作者在智能手机上实现了该算法,并进行大量实测,证明其可行性。尤其值得一提的是,算法在精度接近100%的同时,没有引入明显额外功耗或复杂度:低阶滤波和简单阈值判断对CPU负载很小,而避免了使用耗电的GPS或联网。对于终端用户,只需安装应用即可获得媲美专业计步器甚至超越手环的性能 。

对PDR系统的意义:作为Pedestrian Dead Reckoning(PDR)的一部分,精准计步是估计行走距离和轨迹的基础。该算法的高准确率直接提升了PDR的可靠性 。并且由于输出的不仅是步数,还有每步的时间和相对强度(峰谷差)信息,PDR可以进一步融合步幅估计模型,提高定位精度。作者提到本算法可显著影响PDR精度,因为每一步都几乎无漏计,误差不会累积 。