ファイルストレージなしで、マイクからソースオーディオをリアルタイムで取得するアプリを開発しています。基本的に、私は使用します:
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
私の質問は、ファイルなしで、このリアルタイムオーディオからスペクトルグラフィックを作成する方法です。できますか?
私が読んだすべての投稿は、バッファリングされたファイルを分析しています。
ありがとう、そして私の英語をごめんなさい。
はい、できます。
必要なのは高速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
オープンソースAndroidスペクトラムアナライザー コンピューターはマイクからのオーディオをFFTし、2Dスペクトログラムを表示します。
スペクトラムアナライザプロジェクトは v2.x/Showcase app にあります。
あなたはそれの実際のビデオを https://youtu.be/yU05fsgOYO4 で見ることができます
ここでビルド手順のビデオを見ることができます: https://youtu.be/tVgn30uss2k?t=1m37s
チャートは SciChart Androidチャートライブラリ これは商用コントロールですが、マイクを読み取り、FFTとスペクトログラムを計算するためのソースコードは無料でオープンですMITライセンスの下のソース。
開示として:私はSciChartプロジェクトの技術リーダーです
私はオープンソースのFFTベースのスペクトラムアナライザを開発しました。ご覧ください
http://som-itsolutions.blogspot.in/2012/01/fft-based-simple-spectrum-analyzer.html 。
ソースコードはから入手することもできます
https://github.com/sommukhopadhyay/FFTBasedSpectrumAnalyzer
これがお役に立てば幸いです。