2011-10-31 55 views
8

我正在探索语音识别和DSP,因此我想在我的智能手机上实现一个简单的声音频率分析仪(我的iPhone和三星Nexus S都运行Android)。我以前在Matlab中完成过基本的DSP。我可以在智能手机上每秒钟处理多少个FFT? (用于执行语音识别)

从我的理解,我需要执行FFT得到信号的基频。

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

那个速度看起来真的很高,特别是如果我在Android的Java编程。我的智能手机能够处理这种速度吗?我知道你可以在Android上用C/C++进行编程,但我希望暂时保留它。

+0

考虑到还有其他然后FFT –

+0

基频估计的其他方法我不认为OP在音高识别的意义上(即找到主导频率)的意思是使用“基频”这个词,因为这通常不会用于语音识别。 – MusiGenesis

回答

9

执行实数到复数FFT需要〜5/2ÑLGÑ浮点运算(加法和乘法)。在你的情况下,N = 512,所以:

flops per fft ~= (5/2) * 512 * 9 = 11520 

所以每秒172点的FFT需要每秒约2百万次浮点运算。这听起来很多,但实际上并不是那么多。典型的armv7级智能手机的硬件每秒能够执行数亿次或数十亿次浮点运算。

不过请注意,你会希望有一个精心编写高性能的FFT;写得不好的FFT是非常低效的。在iPhone上,您可以使用Accelerate框架(内置于操作系统中,并可在SDK中使用),该框架提供了一组不错的FFT功能;我不确定Android上有什么。

+0

你从哪里得到FLOPS每FFT的估计值?你能指点我一些文学吗?我知道从Cooley-Tukey算法绑定的O(N lg N),但我没有看到FLOPS估计。 – stackoverflowuser2010

+0

最初的Cooley-Tukey纸实际上给出了一个更精炼的5 n lg n的触发计数;人们通常使用这种计数(因此,从真实到复杂的fft,因此5/2 n lg n,尽管这不完全正确)。实际上,更复杂的算法(如常用的算法)实际上只需要更少的触发器。我不确定当前最先进的下限是多少,但是我相信在最后一次看时,它在4 n lg n左右。 –

+0

@ stackoverflowuser2010:FFT上的维基百科页面有一些很好的链接,指向最近关于常量界限的工作。 –

5

对于iPhone的加速框架为iOS可以做所有你指定使用的CPU时间的1%左右的快速傅里叶变换(根据设备型号和FFT数据类型具体的百分比)。

是Android,您可能会强烈地想考虑使用NDK本地库为处理器密集型的数值计算。

另外请注意,FFT会给你的峰值频率,这并不一定会包含基本或语音基音频率。

添加:这Java benchmark web page表明,Android手机能够在5到50个MFlops范围内使用Java编写良好的矩阵数学。写得很好的FFT在MFlops中应该大致相同的性能范围。 @Stephan Cannon发布了2个MFlops的订单,可能需要您的规格。

+0

有趣...为什么要投票? – hotpaw2

+0

无法想象为什么有人会投票。 –

+0

这不是我,但我几乎低估了这个答案,因为它首先提到iPhone,我认为这是一个纯粹的Android问题(我没有注意到标签)。 – MusiGenesis

3

你的Android设备将能够处理这种罚款。我已经写了几年前在Windows Mobile设备上运行的基于FFT的实时FFT频率分析仪(使用纯C#),并且这些设备的处理器比当前的Android设备差得多。 FFT中计算量最大的方面是trig函数,并且由于您使用的是固定大小的窗口,因此可以使用预先计算的查找表轻松地替换trig函数调用。

1

另外,您可以通过降低采样率来缩短计算时间。语音在8 kHz以上没有太多的能量,所以在进行任何FFT之前,您可能会将音频下采样到16 KHz,而不会损失太多精度。在16 kHz时,您的FFT会更小,速度更快。

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

(我知道这并没有回答任择议定书的问题,但我想可能是有帮助的他尽管如此,考虑到他的申请。)