2011-10-31 34 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是桌面應用程序語音識別的標準採樣率。

(我知道這並沒有回答任擇議定書的問題,但我想可能是有幫助的他儘管如此,考慮到他的申請。)

相關問題