我需要一些帮助来确认一些基本的DSP步骤。我正在实现一些智能手机加速度传感器信号处理软件的过程,但是我以前从未在DSP上工作过。
我的程序以32 Hz的频率实时收集加速度计数据。输出应为信号的主要频率。
我的具体问题是:
从实时流中,我正在收集一个256个样本的窗口,该窗口有50%的重叠,正如我在文献中所读到的那样。也就是说,我一次添加了128个样本,以填充256个样本的窗口。这是正确的方法吗? 下图显示了一个这样的256样本窗口。第二个图显示了在我应用Hann/Hamming window function之后的示例窗口。我已经读到,应用窗口函数是一种典型的方法,所以我继续这样做。我应该这样做吗? 第三个窗口显示FFT库输出的功率谱(?)。我真的把我读过的零零碎碎地凑在一起。我的理解是正确的,因为频谱上升到采样率的1/2(在本例中为16 Hz,因为我的采样率为32 Hz),并且每个频谱点的值是Spectrum [i] = sqrt(real [ i] ^ 2 +虚数[i] ^ 2)?这是正确的吗? 假设我在问题3中所做的工作是正确的,那么我的理解对吗?第三幅图显示的主频率约为3.25 Hz和8.25 Hz吗?通过收集数据,我知道我以大约3 Hz的频率运行,因此3.25 Hz的峰值似乎是正确的。因此,必须存在一些其他噪声因素导致8.25 Hz的(错误)尖峰。我可以使用任何过滤器或其他方法来消除此峰值和其他峰值吗?如果不是,是否有办法从错误的峰值中确定“真实”峰值? 决定样本大小和重叠始终是频率精度和及时性之间的折衷:样本越大,FFT仓越多,因此绝对精度也就越高,但它花费的时间更长。我猜想您想要定期更新要检测的频率,并且绝对精度不是太重要:因此256采样FFT似乎是一个不错的选择。重叠会为相同的数据提供更高的分辨率,但会以处理为代价:再次,50%似乎很好。 应用一个窗口将阻止由于样本的突然开始和结束而出现的频率伪像(如果不执行任何操作,则实际上是在应用一个正方形窗口)。汉明(Hamming)窗口是相当标准的,因为它在尖锐信号和低旁瓣之间做出了很好的折衷:某些窗口会更好地抑制旁瓣(检测到的频率的倍数),但是检测到的信号会散布在更多的频段上,并且其他人则相反。对于信号量很小的样本,我认为这没什么大不了的:您最好还是坚持使用汉明窗。 完全正确:功率谱是复数值的平方和的平方根。您对奈奎斯特频率的假设是正确的:您的音阶将上升到16Hz。我假设您使用的是真正的FFT算法,该算法将返回128个复数值(FFT将返回256个值,但是由于您是给它一个真实信号,所以一半将是另一个的精确镜像),因此每个bin是16/128 Hz宽。以对数刻度显示功率谱也是很常见的,但这与峰值检测无关。 确实存在8Hz尖峰:我的猜测是,移动的人口袋里的电话不只是一阶系统,因此您将拥有其他频率分量,但应该能够检测到主要频率。您可以将其过滤掉,但是如果进行FFT则没有意义:如果您确定这些bin是错误的,则只需忽略这些bin。
您似乎过得很好。我唯一提出的建议是对结果进行一些较长的启发式处理:查看连续的输出并拒绝短期检测到的信号。寻找主要组件,看看是否可以跟踪它的移动。