Wizard Notes

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

グラフィックイコライザの周波数特性を補正するための最小二乗法による利得最適化

前回は、単純なグラフィックイコライザとして、1/Nオクターブバンドごとに双二次フィルタを用意し直列接続した実装を解説しました。

www.wizard-notes.com

しかし、この手法だと、グラフィックイコライザ全体の周波数特性として各中心周波数での振幅値が指定値から大きくズレてしまうという問題がありました。

この問題の解決方法として、最小二乗法での利得最適化によってグラフィックイコライザの振幅特性を補正する手法を紹介します。

なお、元論文は下記になります。

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

単純なグラフィックイコライザでは、各フィルタが制御する周波数帯域は1/Nオクターブバンドで分けられているものの、 他のフィルタが制御する周波数帯域にも影響を与えてしまいます

具体例として、上図の1/1オクターブバンドのグラフィックイコライザを振幅特性も見てみましょう。

図の上段を見ると、橙線のフィルタは、他のフィルタ(青,緑線など)が制御すべき周波数帯域の振幅特性にも影響があることが分かります。

従って、図の下段のようにグラフィックイコライザ全体の振幅特性としては各中心周波数で指定のゲインよりも大きな値となってしまいます。

最小二乗法による利得最適化

グラフィックイコライザの各フィルタの相互作用の影響を考慮したゲイン決定手法として、最小二乗法による各フィルタの利得最適化が提案されています。

これは非常にシンプルな最小二乗法の利用例です。パラメタとしては以下になります。

  • B: 各フィルタが各中心周波数でどのくらい振幅特性に影響を与えるかを示す行列
  • g: 各中心周波数での所望のゲイン値 (dB) ベクトル
  • g_opt: ベクトルから各フィルタに与えるゲイン値 (dB) ベクトル

従って、B逆行列g から g_opt を算出することができます。

g は、ユーザが与える値となります。

B については、まず各フィルタの振幅特性を計算します。

そして、各フィルタごとに、そのフィルタがそれ以外のフィルタの中心周波数で振幅をどのくらい増幅/減衰するかを計算することで得られます。

従って、ピーク/ノッチ型フィルタの場合は対角成分は 1 となり、そのフィルタの中心周波数に近接する中心周波数では1.0に近い値を取ります。

実装 (Python)

github.com

結果

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

各中心周波数における所望の振幅特性は、すべて +3dBとしています。

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

また、左側が利得最適化なし、右側が利得最適化をした場合のグラフィックイコライザ全体の振幅特性です。

この結果から、利得最適化によって各中心周波数で所望の振幅特性に近づくことが確認できました。

・1/1 オクターブバンドの場合

・1/3 オクターブバンドの場合

まとめ

グラフィックイコライザの周波数特性を補正するための最小二乗法による利得最適化を実装し、周波数特性プロットで効果を確認しました。

利得最適化ありのグラフィックイコライザでは各フィルタに直接ゲインをパラメタとして与えるのではなく、各中心周波数に対して目標ゲインを与え、最小二乗法で各フィルタのゲインを求めるところがポイントです。

なお元論文では、中心周波数ごとに重み付けを行い、特定の中心周波数を優先的に所望の振幅特性に近づける計算方法も紹介されています*1

*1:重み付け最小二乗法