一些信号处理/FFT问题

5

我希望你能帮我确认一些基本的DSP步骤。我正在实现一些智能手机加速度计传感器信号处理软件,但我之前没有从事过DSP。

我的程序以32Hz的实时频率收集加速度计数据。输出应该是信号的主要频率。

我的具体问题是:

  1. 我从实时流中收集了一个256个样本的窗口,重叠率为50%,这是我在文献中读到的。也就是说,我每次添加128个样本来填充256个样本的窗口。这种方法正确吗?

  2. 下面的第一张图显示了一个256个样本的窗口。第二张图显示了我应用Hann/Hamming 窗口函数后的样本窗口。我读到应用窗口函数是一种典型方法,所以我就这么做了。我应该这么做吗?

  3. 第三个窗口显示了FFT库输出的功率谱(?)。我真的在拼凑我读过的东西。我的理解是否正确,即频谱上限为采样率的1/2(在这种情况下为16 Hz,因为我的采样率为32 Hz),每个频谱点的值为spectrum[i] = sqrt(real[i]^2 + imaginary[i]^2)?这是正确的吗?

  4. 假设我在问题3中所做的是正确的,那么我的理解正确吗,第三个图显示了大约3.25 Hz和8.25 Hz的主要频率?我知道从收集数据中,我运行的频率约为3 Hz,因此在3.25 Hz处的尖峰似乎是正确的。因此,必须有一些噪声或其他因素导致(错误的)8.25 Hz处的尖峰。是否有任何过滤器或其他方法可用于平滑掉此类尖峰和其他尖峰?如果没有,是否有办法确定真正的尖峰和错误的尖峰?

enter image description here


你可以在原始数据中看到大约8Hz的频率:它们是尖锐的小峰,一些振幅相当大。你有任何想法这些峰是怎么出现的吗?(与你如何生成数据的问题相关。) - toto2
@Paul R:实际上,我对分箱不确定,因为我是DSP和FFT的新手。我以32 Hz的采样率进行采样,我的FFT输入是一个256值数组。FFT的输出是两个128值数组,显然一个用于实数(余弦),另一个用于虚数(正弦)。所以,我的理解是,分箱导致每个箱子宽度为32 Hz/256(或等效地,具有Nyquist频率32/2=16,16 Hz/128宽)? - stackoverflowuser2010
@stackoverflowuser 好的,我以为你可能在使用某种转盘或奇怪的装置,你知道它是在做3Hz,但其实你只是以大约3步/秒的速度行走。我还以为这是位移图,而不是加速度图。小峰可能是手机在织物中被捕捉到的横向移动。你可以试着把它“稳定”地握在摆动的手中走路,看看信号有多清晰。也许硬件有一些限制,如果你采样时间间隔太短,它似乎会很嘈杂。 - toto2
2
你肯定想要窗口化数据:否则你会从信号的突然开始和结束中得到错误的频率伪影。0Hz处的峰值仅仅是信号的直流偏移量:它并没有围绕原点居中。基本上,你正在正确地执行所有操作,你对于复杂输出和结果频率的假设是正确的。 - Adrian Taylor
1
好的,我之前没有注意到数据没有清零,所以你确实会在0赫兹处得到一个偏移峰。但这让我想到你可能有一些严重的问题,因为你正在分析加速度的绝对值。这就像分析正弦波的绝对值:你会得到两倍的频率加上一些人工频率。 - toto2
显示剩余9条评论
3个回答

1
在样本大小和重叠方面做出决策总是在频率准确性和及时性之间做出妥协:样本越大,FFT bin 越多,因此绝对准确性更高,但需要更长时间。我猜你想要定期更新你检测到的频率,而绝对准确性并不是太重要:所以 256 个样本的 FFT 看起来是一个相当不错的选择。有重叠会在相同数据上提供更高的分辨率,但代价是处理时间:50% 的重叠看起来也很好。
应用窗口将防止由于样本的突然开始和结束而出现频率伪影(如果什么都不做,你实际上正在应用一个方形窗口)。Hamming 窗口是相当标准的,因为它在具有尖锐信号和低旁瓣之间取得了良好的折衷:一些窗口可以更好地拒绝旁瓣(检测到的频率的倍数),但检测到的信号将分散在更多的 bin 中,而其他窗口则相反。在样本量小且信号上的噪声较多的情况下,我认为这并不重要:你可能还是应该坚持使用 Hamming 窗口。
完全正确:功率谱是复值平方和的平方根。你对奈奎斯特频率的假设是正确的:你的刻度将上升到 16Hz。我假设你正在使用实际 FFT 算法,它返回 128 个复杂值(FFT 将返回 256 个值,但因为你正在给它一个实际信号,一半将是另一半的精确镜像),因此每个 bin 的宽度为 16/128 Hz。在对数刻度上显示功率谱也很常见,但如果你只是峰值检测,那就无关紧要了。
8Hz 的尖峰确实存在:我猜移动人员口袋中的手机不仅仅是一个一阶系统,因此你将会有其他频率分量,但应该能够检测到主要的频率。你可以过滤掉它,但如果你正在进行 FFT,则这是没有意义的:如果你确定它们是错误的,那就忽略这些 bin。

你似乎进展得很顺利。我唯一的建议是在结果上开发一些更长时间的启发式算法:查看连续的输出并拒绝短期检测到的信号。寻找主成分并尝试跟踪它的移动。


0
回答您的一些问题:
是的,您应该使用一个窗口函数。这里的想法是当您开始和停止采样真实世界的信号时,您实际上正在应用一个锐利的矩形窗口。Hann 和 Hamming 窗口更擅长减少不需要的频率,所以这是一个好方法。
是的,最强的频率在 3 和 8 Hz 左右。我不认为 8 Hz 的峰值是错误的。对于如此短的数据集,您几乎肯定无法控制信号会具有确切的频率。

0
从我的加速度计信号中研究人们奔跑的几个月,对问题4有一些见解:
您是在单个加速度计轴通道上运行此分析,还是将它们组合以创建加速度大小?如果您对信号的整体加速度大小感兴趣,则应将x y z组合起来,例如mag_acc = sqrt((x-0g_offset)^2 + (y-0g_offset)^2 + (z-0g_offset)^2)。当设备静止时,该信号应为1g。如果您只查看单个轴,则会从主导奔跑动作以及手机方向改变的方向获得组成部分,从而为您的信号做出贡献(因为重力的贡献将在周围转换)。因此,如果在奔跑时手机方向在改变,则它可能会对信号做出重大贡献,但大小不会显示方向的变化。奔跑的人应该具有非常干净的主导频率,在人的步频处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接