加速度计数据中的直流分量 - 在 XYZ 欧几里得和之前或之后过滤

信息处理 fft 巴特沃思
2022-02-17 19:25:35

我正在过滤加速度计 XYZ 数据。目的是通过找到特征频率点并将其馈送到人工神经网络来识别步态模式。问题在于,通常似乎如此,在功率与频率域中滤除大量直流分量(0 Hz 处的强峰值),这掩盖了更高频率的分量。我正在与 Octave 合作。

在文献中,典型的方法是收集加速度计 XYZ 数据,使用滑动窗口平均值平滑一些噪声抖动,应用 4 阶巴特沃斯高通(在 0.9 Hz 截止频率),然后对各个处理的组件(XYZ那是)。

到目前为止,无论我尝试什么,总是有一个以 0 Hz 为中心的强峰值。尝试包括:1)减去原始数据的平均值(x = x-mean(x),对于所有通道)2)在欧几里得和之前的各个通道上的各种巴特沃斯阶数,在各种设置中

摆脱强 0 Hz 峰值的方法是在 XYZ 通道的欧几里得和上应用巴特沃斯滤波器。特征 2 Hz 步态峰值仍然存在,并且一些更高阶的频率被放大。

我的问题是:在欧几里得和之后过滤 XYZ 数据有什么根本错误吗?或者:这是正确的吗?或者:发生了什么,为什么 0 Hz 峰值没有被单独的通道过滤过滤(这暗示了一些非分配性的东西)。

以下是一些图: 原始 XYZ 加速度计数据 原始 XYZ 加速度计数据 http://www.hot.ee/jaaniussikesed/rawdataxyz.png

具有非常轻微滑动窗口平均值的数据(非常原始) 具有非常轻微滑动窗口平均值的数据(非常原始) http://www.hot.ee/jaaniussikesed/walk_xyz_nf_fft.png

四阶巴特沃斯,截止频率约为 1 Hz,在欧几里得和之前的单个 XYZ 上 四阶巴特沃斯,截止在约 1 Hz,在欧几里得和之前的单个 XYZ

四阶巴特沃斯,截止频率约为 1 Hz,取自 XYZ 加速度计数据的欧几里得和。注意没有 0 Hz 峰值。 四阶巴特沃斯,截止频率约为 1 Hz,取自 XYZ 欧几里得和之后的数据 http://www.hot.ee/jaaniussikesed/walk_euc_f_fft.png

四阶巴特沃斯滤波器频率响应: 四阶巴特沃斯滤波器频率响应 http://www.hot.ee/jaaniussikesed/frq_response.png

一些数据数据: 样本:1112 采样率:84 samp/s

八度中的巴特沃斯实现: Fc= 0.5; #Cutoff frequency in Hz Wcn=Fc/(srate/2); #Normalized cutoff frequency order=4; #Order of filter [B,A]=butter(order,Wcn,"high"); #Define Butterworth highpass filter

注意1:在0.1-1之间改变截止频率并不会真正改变画面。注意2:关于一个非常相似的问题有很多帖子,但它们都有细微差别,我相信这一点。

感谢您的任何帮助或/和建议!

EDIT1:这是代码(运行 Octave 4.0.0,包:控制、数据平滑、优化、信号、结构):

# Load data
load("ID:walk-2016-05-02T22:58:23+02:00.mat");

# Separate XYZ and clip
clipc=300;
ax=datamat(clipc:(end-clipc),1);
ay=datamat(clipc:(end-clipc),2);
az=datamat(clipc:(end-clipc),3);

srate=floor(srate); #sample rate

# Design filter
pkg load all
Fc= 1; #Cutoff frequency in Hz
Wcn=Fc/(srate/2); #Normalized cutoff frequency, srate (sample rate) loaded from file
order=4; #Order of filter
[B,A]=butter(order,Wcn,"high");

# Apply filter
axf=filtfilt(B,A,ax);
ayf=filtfilt(B,A,ay);
azf=filtfilt(B,A,az);

#Euclidean norm
afen=(axf.^2+ayf.^2+azf.^2).^(1/2);

#FFT
N_fft=2^13; #Frequency sample points, empirical
afft=fft(afen,N_fft); #Centered double sided FFT
freqpwr=afft.*conj(afft)/(N_fft*rows(afft)); #Power of each frequency spectrum component
freqpoints=srate*(0:N_fft/2-1)/N_fft; #Bins/points of FFT frequency axis

#Plot power spectral density
plot(freqpoints,freqpwr(1:N_fft/2));
title("One Sided Power Spectral Density");       
xlabel("Frequency (Hz)");
ylabel("Power spectral density");

fprintf("Program paused. Press enter to continue.\n");
pause;
close;

链接到数据文件

1个回答
  1. 我注意到在巴特沃斯滤波之后,高频分量被衰减了。这表明您实际上是以某种方式进行低通滤波。您的代码中可能有错误。

  2. 滑动窗口平均是粗略的低通滤波器。因此,假设您同时具有低通滤波器(窗口平均)和高通滤波器,您可以尝试通过使用带通滤波器来组合这两种操作。

  3. 在获取幅度(欧几里得和)之前,您必须从每个通道中移除 DC 偏移。考虑一个简单的例子 - 偏移量是[1,2,3]实际加速度矢量为[1,1,0]. 综合幅度为(1+3)2+(1+2)2+(0+3)2=34. 但是如果两个轴的值被翻转,比如说[1,0,1],你会得到 (1+3)2+(0+2)2+(3+1)2=36. 理想情况下,幅度应该不随轴的旋转而变化。