2011-10-31 14 views
8

私は音声認識とDSPを検討していますので、私はスマートフォンに簡単なサウンド周波数アナライザを実装したいと思います(iPhoneとSamsung Nexus Sの両方にAndroidを搭載しています)。以前はMatlabで基本的なDSPを使っていました。スマートフォンで1秒間に何回FFTを実行できますか? (音声認識を実行するため)

私の理解から、信号の基本周波数を得るためにはFFTを実行する必要があります。

ここで、44100 Hzでマイクをサンプリングしたいと思います。 50%オーバーラップのサンプルサイズ512のスライディングウィンドウを使用すると、256サンプルごと、つまり0.00580秒ごとにFFTを実行する必要があることを意味します。

特に、私がAndroid用のJavaでプログラミングする場合、そのレートは実際には高いと思われます。私のスマートフォンはそのスピードを処理できますか?私はあなたがAndroidでC/C++でプログラムできることを知っていますが、私は当面はJavaを使っていきたいと思います。

+0

はFFT –

+0

その後、他の基本周波数推定の他の方法があることを考えてみましょう私は、OPが実際には音声認識のために使用するものではないので、ピッチ認識の意味で(つまり支配的な周波数を見つけるという意味で)「基本周波数」という言葉を使用することを意味するとは思わない。 – MusiGenesis

答えて

9

実数から複素数のFFTを実行するには、浮動小数点演算(加算および乗算)が〜5/2 n回必要です。あなたのケースでは、N = 512、そう:毎秒

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

だから172のFFTは、毎秒約200万浮動小数点演算を必要とします。それはたくさんのように聞こえるが、それほど多くはない。典型的なarmv7クラスのスマートフォンのハードウェアは、1秒あたり数億〜数十億の浮動小数点演算が可能です。

ただし、慎重に書かれた高性能FFTが必要です。不完全に書かれたFFTsは悪名高いほど非効率的である。 iPhone上では、Accelerateフレームワーク(OSに組み込まれ、SDKで利用可能)を使用することができます。これは、FFT関数の素晴らしいセットを提供します。私はAndroidで何が入手できるか分かりません。

+0

FFTあたりのFLOPSの見積りはどこで取得しましたか?あなたは私にいくつかの文献を教えてもらえますか?私はCooley-Tukeyアルゴリズムから縛られたO(Ng N)を知っていますが、私はFLOPS推定を見ていません。 – stackoverflowuser2010

+0

オリジナルのCooley-Tukey紙は、実際にはもっと洗練された5 ngのn個のフロップ数を与えます。人々は一般的にその数を使用します(したがって、正確ではないにしても、実際から複雑なfftでは5/2 ngです)。実際には、より洗練されたアルゴリズム(一般的なプラクティスで使用されているように)は実際には若干少ないフロップを必要とします。現在の最先端の下限が何であるかは分かりませんが、最後に見たときは4 ng程度です。 –

+0

@ stackoverflowuser2010:FFTのwikipediaページには、定数の境界に関する最新の作業へのリンクがいくつかあります。 –

5

iOSのAccelerateフレームワークでは、指定するすべてのFFTをCPU時間の1%のオーダーで使用できます(デバイスモデルとFFTデータタイプによっては正確なパーセンテージ)。

Androidの場合、プロセッサ集中型の数値計算にNDKネイティブライブラリを使用することを強くお勧めします。

また、FFTは基本周波数または音声ピッチ周波数を必ずしも含まないピーク周波数を提供します。

追加:このは、Android携帯電話が、よく書かれた行列演算のためにJavaを使用して5から50MFloopsの範囲で可能であることを示唆しています。うまく書かれたFFTは、MFlopsでおおよそ同じ性能範囲に入るはずです。 @Stephan Cannonは、あなたの仕様に2MFlopsのオーダが必要かもしれないと投稿しました。

+0

興味深いのはなぜ...? – hotpaw2

+0

誰かがこれを投票する理由を想像することはできません。 –

+0

私はそうではありませんでしたが、iPhoneに言及することから始まり、これはAndroidの純粋な質問であると私は考えました(私はタグに気づいていませんでした)。 – MusiGenesis

3

あなたのAndroid搭載端末はこの罰金を処理できます。私は数年前から(純粋なC#を使用して)Windows Mobileデバイス上で実行されたリアルタイムのFFTベースの周波数解析器を書いてきましたが、これらのデバイスは現在のAndroidデバイスよりもずっと悪いプロセッサを持っていました。 FFTの最も計算量の高い面は三角関数です。固定サイズのウィンドウを使用しているため、三角関数呼び出しを事前に計算されたルックアップテーブルで簡単に置き換えることができます。

1

あなたはおそらく、サンプリングレートを下げることによって計算時間を短縮することができます。スピーチは8kHz以上のエネルギーを持っていませんので、FFTを行う前にオーディオを16kHzにダウンサンプリングして、精度をあまり失うことはありません。 16 kHzでは、FFTは小さくなります。

Wikipedia claims 16 kHzは、デスクトップアプリケーションでの音声認識の標準サンプリングレートです。

(私はこれはOPの質問に答えていないことを認識し、私はそれが彼のアプリケーション与えられ、それにもかかわらず、彼に役立つかもしれないと思う。)

関連する問題