Android 我可以在智能手机上每秒执行多少次FFT?(用于执行语音识别)

Android 我可以在智能手机上每秒执行多少次FFT?(用于执行语音识别),android,iphone,audio,signal-processing,fft,Android,Iphone,Audio,Signal Processing,Fft,我正在探索语音识别和DSP,因此我想在我的智能手机上实现一个简单的音频分析仪(我有一台iPhone和一台运行Android的三星Nexus S)。我以前用Matlab做过基本的DSP 根据我的理解,我需要执行FFT来获得信号的基本频率 现在,我想对44100赫兹的话筒进行采样。如果我使用样本大小为512且重叠50%的滑动窗口,这意味着我需要每256个样本或0.00580秒进行一次FFT 这个比率似乎真的很高,特别是如果我用Java为Android编程的话。我的智能手机能应付这种速度吗?我知道你可

我正在探索语音识别和DSP,因此我想在我的智能手机上实现一个简单的音频分析仪(我有一台iPhone和一台运行Android的三星Nexus S)。我以前用Matlab做过基本的DSP

根据我的理解,我需要执行FFT来获得信号的基本频率

现在,我想对44100赫兹的话筒进行采样。如果我使用样本大小为512且重叠50%的滑动窗口,这意味着我需要每256个样本或0.00580秒进行一次FFT


这个比率似乎真的很高,特别是如果我用Java为Android编程的话。我的智能手机能应付这种速度吗?我知道你可以在Android上用C/C++编程,但我想暂时用Java。

对于iPhone,iOS加速框架可以完成你指定使用的所有FFT,大约占CPU时间的1%(确切百分比取决于设备型号和FFT数据类型)

对于Android,您可能强烈希望考虑使用NDK原生库来进行处理器密集型数值计算。< /P> 还请注意,FFT将给出峰值频率,这不一定包括基音或语音基音频率


补充:这表明Android手机能够使用Java编写良好的矩阵数学,速度在5到50 mFLOP之间。一个写得好的FFT在MFLOP中的性能范围应该大致相同@Stephan Cannon表示,您的规范可能需要2 mFLOP。执行实到复FFT需要~5/2 n lg n浮点运算(加法和乘法)。在您的情况下,n=512,因此:

flops per fft ~= (5/2) * 512 * 9 = 11520
因此每秒172个FFT需要每秒大约200万个浮点运算。这听起来很多,但实际上并没有那么多。典型的armv7级智能手机的硬件每秒能够执行数亿或数十亿次浮点运算


但是请注意,您需要一个精心编写的高性能FFT;写得不好的FFT效率低下是出了名的。在iPhone上,您可以使用Accelerate框架(直接内置到操作系统中,并在SDK中提供),它提供了一组很好的FFT函数;我不确定Android上有什么可用功能。

您的Android设备可以很好地处理这个问题。几年前,我在Windows Mobile设备上编写了基于FFT的实时频率分析器(使用纯C#),这些设备的处理器比当前的Android设备差得多。FFT计算成本最高的方面是trig函数,由于您使用的是固定大小的窗口,因此可以轻松地用预先计算的查找表替换trig函数调用。

另外,您可以通过降低采样率来减少计算时间。语音在8kHz以上没有太多能量,所以在进行FFT之前,您可能会将音频采样降低到16kHz,而不会损失太多准确性。在16 kHz时,您的FFT将更小,因此速度更快

16 kHz是桌面应用程序中语音识别的标准采样率


(我意识到这并不能回答OP的问题,但考虑到他的应用程序,我认为这可能对他有帮助。)

不是我,但我几乎否决了这个答案,因为它一开始提到iPhone,我认为这是一个纯安卓问题(我没有注意到标签).你是从哪里得到每次FFT失败的估计数的?你能给我指一些文学作品吗?我知道Cooley-Tukey算法的O(N lg N)界,但我还没有看到一个FLOPS估计值;人们通常使用该计数(因此,对于实到复fft,使用5/2N lg n,尽管这并不完全正确)。在现实中,更复杂的算法(如在一般实践中使用的)实际上需要更少的失败次数。我不确定当前最先进的下限是多少,但我相信上次我查看时它大约是4 n lg n。@stackoverflowuser2010:FFT上的wikipedia页面有一些很好的链接,指向最近关于常数边界的工作。我为我的Android Nexus S手机下载了一个LINPACK基准测试(该应用程序名为“用于Android的Linpack”)。它完全是用Java编写的。我得到大约10-20兆流。我希望您的2兆流FFT估计值正确地落在这个范围内。我将使用Java FFT实现。仅供参考,我的顶级MacBook Pro和i7处理器使用Intel的本机LINPACK基准测试得到大约30千兆流。如果有人感兴趣,我能够成功在我的Android手机上运行每秒100次的FFT,我使用java FFT实现,考虑到还有其他的基本频率估计方法,其他的FFTI认为OP实际上不是在基音识别(即找到主频)的意义上使用“基频”这一短语。,因为这通常不是用于语音识别的东西。