web-dev-qa-db-ja.com

リアルタイムオーディオからスペクトラムアナライザを開発するにはどうすればよいですか?

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

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

私の質問は、ファイルなしで、このリアルタイムオーディオからスペクトルグラフィックを作成する方法です。できますか?

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

ありがとう、そして私の英語をごめんなさい。

9
Víctor Martín

はい、できます。

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

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

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

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

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

対応する周波数の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
6
ederwander

オープンソースAndroidスペクトラムアナライザー コンピューターはマイクからのオーディオをFFTし、2Dスペクトログラムを表示します。

スペクトラムアナライザプロジェクトは v2.x/Showcase app にあります。

あなたはそれの実際のビデオを https://youtu.be/yU05fsgOYO4 で見ることができます

ここでビルド手順のビデオを見ることができます: https://youtu.be/tVgn30uss2k?t=1m37s

enter image description here

チャートは SciChart Androidチャートライブラリ これは商用コントロールですが、マイクを読み取り、FFTとスペクトログラムを計算するためのソースコードは無料でオープンですMITライセンスの下のソース。

開示として:私はSciChartプロジェクトの技術リーダーです

5
Dr. ABT

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

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

ソースコードはから入手することもできます

https://github.com/sommukhopadhyay/FFTBasedSpectrumAnalyzer

これがお役に立てば幸いです。