Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Python:1/1, 1/3オクターブバンド グラフィックイコライザの実装

音源制作の現場で最も利用されているプラグインの一つとして、ある周波数帯域を増幅/減衰させるイコライザがあります。

その一種であるグラフィックイコライザをPythonで実装してみます*1

グラフィックイコライザについて

イコライザにおいて重要なパラメタは、

  • 中心周波数
  • 帯域幅(Q値)
  • 増幅/減衰させる量

の3つになります。

フィルタの構成方法はいくつがありますが、特に双2次フィルタ(Biquad filter)を使う方法がよく知られています。

www.wizard-notes.com

多くのグラフィックイコライザでは、複数個のフィルタを用意します。そして、3つのパラメタの内の中心周波数と帯域幅を固定し、増幅/減衰させる量のみをユーザが操作できる仕様とします。

iTunesのグラフィックイコライザ

なお、グラフィックイコライザは1950年代から1960年代にかけてポストプロダクションや音声強調で流行し、例えばフェーダー付きであるプログラムイコライザ Langevin Model EQ-251A/EQ-252Aはグラフィックイコライザの先駆けと言われている製品だそうです。

(下記画像の参考元:EQ の概念とその向き合い方。

引用: http://www.preservationsound.com/

一方で、パラメトリックイコライザの理論や製品は1970年代に出てきているようです(YAMAHA - DEQ7 Digital Equalizeなど).

オクターブバンド分割(中心周波数と帯域幅の決定)

複数のフィルタを使うグラフィックイコライザでは、それぞれのフィルタで制御する周波数帯域を中心周波数と帯域幅(クロスオーバー周波数)で分けています。

グラフィックイコライザの中心周波数は、1/Nオクターブバンドで与えるのが一般的です。

すなわち、周波数が2倍になったときに対数軸で等間隔になるように周波数をN分割しています。

例えば、1000Hz を基準周波数とした1/3オクターブバンドを厳密に計算すると以下のようになります。

>>> import numpy as np
>>> k = np.arange(-12, 12)
>>> 1000 * 2 ** (k/3)
array([   62.5 ,    78.75,    99.21,   125.  ,   157.49,   198.43,
         250.  ,   314.98,   396.85,   500.  ,   629.96,   793.7 ,
        1000.  ,  1259.92,  1587.4 ,  2000.  ,  2519.84,  3174.8 ,
        4000.  ,  5039.68,  6349.6 ,  8000.  , 10079.37, 12699.21])
>>>    

また、クロスオーバー周波数は幾何平均で算出することができます。

>>> (62.5*78.75)**0.5
70.1560760020114

ただし、これらの中心周波数・帯域幅は使いにくいため、実用的にはISO 266やJIS C 1514:2002(= IEC 61260:1995)で定められています。

"All about audio equalization: Solutions and frontiers", Table1

1/3オクターブバンドの中心周波数・帯域幅, "All about audio equalization: Solutions and frontiers", Table2

実装

Audio EQ Cookbook に基づいて複数の双二次フィルタを実装します。

注意点として、今回はQ値ではなく帯域幅alphaの値を算出します。

このとき、帯域幅 bw は上限周波数fupと下限周波数flowから、

bw = np.log2(fup) - np.log2(flow)

として算出することに注意してください。

周波数特性のプロット

1/1オクターブバンドと1/3オクターブバンドの周波数特性をプロットしました。

各フィルタのゲインは、すべて +3dBとしています。

プロットの上段が各フィルタの振幅特性、下段が全フィルタを直列接続した場合の振幅特性です。

周波数特性 (1/1オクターブバンド)

周波数特性 (1/3オクターブバンド)

まとめ、単純なグラフィックイコライザの問題点

Pythonピーク/ノッチ型双二次フィルタによるグラフィックイコライザを実装しました。

上記のように単純な実装の場合、グラフィックイコライザの全体の周波数応答には問題があります

具体的には、各フィルタのゲインは+3dBですが、最終的な応答を見ていると 3dB以上のゲインになっています。

これは、各フィルタが他のフィルタが制御する周波数帯域にも影響を与えるためです。

次回は、このような問題を解決する方法として、グラフィックイコライザのフィルタゲイン最適化手法を紹介したいと思います。

参考文献

*1:今回はピーク/ディップのフィルタのみを扱います