【Python】WAVファイルの波形データにFFTかけて周波数スペクトルを複数表示する【サウンドプログラミング】
どうもたっきーです。
最近の悩みは虫歯です;;
これは前回からの続きなので前回のヤツやってないと動作しません()
参考
なにする?
WAVファイルのデータにFFTかけて周波数解析し、matplotlibで周波数スペクトルを複数表示する。
調べてみたところ、FFTかけるときに窓関数というものをかけるのが一般的らしいのでそれも実装。
環境
macOS High Sierra 10.13
Python 3.6.3
numpy 1.13.3
matplotlib 2.1.0
FFTとは
高速フーリエ変換(fast Fourier transform)とは、離散フーリエ変換(discrete Fourier transform, DFT)を計算機上で高速に計算するアルゴリズムのこと。
ちなみにDFTを直接計算するとめちゃめちゃ時間かかる。。。
そこで考えられたのがFFTってわけ。
めちょ早い。
数学が苦手なので中身の数式には触れない。
Numpyを使えばnp.fft.fft()で一瞬で求められる。
周波数スペクトルとは
光や音や電磁波信号は様々な周波数の成分から構成されている。そのようなものから周波数毎の強さを定量的に求める処理をスペクトル解析(spectrum analysis)と呼ぶ。
んで、そのスペクトル解析で求められたものを、x軸に周波数、y軸に強度をグラフにプロットしたものを周波数スペクトルと呼ぶ。
例↓↓↓(一応、強度については0〜1で正規化してある。)
窓関数とは
こんな関数↓
僕の窓関数に対する理解は、『数値解析が容易になるべんりツール』って感じ。(簡単になるってニュアンスとはまたちょっと違う)
まぁ色んな窓関数があるわけだが、王道はハミング窓らしいので今回は無心でハミング窓を使用。
窓関数を用いる理由についてはここが分かりやすかった。
コード
まずは関数の定義。
んで、各引数は以下の通り。
それでは、スペクトルを一個だけ表示してみる。
IN
OUT
複数表示してみる。
IN
OUT
うまく表示できました✋
サウンドプログラミング入門――音響合成の基本とC言語による実装 (Software Design plus)
- 作者: 青木直史
- 出版社/メーカー: 技術評論社
- 発売日: 2013/02/01
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 18回
- この商品を含むブログ (6件) を見る
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
おわりに・感想
この後、色んな楽器の周波数スペクトルを表示してみたが、目視では楽器ごとの周波数スペクトルの規則性みたいなのはあまり感じられなかった。(あくまで主観。)
しかし、低音楽器であるベースは周波数の低い位置に周波数スペクトルが固まっていた。↓
って、まぁ当たり前なんだが。
あ、この前に鹿と戯れてきましたカワイイ。
ぽなかしゅちしか!w pic.twitter.com/udBvsz6jVH
— たっきー@ダサテプラP (@tacky0612) 2017年12月10日