20

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

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

利用可能なAndroid APIはありますか?

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

4

4 に答える 4

6

あなたの問題はここで解決されました編集:ここにアーカイブされましたまた、 FFTを使用して周波数を分析することもできます。

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

于 2012-10-04T06:18:27.723 に答える
4

返信ありがとうございます
http://som-itssolutions.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;
}
于 2012-10-04T09:37:12.117 に答える
0

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

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

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

要するに、あなたはしなければなりません:

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

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

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

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

  1. 絶対ピークだけでなく、位相情報を使用してピッチ追跡の特異性を高めるための手法があります。

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

于 2012-10-05T15:22:19.363 に答える
-1

これは、言及されたコードへのリンクです。他にも便利なコードがいくつかあります。

https://github.com/gast-lib/gast-lib/blob/master/library/src/root/gast/audio/processing/ZeroCrossing.java

ZeroCrossings との契約は次のとおりです。

Android で録音されたオーディオに基づいて正確に周波数を決定することは不正確です。とはいえ、アプリが聞いている音がただのノイズではなく、絶え間ない歌声であるという一般的な感覚をアプリに与えるのには依然として役立ちます。

ここのコードは、頻度を決定するのに非常にうまく機能しているようです (C# から Java に変換できる場合) http://code.google.com/p/yaalp/

于 2012-10-05T08:32:17.523 に答える