HYPERCONCERTO株式会社のチーフエンジニア雑記Blog

hyperconcerto株式会社のチーフエンジニアが日々気づいたことを書いています

【Python】リアルタイムスペクトラムアナライザを作ってみる。 その2

今回はpyqtgraphというグラフ描画ライブラリを使います。
このライブラリはQtを使って描画するためmatplotlibより大幅に高速です。
早すぎて取り込みの方が追い付かないぐらいです。

前回のmatplotlib版だとマイクの前でしゃべってもかなり遅れて波形が出たと思いますが
今回のものはすぐに反映されます。
そのため、pyaudioによる録音速度がボトルネックになっています。
もっと早くキャプチャーできる仕組みがあればさらに細かな波形を書けると思います。

リアルタイム表示は結構面白いですね。

 

f:id:hyperconcerto:20160204230233j:plain

矩形波をファンクションジェネレータで発生させました。

高次のピークが理論通り記録されています。

 

f:id:hyperconcerto:20160204230236j:plain

いつもの正弦波です。

 

f:id:hyperconcerto:20160204230240j:plain

声を取り込みました。

 

例によってソースコードGithubに上げてあります。
自己責任の範囲でご自由にお使いください。

 

gist9c8f295f0619744b6f52

 

コードの書き換えられる部分について
変数Nは取り込む波形の範囲を示しています。
少なくすると取り込み時間が少なくなるので、レスポンスが良くなりますが代償として波形が粗くなります。
大きくすると取り込み時間が長くなるので、レスポンスが悪くなりますが波形がきれいになります。
1024が最適だと思っています。
RATEは解析する周波数の範囲です。
RATE割る2が対象周波数ですので、可聴域全体を解析するなら40000を指定してください。
ただ、音楽データは低音が多いのであまり反応しないでしょう。

本来はRaspberry piで実行したかったのですが、上記Nの値を8196にしないと動作しない事がわかり当然のことながら取り込み時間が非常に遅いので諦めました。
pyaudio以外の手法で取り込む必要があるのですが、Arduinoと違いRaspberry piはADコンバータを搭載していません。
(アナログ信号をデジタルに変換する機能)
外付けのADコンバータが必要ですが、比較的簡易に接続できる品種では速度が出ませんでした。
(SPI接続のMCP3002を試しましたがいまいちでした)
パラレル接続のADコンバータだとスピードが出そうですが、難易度が高そうです。
次回に続く?

ハイパーコンチェルト株式会社