9

ファイルストレージなしで、リアルタイムでマイクからソースオーディオを取得するアプリを開発しています。基本的に、私は使用します:

mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");

ファイルなしで、このリアルタイム オーディオからスペクトル グラフィックを作成するにはどうすればよいですか?

私が読んだすべての投稿は、バッファリングされたファイルを分析しています。

4

3 に答える 3

8

はい、できます。

必要なのは、高速な FFT アルゴリズムだけです!

最初に、必要な周波数解像度を決定します。たとえば、マイクからのサンプル レートを 8000hz に設定し、1024 または 2048 などの 1 つのチャンク サイズを選択して、マイクからキャプチャします。

2048 ポイントとサンプル レート 8000 を選択した場合、周波数分解能 = 3.9063 (8000 /2048) になりますか。

2048 ポイントに 1 つのウィンドウ関数を適用してから、FFT を適用してマグニチュードを取得します。

ナイキスト定理のサンプル レート = 8000 / 2 = 4000 を思い出してください。これで、FFT が 4000 Hz で 3.9063 Hz の間の周波数を取得できることがわかりました。

対応する周波数の FFT ビン:

1 -> 3,90625  hz    
2 -> 7,8125  hz    
3 -> 11,71875 hz    
...    
1024 -> 4000 hz    
...    
2048 - > 8000 hz

そのためには、FFT の前半の値、この場合は 1024 だけが必要です。

FFT からこのデータをプロットすると、スペクトルが得られます。

編集

擬似コード:

#construct one hanning window Function
Chunk = 2048;
windowed = [Chunk];
hanning = [Chunk];
for i 1:Chunk:
      hanning[i] = ((1 - cos(i*2*pi/Chunk-1))/2)

#start capture from Mic
while true:

    #into values capture 2048 points from your mic
    values=dataFromMic(Chunk);
    #Apply Window hanning = multiply window function(hanning) over your 2048 points
    for i 1:Chunk:
            windowed[i] = values[i] * hanning[i]
    #Apply FFT 
    fftData=fft(windowed);
    #Get Magnitude (linear scale) of first half values
    Mag=abs(fftData(1:Chunk/2))
    # update/show results
    plot(Mag)

end
于 2013-08-19T16:33:17.660 に答える
2

オープン ソースの FFT ベースのスペクトル アナライザーを開発しました。をご覧ください

http://som-itssolutions.blogspot.in/2012/01/fft-based-simple-spectrum-analyzer.html .

からソース コードを取得することもできます。

https://github.com/sommukhopadhyay/FFTBasedSpectrumAnalyzer

これがあなたを助けることを願っています。

于 2014-04-07T05:25:28.687 に答える