一些信号处理/ FFT问题

时间:2011-07-22 18:58:00

标签: java audio signal-processing accelerometer fft

我需要一些帮助确认一些基本的DSP步骤。我正在实施一些智能手机加速计传感器信号处理软件,但我之前没有在DSP工作过。

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

我的具体问题是:

  1. 从实时流中,我正在收集一个有50%重叠的256个样本窗口,正如我在文献中所读到的那样。也就是说,我一次添加128个样本以填充256个样本窗口。这是正确的做法吗?

  2. 下面的第一个图显示了一个这样的256个样本窗口。第二个图显示了我应用Hann / Hamming window function后的示例窗口。我已经读过应用窗口函数是一种典型的方法,所以我继续前进并做到了。我应该这样做吗?

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

  4. 假设我在问题3中所做的是正确的,我的理解是正确的,第三个数字显示的主要频率约为3.25 Hz和8.25 Hz?我知道从收集大约3赫兹运行的数据时,3.25赫兹的峰值似乎是正确的。因此必须有一些噪声,其他因素导致(错误的)峰值在8.25 Hz。是否有任何过滤器或其他方法可以用来消除这种尖峰和其他尖峰?如果没有,有没有办法确定错误峰值的“真正”尖峰?

  5. enter image description here

3 个答案:

答案 0 :(得分:1)

  1. 对样本大小和重叠做出决定始终是频率准确性和及时性之间的折衷:样本越大,FFT频段越多,因此绝对精度越高,但需要更长的时间。我猜你想要定期更新你正在检测的频率,并且绝对精度不是重要:所以256样本FFT似乎是一个不错的选择。重叠将在相同的数据上提供更高的分辨率,但代价是处理:再次,50%似乎没问题。

  2. 应用窗口将停止由于样本的突然开始和结束而出现的频率伪像(如果不执行任何操作,则有效地应用方形窗口)。汉明窗口是相当标准的,因为它在具有尖锐信号和低旁瓣之间提供了良好的折衷:一些窗口将更好地抑制旁瓣(检测到的频率的倍数)但是检测到的信号将分布在更多的箱上,并且其他人则相反。如果您的信号噪音很小,我认为这并不重要:您可能会坚持使用汉明窗口。

  3. 完全正确:功率谱是复数值的平方和的平方根。您对奈奎斯特频率的假设是正确的:您的音阶将达到16Hz。我假设您正在使用一个真正的FFT算法,它返回128个复数值(FFT将返回256个值,但因为您给它一个真实信号,一半将是另一个的精确镜像),所以每个bin是16/128 Hz宽。在对数刻度上显示功率谱也很常见,但如果您只是检测到峰值则无关紧要。

  4. 8Hz尖峰真的存在:我的猜测是移动人口袋里的手机不仅仅是一阶系统,所以你将拥有其他频率成分,但应该能够检测到首要的。你可以过滤掉它,但是如果你正在进行FFT则没有意义:如果你确定它们是错误的,那就忽略那些垃圾箱。

  5. 你似乎很好。我要做的唯一建议是在结果上开发一些更长时间的启发式方法:查看连续输出并拒绝短期检测到的信号。寻找一个主要组件,看看它是否可以在它移动时跟踪它。

答案 1 :(得分:0)

回答你的一些问题:

是的,您应该应用窗口功能。这里的想法是,当你开始和停止采样一个真实世界的信号时,你正在做的是应用一个尖锐的矩形窗口。 Hann和Hamming窗口在降低你不想要的频率方面要好得多,所以这是一个很好的方法。

是的,最强频率约为3和8 Hz。我不认为8 Hz尖峰是错误的。使用如此短的数据集,您几乎肯定无法控制信号的准确频率。

答案 2 :(得分:0)

对问题4的一些见解(从盯着我生命中几个月的人的加速度计信号):

您是在单个加速度计轴通道上运行此分析还是将它们组合起来以创建加速度?如果你对信号加速的整体幅度感兴趣,那么你应该结合x y z,例如mag_acc = sqrt((x - 0g_offset)^ 2 +(y - 0g_offset)^ 2 +(z - 0g_offset)^ 2)。当设备静止时,此信号应为1g。如果你只是看一个单轴,那么你将从主导的运动运动中获得分量,也可以从手机的方向变化中获得信号(因为重力的贡献将会转变)。因此,如果您在按住电话时的方向移动电话方向,它可能会对信号产生很大影响,但幅度不会显示方向变化。一个人跑步应该具有非常干净的主导频率。

相关问题