小程序计算加速计平均差变化
2024-02-19 本文已影响0人
litielongxx
该方法只是处理例如normal每间隔200ms获取的xyz数据的变化情况,做一定的分析。
根据实际情况修改。
function detectActivity(arr) {
// 检查数据的长度是否足够
if (arr.length < 3) {
return "数据不足";
}
// 计算间隔时间,单位为 ms
const interval = 200;
// 初始化加速度指标
let avgAx = 0;
let avgAy = 0;
let avgAz = 0;
// 计算加速度的平均值
for (let i = 0; i < arr.length; i++) {
avgAx += Number(arr[i].ax);
avgAy += Number(arr[i].ay);
avgAz += Number(arr[i].az);
}
avgAx /= arr.length;
avgAy /= arr.length;
avgAz /= arr.length;
// 计算加速度的标准差
let stdDevAx = 0;
let stdDevAy = 0;
let stdDevAz = 0;
for (let i = 0; i < arr.length; i++) {
stdDevAx += Math.pow(Number(arr[i].ax) - avgAx, 2);
stdDevAy += Math.pow(Number(arr[i].ay) - avgAy, 2);
stdDevAz += Math.pow(Number(arr[i].az) - avgAz, 2);
}
stdDevAx = Math.sqrt(stdDevAx / arr.length);
stdDevAy = Math.sqrt(stdDevAy / arr.length);
stdDevAz = Math.sqrt(stdDevAz / arr.length);
// 根据加速度特征判断活动
let activity;
if (stdDevAx > 1 && stdDevAy > 1 && stdDevAz > 1) {
activity = "跑步中";
} else if (stdDevAx < 0.3 && stdDevAy < 0.3 && stdDevAz < 0.3) {
activity = "摇晃手机";
} else {
activity = "骑车";
}
// 返回检测结果
return activity;
}
在计算加速度的标准差时,我们使用的是样本标准差的公式:
stdDev = sqrt(Σ(x - μ)² / (n - 1))
其中:
-
stdDev
是标准差 -
x
是每个数据点 -
μ
是数据的平均值 -
n
是数据点的数量
步骤:
- 计算平均值 (μ):首先,我们需要计算加速度数据的平均值。这是通过将所有加速度值相加,然后除以数据点的数量来完成的。
-
计算偏差:对于每个数据点,我们计算其与平均值的偏差,即
(x - μ)
。 -
平方偏差:我们对每个偏差进行平方,得到
(x - μ)²
。 -
求和:我们对所有平方偏差求和,得到
Σ(x - μ)²
。 -
除以 (n - 1):为了得到无偏估计,我们在求和后除以数据点的数量减 1,即
(n - 1)
。 - 开平方根:最后,我们对结果开平方根,得到标准差。
示例:
给定以下加速度数据:
[-1.70, -0.54, -1.39, -0.73, -0.43, -1.17]
- 平均值 (μ):(-1.70 + -0.54 + -1.39 + -0.73 + -0.43 + -1.17) / 6 = -0.82
-
偏差:
- -1.70 - (-0.82) = -0.88
- -0.54 - (-0.82) = -0.28
- -1.39 - (-0.82) = -0.57
- -0.73 - (-0.82) = -0.09
- -0.43 - (-0.82) = -0.39
- -1.17 - (-0.82) = -0.35
-
平方偏差:
- 0.7744
- 0.0784
- 0.3249
- 0.0081
- 0.1521
- 0.1225
- 求和:Σ(x - μ)² = 1.4604
- 除以 (n - 1):1.4604 / (6 - 1) = 0.2921
- 开平方根:stdDev = sqrt(0.2921) = 0.54
例如一定时间示范的数据中,测试的数据给定数据的加速度标准差为 0.54,仅公式演示。
实际函数的arr则格式为[{ ax: "0.05", ay: "-0.12", az: "2.20"}]