将加速度信号分解为子集信号组(MATLAB)

时间:2017-05-05 20:13:56

标签: matlab signal-processing

我有大约5个小时的特定用户的加速度数据(收集的数据是真实数据,这意味着我不知道用户在特定时间做了什么)。

数据集包含第一列中的时间戳和第二列,第三列,第四列中3轴(X,Y和Y)的加速度数据。

Time Stamp   X Data   Y Data   Z Data

我想根据用户的活动划分数据(称为活动识别,以便于分类)。

例如,如果用户正在行走,提取他的信号并将其存储在数组中,如果他正在键入,则将提取输入数据并将其存储在另一个数组中,依此类推。因此,将创建N个数组,每个数组将包含特定活动的数据。

顺便说一下,什么是活动并不重要,为原始信号的每个部分提取用户模式更有用(模式意味着用户的信号)看起来很一致。

这是每个轴的原始信号的示例

Acceleration Data of X axis

Acceleration Data of Y axis

Acceleration Data of Z axis

正如我们所看到的,原始信号看起来非常嘈杂(因为用户在同一天进行了多次活动)因此,我想根据用户的不同将信号分成子集。活性。

请注意,附加图片中突出显示的部分只是原始信号中行走数据的一个示例。我知道它的行走数据,因为我们可以看到它包含通常在用户行走时产生的重复峰值

here is a sample of my data

真的很感激任何帮助。

问候。

2 个答案:

答案 0 :(得分:1)

这是机器学习算法的典型用例!神经网络目前很流行,但也有很多其他算法可以做到这一点。 Matlab有一个神经网络工具箱,它甚至还有一个GUI。但不要指望它只是即插即用......

如果它只是您要提取的突出显示部分(因此您的用例非常有限),您可以尝试手动完成。计算一些统计值,如均值,方差等。找到那些让你的地区与其他地区相关联的地方并用它们来寻找那个地区。

答案 1 :(得分:1)

正如我在评论中所提到并得到yar的支持,FFT可能是分割数据的重要功能。下一个代码只是一个如何使用FFT的小例子。为了获得良好的结果,您可能应该将其纳入yar建议的机器学习算法中。

我们的想法是在本地采用FFT(1e4个样本)并查看间隔之间的差异。我应用了一个简单的阈值方法,将您请求的部分分割出来。

data = importdata('data_big.csv'); % import your data

[b, a] = butter(2, 0.01); % construct a low pass filter, to clean up the FFT output

fftInterval = 1e4; % interval over which the fft is taken
is = 1:floor(size(data, 1)/fftInterval)-1; % indices of intervals to process
amplitudes = zeros(fftInterval,  is(end)); % preallocate memory for amplitude of fft
highlight = zeros(size(data, 1), 1); % preallocate memory for selecting region of interest
for i=is
  range = (1:1e4)+i * 1e4;
  amplitudes(:, i) = filtfilt(b, a, fftshift(db(fft(data(range, 2))))); % calculate fft and obtain amplitude response
  if (amplitudes(5620, i) > 38) % perform a simple threshold to obtain region of interest
    highlight(range) = 5;
  end
end

f = figure;
plot(data(:, 2)); % plot original data
hold on
plot(highlight); % plot region of interest

figure
plot(amplitudes(:, 1:5)); % plot amplitude response for the five first intervals

在您的X数据上绘制的感兴趣区域是: enter image description here

前五个时间间隔的幅度响应为: enter image description here

注意,间隔4和5清楚地显示了5620附近的峰值,即阈值位置。

请注意cwt(连续小波变换)可能是fft多次调用的一个很好的选择。