智能手环是一种穿戴式智能设备。通过这款手环,用户可以记录日常生活中的锻炼、睡眠、部分还有饮食等实时数据,并将这些数据与手机、平板、ipod touch同步,起到通过数据指导健康生活的作用。通过智能手环取得的数据,可以开展多方面的研究工作。此后笔者就将更新此系列内容。
目前已有的部分内容为
需要取得智能手环的原始数据(raw data)。需要考察数据的质量,我们考虑从数据采样率,数据的准确性,设备系统时延三个方面进行评估。
当然为研究数据,能取得原始数据是首要的前提,我们耗时近半年,联系了全球各厂商,考察了大部分市面上的手环产品,仅筛选出两款raw data符合我们需要的产品:Microsoft Band2, Fitbit。最后因为种种原因,我们无奈自己去做了手环设备Sens。这里不再详细展开,否则就跑题了,我们的这个系列也基于三款产品进行分析和研究。
Fitbit
Microsoft Band2
Sens
此篇文章分析的目的为,设想我们遇到这一种情况。现在老板要求分析各设备的数据质量。老板也不想看一大堆的质检报告——每一个设备生产厂商都会提供看似合理正规的各种文书,然后它们对于实际分析并没有什么用。那么我们如何在有限的条件下,有理有据的分析数据,取得让老板信服的结果。此篇文章对手环的系统响应时延展提供一种简易有效的评估方法。
实验条件:三款手环设备,能够取得和分析数据的电脑一台(就这么多)
将三款手环尽量佩戴在一起,以确保三款手环产品的输入尽量为同一输入。
为保证公平性,隔一段时间内,交替各设备佩戴的位置。交替间隔保持一致。
当实验者有剧烈活动时记录时间。
佩戴2天取得数据。
三个设备在时间轴对齐后时域信号的平均值。
思路:在统一的冲激信号 下,经过三个不同的系统 , , 。现得到输出 ,估计系统时延,即
估计
基本假设:参照系统 与 , , 是平稳的系统,满足线性。
故为满足假设条件,采取截短的方式使得系统在局部平稳;
对窗口内的各时间序列做归一化满足激励条件;
最后对所有截短窗延迟估计进行平均。
GCC是时延估计算法中最经典的一种。总体的思路核心是做卷积寻找互相关的最大值点估计系统延迟。
此外笔者还提供一些其他的分析方法:
The popular Time delay estimation (TDE) algorithms mainly include the classical generalized cross correlation (GCC), the adaptive least mean square (LMS), the subspace based eigenvalue decom position (EVD) and the acoustic transfer functions ratio (ATF-s ratio) method, etc.
加窗法将数据进行截短,在窗口范围进行分别分析:归一化处理,xcorr相关性卷积,最后再做均值或者中位数的处理。
GCC算法:
生成数据
x1 = [1,2,3,7,9,8,3,7]';
x2 = circshift(x1, 2); % 位移2位
计算
xc = xcorr(x1,x2,'biased'); % 计算循环卷积,输入位置顺序x1,x2不可变
Max = 6, Lag = Max – N = -2
结果
提前位移为2与生成数据条件相符。
整体伪代码:
Input: 设备系统响应时间序列 ,平均系统响应序列
1. 对各序列加窗
2. While 遍历窗口
3)求各卷积系列最大值点,即相关性最大点。
4)相关性最大位置减去序列长度得到延迟点
end
3. 计算各平均延迟
结果:
结论:
以三个设备的平均响应系统为参照下,以GCC算法分析(一个序列从另一个序列的开始至结束时刻逐点滑动,逐次点积。寻找相关性最大点即为重合点,再减去序列长度,即为延迟点),Sens的系统响应最优,先于参照系统0.2秒,Microsoft延迟于参照0.4s,Fitbit延迟于参照1.8s。
%% GCC
% MATLAB CODE FOR TDE STUDYING.
% USING GCC ALGORITHMS
% Written by Sixing Liu
%% Load data
load comdata
X = X(1:1000, :); % first 1000 data points
x1 = X(:, 1); % FitBit
x2 = X(:, 2); % Micsoft
x3 = X(:, 3); % Sens
y = X(:, 4); % Baseline
%% Windows
winLen = 10;
x1 = reshape(x1, winLen, []);
x2 = reshape(x2, winLen, []);
x3 = reshape(x3, winLen, []);
y = reshape(y, winLen, []);
l1 = zeros(length(y), 1);
l2 = zeros(length(y), 1);
l3 = zeros(length(y), 1);
for i = 1: length(y)
% gcc in a windows
N = winLen;
% Normlization
yi = mapminmax(y(:, i)', 0, 1);
x1i = mapminmax(x1(:, i)', 0, 1);
x2i = mapminmax(x2(:, i)', 0, 1);
x3i = mapminmax(x3(:, i)', 0, 1);
% gcc analysis
[xc1, lag1] = xcorr(yi,x1i,'biased'); [k1,ind1] = max(xc1); % GCC Algor: higher version sub by [tau,R,lag] = gccphat(x1,x2)
[xc2, lag2] = xcorr(yi,x2i,'biased'); [k2,ind2] = max(xc2); % GCC Algor: higher version sub by [tau,R,lag] = gccphat(x1,x2)
[xc3, lag3] = xcorr(yi,x3i,'biased'); [k3,ind3] = max(xc3); % GCC Algor: higher version sub by [tau,R,lag] = gccphat(x1,x2)
% calc delay
l1(i) = ind1 - N;
l2(i) = ind2 - N;
l3(i) = ind3 - N;
end
% calc mean
a = mean(l1)*10;
mic = mean(l2)*10;
sens = mean(l3)*10;