scipyで周波数解析(FFT)の時間変化可視化(スペクトログラム)
という記事を書きましたが、pythonを使わない人にも同じ作業をしてもらいたいということで、コマンドラインのソフトウェアを使ったスペクトログラムの作成方法。
scipyの方は任意のデータ列を周波数解析が出来ますが、こちらは音声ファイル(ここではwavファイル)のスペクトログラム作成の方法です。
SoX(Sound eXchange)というコマンドラインのソフトウェアを使います。
SoX公式
SoXマニュアル(英語)
SoXマニュアル日本語訳
クロスプラットフォームで、Windows、Mac、Linuxで使えます。
私はMacを使っているので、homebrewでインストールしました。
brew install sox
コマンドとして、soxになります。
例えば、手元にたまたまあるロケットエンジンの音を録音したものを解析してみます。
ターミナルで、音声ファイル(ここではwavファイル)と同じディレクトリに入り、下記コマンドを打ち込みます。
sox TASCAM_0013.wav -n trim 124 7 rate 30k spectrogram -z 60
- TASCAM_0013.wav というwavファイルを読み込み
- trim 124 7 で、124秒目から7秒間を表示
- rate 30k でサンプリング周波数を30kHz、つまりナイキスト周波数としては15kHzで表示される
- spectrogram でスペクトログラムをspectrogram.pngで出力
- -z 60 でカラーバーの下限のdBを-60dBにして、全体の明るさを調整
- 上のグラフがステレオの左マイク、下グラフが右マイク
この音声ファイルでは1秒から6秒までの間でエンジンを燃焼させています。左マイクは低音用のマイクを使っているので、kHzの高周波はアテにならず、右マイクは普通の音楽用のマイクで録音しているので、比較的高音まで信用できます。スペクトログラムを見ると1kHz程度のところに比較的強い周波数が立っているのがわかります。
python(scipy)でスペクトログラム表示した方がアカデミックな用途では使いやすいですが、取り敢えずの表示であれば、SoXでも十分かつキレイなスペクトログラムが得られます。