web-dev-qa-db-ja.com

アンドロイドで音の周波数を計算する方法は?

Androidで音の周波数を計算するアプリを開発したいです。 Androidデバイスはマイクからサウンドを取得し(つまり、外部のサウンド)、アプリに1色の背景画面があります。音の周波数が変化すると、画面の背景色を変更する必要があります。

だから私の質問は「どうすれば音の周波数を得ることができるのですか?」

Android APIは利用できますか?

この問題から私を助けてください。

17
Ashish Wadatkar

あなたの問題は解決しました ここ 編集: ここにアーカイブ[〜#〜] fft [〜#〜] を使用して頻度を分析することもできます。

編集: FFTBasedSpectrumAnalyzer (サンプルコード、コメントからのリンク)

6
ymn

返信いただきありがとうございます私はサンプルを使用してこれを行いました
http://som-itsolutions.blogspot.in/2012/01/fft-based-simple-spectrum-analyzer.html

以下の方法を使用して、サウンド周波数を計算するようにコードを変更するだけです

 // sampleRate = 44100 

public static int calculate(int sampleRate, short [] audioData){

    int numSamples = audioData.length;
    int numCrossing = 0;
    for (int p = 0; p < numSamples-1; p++)
    {
        if ((audioData[p] > 0 && audioData[p + 1] <= 0) || 
            (audioData[p] < 0 && audioData[p + 1] >= 0))
        {
            numCrossing++;
        }
    }

    float numSecondsRecorded = (float)numSamples/(float)sampleRate;
    float numCycles = numCrossing/2;
    float frequency = numCycles/numSecondsRecorded;

    return (int)frequency;
}
4
Ashish Wadatkar

他の回答は、スペクトログラムを表示する方法を示しています。問題は、基本周波数の変化をどのように検出するかだと思います。これはStack Exchangeで頻繁に尋ねられますが、私はそれについて(コード付きで)ブログエントリを書きました。

http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html

確かに、コードはCで記述されていますが、移植は簡単だと思います。

つまり、次のことを行う必要があります。

  1. より高い周波数の倍音が基本周波数と間違えられないように入力信号をローパスします(ピッチの変更を探しているだけなので、これはアプリケーションで問題とは思われないかもしれませんが、理由をとにかく行うことをお勧めします)複雑すぎてここでは説明できません)。

  2. 適切なウィンドウ関数を使用して信号をウィンドウ処理します。最も応答性の高い出力を得るには、ウィンドウを重ねる必要があります。これは、サンプルコードでは行いません。

  3. 各ウィンドウのデータでFFTを実行し、最大絶対ピーク値のインデックスを使用して周波数を計算します。

ピッチの変化を正確かつ迅速に検出する必要があるアプリケーションでは、私が説明するFFTメソッドでは不十分な場合があることに注意してください。次の2つのオプションがあります。

  1. 絶対ピークだけでなく、位相情報を使用してピッチトラッキングの特異性を高めるためのテクニックがあります。

  2. 自己相関に基づく時間領域法を使用します。陰は素晴らしい選択です。 (Googleの「陰のピッチトラッキング」)

0
Bjorn Roche