因此,我正在尝试构建一个充当实时音频分析器的android应用程序,作为该项目的前身,该项目将涉及检测和过滤某些声音。

因此,我认为我已经掌握了离散傅立叶变换的基础知识,但是我不确定进行实时频率分析的最佳参数是什么。

我得到的印象是,在理想情况下(无限的计算能力),我将从AudioRecord类中获取的44100个样本/秒PCM流中的所有样本都放入一个44100元素的“窗口”中(填充为2 ** 16具有0's或可能具有渐减函数?),每次有新样本进入时在窗口上运行FFT。(我认为)这将为我提供0-〜22 KHz的频谱,每秒更新44100次。

看来这不会在智能手机上发生。问题是,我不确定应该减少哪些计算参数,以便使其在我的Galaxy Nexus上易于处理,同时仍保持尽可能高的质量。最终,我想使用灵敏度更高的外接麦克风。

我认为这将涉及在两次FFT之间移动一个以上的窗口样本,但我不知道在哪一点上比仅在一个较小的窗口上进行FFT更不利于准确性/混淆/其他问题,或者是否有三分之一我忽略的选项。

使用我从libgdx使用的本机实现的KissFFT,我似乎能够对每44100个样本执行30-42个44100个元素FFT,并且仍然具有响应能力(这意味着缓冲区从执行AudioRecord.read的线程中被填充了) ()的填充速度不超过执行fft的线程可以耗尽它的速度)。

所以我的问题是:


我目前获得的性能能否达到我要获得的最好水平?还是看起来我一定是愚蠢的,因为更快的速度是可能的?
我的处理方法至少在根本上是正确的,还是我完全在错误的树上吠叫?


如果可以帮助回答我的问题,我很乐意展示我的任何代码,但是它很多,因此我认为我可以选择性地这样做而不是全部发布。

最佳答案

如果有第三种选择我忽略了


是的:同时执行两项操作,既减小了FFT大小,又增大了步长。在一条评论中,您指出您要检测“用嘴嗅探/咀嚼”。因此,您要执行的操作类似于语音识别的典型任务。在那里,您通常以10ms为步长提取特征向量(意味着每441个样本Fs = 44.1kHz),并且要转换的信号窗口大约是步长大小的两倍,因此20ms产生2 ^ X FFT大小为1024个样本(请确保选择的FFT大小为2的幂,因为它更快。)

窗口大小的任何增加或步长的减小都会增加数据,但主要会增加冗余。

其他提示:


@SztupY正确指出,您需要在FFT之前“开窗”显示信号,通常是使用Hamming-wondow。 (但这不是“过滤”。它只是将每个样本值与相应的窗口值相乘,而不会累加结果)。
原始FFT输出几乎不适合识别“用嘴嗅探/咀嚼”,传统的识别器由HMM或ANN组成,它们处理MFCC的序列及其增量。



  我目前获得的性能能否达到我要获得的最好水平?还是看起来我一定是愚蠢的,因为更快的速度是可能的?


它接近最佳状态,但是您正在浪费所有CPU能力来估计高度冗余的数据,而没有CPU能力供识别器使用。


  我的处理方法至少在根本上是正确的,还是我完全在错误的树上吠叫?


考虑完我的回答后,您可能会重新考虑您的方法。

07-28 12:32