Pythonを使って室内のオーディオシステムの周波数特性を測ってみた。 | グラ山ギターのブログ

グラ山ギターのブログ

毎週健康のために山登りをしています。低い山ばかりですが播磨の山々は岩山が多く景観がすばらしい所が多いです。山頂などで演奏しています。 井上陽水のカバーが多いです。
暑い時期は山登りは控えています。

TVのオーディオシステムの周波数特性をPythonのプログラムで測定し、スーパーウーハーのゲインとカットオフ周波数、位相を合わせた。
PC⇒HDMI⇒TV⇒光デジタルリンク⇒DENON PMA-50⇒DALI ZENSOR1 + SONY SA-CS9⇒AGK Lyra 

サブウーハーにはカットオフ周波数、音量、位相の調整があり、これらを触って周波数特性が最高の特性になるように調整していった。スーパーウーファーを活かすことで30Hz~70Hzの低温が改善され、迫力のある重低音を聴くことができた。
また、測定した特性は部屋の壁の反射の効果も入っており、500Hz付近で干渉した音が打ち消し合ってディップな特性になっている。500Hzで発生する位相反転は音速340m/s/500Hz/2=34cmの差に相当する。実験はしていないが、反射していると思われる壁に吸音材を貼れば改善できると考える。周波数特性のディップは色んな波長の音で反射した音が干渉して弱め合って発生するもので、無音室のようなスピーカー単体を測るような部屋では、反射音が無いためディップは発生しない。

PCとAKG Lyra(USB 96Kサンプリング24bit)があればPythonで動くアプリができてしまう。
プログラムに興味がある人はコメント下さい。

 

●USBマイク入手とPythonプログラム開発の動機
昨年、テレワークようにPCに接続するUSBマイクを購入した。購入したマイクはAKG Lyraというマイクで、税込17,380円の割には優れたコンデンサ―マイクロホンである。Front, Front&Back, Tight Stereo, Wide Stereoの4モードがあり、中でもFrontモードの周波数特性が20Hz~20kHzで-6dB以内に収まっていて、96kHzサンプリング24bitのHires収録ができるすぐれものである。

最近のプログラム言語のPythonには世界中の人が開発した種々の便利なモジュールを簡単にインポートしてプログラミングができる。今回は音声関連の入出力ができるPyaudioというモジュールをインポートして、PC出力からマイク入力までの周波数特性を測定して縦軸がdB,横軸が対数周波数のグラフを描画するプログラムを作ってみた。

 

●Pythonで周波数特性測定プログラム作成
必要なモジュールは以下の通り
import pyaudio            #音声信号入出力モジュール
import numpy as np        #行列式計算,FFT等
import matplotlib.pyplot as plt    #グラフ描画モジュール
import struct            #バッファのByte信号とpython変数との変換インターフェース

➀信号発生
 サンプリング周波数96000HzとしてNumpyでスイープ正弦波を作成し、16bitモノラルデータでバッファに書込みHeadphone端子から出力する。
 最初の2**19/9600Hz=5.46秒間は1Khz正弦波、次の5.46秒間は10~375Hzのスィープ信号、次の5.46秒間は375Hz~3000Hzのスィープ信号、その次の5.46秒間は3000Hz~24000Hzのスイープ信号を作成。合計21.8453秒間の信号である

    スイープ信号(左図)と3ブロックのスィープ信号の周波数特性(右図)



➁マイクAKG Lyraからの音声取り込み
 サンプリング周波数96000Hz、32bit、2CHで連続して上記21.845秒の音を取り込み、ストリームバッファから1024ずつ
取り込む。取り込んだデータを5.46秒ずつ4つのブロックに分けてフーリエ変換する。周波数分解能は1/5.46133=0.1831Hzの周波数分析ができる。サンプリング周波数が96kHzなので分析実効周波数は48kHzまでとなる。また、そのままでは周波数分解能は高すぎるので、FFT後の係数の2乗に5タップ程度のフィルタを掛けて分解能を1.0Hz程度に落とし、ノイズを改善した。



➂最初の5.46秒間の1kHzの正弦波のブロックはダミーでシステム音量調整用として使用する。
 オーディオシステムの音量が大きすぎないように、またマイクでオーバーフローしないようにマイク音量を調整する。
後の5.46x3ブロックのスイープ信号スペクトラムとマイクでひらった信号の周波数スペクトラムから、伝達関数として求め、3ブロックの特性を合成する。

④FFT変換した周波数成分の絶対値np.abs()をとり、20*np.log10()で振幅をdBで表現する。matplotlibで縦軸リニアdB表示、横軸周波数対数表示をすることで結果を表示する。


なお、動作については、anaconda+jupyter notebookでプログラムして動作確認した。
*.pyのファイルに編集してPythonで直接動作させようとしたが、エラーが発生して動かなかったので、*.ipynbのままで動作させている。

●オーディオルームの色々な場所での測定
本格的な3ウェイのシステムを置いている部屋の色々な場所での特性を評価した。マイクの置く位置を➀➁➂④と変えて測定した。場所によって周波数特性にディップが発生する周波数が異なる。壁や部屋に置いている物からの反射が色々な周波数で干渉し、打ち消し合っていると推定される。吸音材やカーテン等で特性を改善させる余地がある。逆に部屋の何かが共振したり、ビビったりすると、音が増幅されるのでその周波数でピーキーな特性になる。共振している側にマイクを置いて測定するとより強調されると推定される。オーディオルームの基本は反射を抑え、共振を防ぐ、これに尽きると思うが、このようなリアルタイムで周波数特性評価システムが実現したことで、対策や改善がよりスムーズにできると思う。

●考察
もう少しいいオーディオルームができたら、試聴する位置でのシステムの持つ周波数特性(ゲイン&位相)と逆の特性を、音楽ソースに施して再生すれば、試聴位置で理想的な音が再現されるはずなので、Pythonでこのような音楽ソースを加工するプログロムを作って試してみようと思う。