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

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

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

FFTスペアナを作ります。
入力にはマイク端子を使いますので測れるのは可聴域のみとなります。
オーディオ機器についているピークを示すレベルメーターとほぼ同じ物になります。
そもそもスペアナって?
信号に含まれる周波数を分解して、それぞれの信号の強度を表示します。
この分解する時に高速フーリエ変換という計算をして所定のデータを取り出します。
と書いていてもいまいちわからないので、動いているときの写真を載せます

f:id:hyperconcerto:20160128211345p:plain


上が信号の波形で、下が信号強度を表示しています。
ファンクションジェネレータで生成した1kHzの正弦波なので1カ所にしかピークが出ません。

コードの紹介
前回掲載した手順で構築された環境であればコピペで動作すると思います。
必要なモジュールはmatplotlibとnumpyとpuaudioです。

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

Matplotlib realtime audio FFT


使い方
パソコンのマイク入力に、測定したい信号源をつなぎます。
例えば自分の声を調べたい場合はマイクをつなぎます。
音楽を調べるときは、ヘッドホン出力を直結します。
微弱信号であれば、変換端子を自作して回路と接続できますが、パソコンが壊れるかもしれません。
コードを実行すれば測定開始です。

注意事項
録音デバイスの優先度が重要なので、特にUbuntuなどの場合はarecord -lの結果などを確認してから使ってください。
何も波形が出ない場合は録音デバイスが動作しているかよく確認してください。
このソースコードはRaspberry Piだと、デバイス指定やCHUNKの値が小さすぎるため動かないと思います。

動かしてみたらわかると思いますが、かなり遅いです。
遅い原因はmatplotlibで、描画が遅いためカックカクになるんです。
これを解決するために次回はpyqtgraphを使用して実装しましょう

 

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