FFTアナライザーの使い方

Web Audio APIのFFTアナライザーを使ってみます。FFTについてはWEB SOUNDERさんのページがとても詳しいので参照して下さい。下のスイッチを押すと、マイクの音をFFTして、結果のパワーを表示します。上が波形、下がFFTの結果をパワーで表示しています。もう一度スイッチを押すと正弦波をFFTして、結果のパワーを表示します。FFTが動作している時には、ピーク情報には、大きなパワーの周波数とレベルを表示しています。波形の振幅が±0.5の正弦波では大体-20dBを示します。

周波数 Hz
ゲイン dB

ピーク情報


波形

パワー

プログラムサンプル

// ---------------------------------------------------------------------------
  //Web Audio Initialize
  var audioContext = new AudioContext();
  var mAnalyser = audioContext.createAnalyser();
  var audiosource_t;

// ---------------------------------------------------------------------------
  //Mic ON - Get Usermedia
  navigator.getUserMedia(
    mConstraints,
    function(stream){
      audiosource_t=audioContext.createMediaStreamSource(stream);
      audiosource_t.connect(mAnalyser);
    },
    function(e) {	// I can't use getUserMedia
      console.log(e);
    }
  );

// ---------------------------------------------------------------------------
  mFrequencyBinCoun	= mAnalyser.frequencyBinCount;
  mAnalyser.fftsize	= 2048;
  //FFTの対象となった波形
  myDataArray = new Float32Array(mFrequencyBinCount);
  //FFTの結果
  mytimeDataArray = new Float32Array(mAnalyser.fftsize);

// ---------------------------------------------------------------------------
//FFTの結果を取り出す
  mAnalyser.getFloatFrequencyData(myDataArray);
  mAnalyser.getFloatTimeDomainData(mytimeDataArray);

Web Audio API のFFTを使ってみてわかったこと

Web Audio API のFFTを使ってみてわかったことを書いておきます。
  • FFT SIZEに対して、AnalyserのfrequencyBinCountはFFT SIZEの半分の値となります。
  • ナイキスト周波数はさらにその半分の値のところとなります。
  • サンプリング周波数が44100Hz、FFT SIZEが2048の時、512点目が22050Hzの場所となります。ですので、1000Hzのピークは、23点目くらいになります。
  • 振幅が1.0の正弦波のピークはgetFloatFrequencyDataのピークを表示するとだいたい-14.0dBを示します。振幅が0.5では、だいたい-20.0dBを示します。振幅が0.25では、だいたい-26.0dBを示します。
  • getByteFrequencyDataの値は0-256の整数で、以下の式でDBの値を計算できます。
    DB = getFloatFrequencyData/256*(maxDecibels-minDecibels)+minDecibels