p5.sound.jsのFFT解析が少しパワーアップしていたっぽいので、
今日はリファレンスを上から読んでいこうかなと思います。
途中自分の感想やメモ書き的なものが含まれていますが、
自分用のメモののつもりではあるので、ご承知ください。
FFT(高速フーリエ変換)波形から個別の音声周波数を解析できる手法です。
ここはいいですね。FFTがそもそもわからんって方は、こちらの方の解説がわかりやすいです。有識者に怒られるかもですが、つまりは、音に含まれる成分を解析できる手法で、低い音が多いとか、高い音が多いとか、波形の成分を解析できる手法だと思っていれば問題ないかなと思います。
この辺はFFTの話でした。ので飛ばします。
p5.FFTオブジェクトには、waveform() とanalyze()の2通りあるよんとのこと。
FFT.waveform()はサンプル時間あたりの振幅を返してくれる。
FFT.analyze()は、サンプル時間あたりの周波数を返してくれる。人間の可聴域の周波数を返すとあるので、低い音で20Hz、高い音で20kHzくらいまでの範囲だと思います。
さらにgetEnergy()を使うと、特定の周波数帯を取り出せるようになっているそうです。
周波数分解能(FFTbins)の値は、1024がデフォルトとなっているそうです。
FFTバッファーサイズは、その二倍のbinsの値なので、サンプリングレートが44100Hzだったら、2048/44100秒間ってことになるとのこと。
この辺がわかりやすかった。参考資料。
つまりは、FFTbinsの値とバッファーサイズの関係性がわかりました。
これらの関数を使うには、p5.soundライブラリーが必要なので、index.htmlファイルの中に<script src="path/to/p5.sound.js"></script>みたいな感じで読み込んで使おうとのこと。
パラメータの使い方
new p5.FFT([smoothing],[bins])とできる。
例えば、こんな感じで使用可能。
fft = new p5.FFT(0.9, 1024);
Smoothingの値は、デフォルトが0.8で、0から1の間で設定可能。
binsは1024がデフォルト。
音声入力を設定できる。引数にsetInput(song); のような形で設定可能。
-1 から1の範囲で1つのバッファーあたりの振幅の配列を返す。配列の長さはbinsの値と同じ1024がデフォルト。
0-255の範囲で周波数あたりの振幅の配列を返す。配列のインデックスは周波数(ピッチ音高)ごとの音量になっている。
特定の周波数のエネルギー(音量)を返すか、2つの周波数範囲の平均値を返す。
また、("bass", "lowMid", "mid", "highMid", "treble")っとストリング型で指定することができ、0から255の値を返す。
周波数のセントロイドを返す。セントロイドは全体の周波数成分に含まれる音量の重心という意味。
最後の解析するフレームの平均をとって、スムーズにFFT解析する関数らしい??ようはスムージングですね。
周波数バンドの振幅の平均値の配列を返す。
スペクトラムの振幅の平均値の配列を返す。オクターブバンドを設定できる。オクターブバンドは、ある周波数を中心にして上限と下限の周波数比が 1 オクターブとなる周波数の帯域(バンド)のこと。
使用例としては、
オクターブバンドってなんだっけ?は、この辺の記事がわかりやすかったです。
https://www.onosokki.co.jp/HP-WK/c_support/newreport/noise/souon_11.htm
オクターブバンドの1/Nの値を返す。デフォルトのNの値は3です。最小中心周波数は 15.625Hz です。(1/3 Octave Bands ~= 31 Frequency Bands) fCtr0をより高いオクターブの中心値に設定すると、より低いバンドは無視され、より少ない周波数グループが生成される。