【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日
【Python】複数のWAVファイルの波形を表示するプログラム【サウンドプログラミング】
どうもこんにちは。たっきーです。
最近カフェインをよく摂取している。
参考
なにする?
WAVファイルの波形をmatplotlibで複数表示する。
ただし、読み込まれるデータはバイナリなので数値を変換する必要がある。
割りとここのパクってfor文で回してるだけな感じある。(ありがとうございます。)
環境
- Python 3.6.3
- numpy 1.13.3
- matplotlib 2.1.0
下準備
ここで作ったWAVデータを用意する。
まぁ、実は複数の連番WAVファイルを用意するだけでいいが。
コード
とりあえず関数の定義。WAVファイルの数値変換と振幅正規化してる。
time = ○○で表示する時間を指定できる。
わかりやすいようにx軸y軸にラベルとグラフタイトルと付け加えている。
一応、y軸を固定しないと勝手に最適化(?)されてしまうのでy軸を-1~1で固定してある。
あとは 以下のように関数を呼び出すとグラフが表示出来る。
OUTPUT
多分、青色が左の音の波形で、橙色が右の音の波形(だと思う)
あとはfor文で回すだけ。
OUTPUT(略)
こんな感じで表示される。
2列〜3列で表示したいんだがどうしたらいいんだ…って感じ。
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~
- 作者: 巣籠悠輔
- 出版社/メーカー: マイナビ出版
- 発売日: 2017/05/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
おわりに・感想
ささっと書いたのですごい雑なコードになってしまった。。。
今回は波形を1秒毎に表示してみたけど、案外1秒間ずっと無音の部分とかあった。
なので、今度時間がある時に無音部分を判別してはじくプログラムとか組んでみたいなぁ(どうせやらない。)
楽器(今回はpiano,guitar,bass,drams)の音色を機械学習で分類したいんだが、流石に波形みるだけじゃあまり規則性みたいなものは目視ではあまり感じられなかった。(timeを短くしてみてもあまりわからなかった。)
もっとmatplotlibを上手く使いこなせるようになりてぇ。。。
おっすオラ、マックブック・プロ
— たっきー@ダサテプラP (@tacky0612) 2017年11月27日
【Python】WAVファイルを等間隔に分割するプログラムpart2【サウンドプログラミング】
どうも、たっきーです。
今回は前回の続き。
なにする?
前回のヤァツの強化版作りたい。
前回のヤァツはファイル一個に対してしか分割できなかったけど、今回は複数ファイルを一括で等間隔で分割したい。
前回
環境
- Python 3.6.3
- numpy 1.13.3
- scipy 0.19-.1
下準備
とりあえず等間隔に分割したいWAVファイルを0〜n.wavというファイル名で用意する。(nはファイル数-1)
データ数が100ぐらいならいいけど、それより多くなると面倒くさいので自動で0〜nで名前をふれる方法があれば教えて欲しいでござる…。
コード
前回書いたコードをちょっと手入れした。(ちょっと汚いコードなのは性格。)
cut_wav()をちょっと変更して、
- returnでカット済のファイル名の次の値を返す
- 始まりのファイル名を引数に追加
あとは、for文でcut_wav()を回してるだけ。
分割したい時間と最後のファイル名(ファイル数-1)を指定できるようにしてある。
あとはターミナルで以下コマンド叩くだけ。
$ cd データセットとこのコードが入ってるディレクトリへのPath
$ python コード名(この場合cut_wav).py
ってやると、分割したい時間と最後のファイル名(ファイル数-1)の入力を求められるので入力する。今回は1秒毎に分割したくて最後のファイル名が87.wavなので、cut_timeには1、Number of fileには87を入力する。
こんな感じ。
↓ 終点 ↓
最後のreturn(今回は1900)が分割後のファイル数になる。
同じディレクトリ内にoutputってディレクトリが生成され、その中に分割後のWAVファイルが格納されるようになっている。
※returnが1900なのに生成された最後のWAVファイルが1899なのは0〜1899で1900個であるため。(return に+1している為でもある。)
上手く分割出来た✌
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
サウンドプログラミング入門――音響合成の基本とC言語による実装 (Software Design plus)
- 作者: 青木直史
- 出版社/メーカー: 技術評論社
- 発売日: 2013/02/01
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 18回
- この商品を含むブログ (6件) を見る
おわりに・感想
88個のWAVファイルを分割することで1900個のWAVファイルに増やすこと(いや、増えてはいないが)が出来た。
考えられる問題点は、1秒で分割したので1秒間が全部無音とかが存在しそうってことかな。(検証してないのでわからん)
そういうのがあったら機械学習やる上で不都合なのでどうにかして除去したい。
今日はこんなくらいで、さよならー。
さっさと機械学習をやれ
— たっきー@ダサテプラP (@tacky0612) 2017年11月24日