BMS, Movie, Illustrations, Programming

Linkwitz-Riley フィルタの位相についての補足

結論

まず Wikipedia を読め。

結論

Linkwitz-Riley フィルタの次数が 2, 6, 10, 14,… 次 (4k-2 次) の場合は、クロスオーバーフィルタとして機能させるためには高域バンドの位相を反転させる必要がある。

言い換えると、高域バンドを低域バンドから減算する必要がある。

理論(読まなくて OK)

1. 低域バンド

実数係数の安定なデジタルローパスフィルタについて、直流周波数の位相特性は必ず 0°(または符号反転で 180°)である。

これを 2 個直列接続すると、 0° となる。

2. 高域バンド

一方で、実数係数の安定なデジタルハイパスフィルタについて、ナイキスト周波数の位相特性は 0° (または符号反転で 180°)である。

さて、n 次のバターワースフィルタは零点が単位円上に n 個(画像内緑色)、単位円の内部に極が n 個(画像内赤色)ある。これらの寄与を足し合わせると、零点の箇所を除いて単位円を反時計回りに一周した場合(画像内水色)、位相が -180n° だけ変化するはずである。従って、虚軸方向の極零配置の対称性から、半周では位相が -90n° だけ変化するはずである。

以上より、n 次のバターワース型のデジタルハイパスフィルタの、直流周波数の近傍での位相特性は 90n° または (180+90n)° になる。これを 2 個直列接続すると、直流周波数近傍での位相特性は 180n° になる。

3. 低域バンドと高域バンドの合成

この、いま構成した高域バンドと低域バンドを見比べてみると、n が奇数のとき、位相差が 180° あることがわかる。このため、位相を一致させてクロスオーバーフィルタとして機能させるためには、どちらかのバンドを位相反転させる必要があることがわかる。

追記(記事を書いた後に気付いた)

# 2, 6, … 次Linkwitz-Riley フィルタの場合、片方の極性を反転
h_lr_high = -h_lr_high if (order*2+2) % 4 == 0 else h_lr_high

よく見たらちゃんと参考文献 [1] のソースコード内コメントに書いてありましたね……大変失礼いたしました……。

さらに言うと Wikipedia[2] にも書いてありますね……(完)

参考文献

[1] マルチバンド(オーディオクロスオーバー)処理を実現するフィルタ(Butterworth, Linkwitz-Riley)のPython実装(2バンド)
https://www.wizard-notes.com/entry/python/audio-crossover-filter-2-band

[2] Linkwitz–Riley filter – Wikipedia
https://en.wikipedia.org/wiki/Linkwitz%E2%80%93Riley_filter