フツーの DAW 上で行うゼロ位相フィルタリング
この記事は
いたって普通な DAW 上でゼロ位相フィルタリングを行う方法の紹介記事です。
フィルタとか位相とか何の話?
フィルターは EQ 全般だと思ってください。 典型的にはローパスフィルタとかハイパスフィルタとかの事を指しますが、EQ でよくあるピーキング(特定の周波数帯だけを上げ下げする)もフィルタの一種です。 以下全部、特定の周波数帯をゴニョゴニョする時のお話です。
で、位相と言うのはココでは音の遅れの事を指します。 ただ、遅れと言っても「波形が300ミリ秒遅れる」みたいな話ではなくて「波形が崩れる」という話です。
位相とか波形が崩れるとか何言ってんの?
まず、位相というのは「一定周期で繰り返すような音」の「遅れ」を「ディグリー(度)」で表したものです。 0 [deg] なら遅れなし、180 [deg] なら波形のちょうど半分だけズレる、360 [deg] なら一周まわって遅れてないように見える、って感じです。 今言ったのは「波形全体がまるごと XXX [deg] 分だけ遅れた」時の事を指します。
ところで、波形に EQ をかけると、この位相の遅れは発生します。
周波数ごとに遅れ方が異なりますが。
例えば、ローパスフィルタの場合なら、カットオフ周波数よりも高い周波数の帯域は位相が(あんまり)遅れませんが、カットオフ周波数よりも低い周波数帯になると周波数の低さに比例して位相の遅れが大きくなります。
こういう、フィルターの「周波数による位相の遅れ具合」のことを位相特性
とか呼んだりします。
さて、この位相特性によっては周波数帯によって音が遅れたり遅れなかったりするので、そんなことをすれば当然波形が崩れます。 こうやって、位相特性によって波形が崩れる事を位相がおかしいだの崩れるだのと言ったりします。 例えば、ある波形にローパスフィルタをかけた場合、位相が崩れていなければ、単純に元波形のピークを落として滑らかにしたような波形が出てきますが、位相が崩れると波形のピークのいちが変わります。 もっと露骨な例で言えば、純粋なノコギリ波は完全に位相が揃った状態なのですが、倍音成分の位相だけをランダマイズするとノイズみたいな波形になり(sytrus なんかの加算合成シンセだと簡単に再現出来ます)、聴感上でもなんだかノイズっぽい音になります。
結局ゼロ位相フィルタとは
なので、基本的には位相が崩れるのは(意図してなければ)あまりうれしくないわけです。
できれば位相が変化せず、振幅だけが変化するフィルタがほしいわけです。こういうフィルタの事をゼロ位相フィルタ
と言います。
線形位相フィルタ
ゼロ位相ではありませんが「波形の形を保ったまま波形全体が遅れる」みたいなフィルタもあります。 こいうフィルタの事を線形位相フィルタといいます。 位相特性をプロットした時に直線が出て来るので線形位相って言います。 なんで線形位相なら波形が崩れないのか? みたいな話は、実際に試してみるとたしかにそうなります(暇な人はやってみよう!)
波形全体が遅れるのなら、遅れた分を補正すればゼロ位相じゃん! っていうやり方も出来ますが、世の中の線形位相 EQ はどういうわけかカットオフがゆるいです。 特定周波数でシュッとカットオフとか苦手です。 うーん困った。
どうやってゼロ位相フィルタリングするのか
ということで本当に位相の遅れが発生しないフィルタリングの方法の紹介です。
- 元波形を A とします
- 波形 A に EQ を普通にかけます(波形 B)
- 波形 B をリバースします(逆再生です、波形 C)
- 波形 C に もっかい EQ をかけます(波形 D)
- 波形 D をリバースします
おめでとうございます! これでゼロ位相フィルタの完成です! 原理は本当にめちゃくちゃ簡単で「位相が遅れるんなら逆再生にして同じだけ遅らせれば良いじゃない!」ってことです。
元ネタは
scipy.signa.filtfilt()関数です。 これ最初見た時全く意味がわからなかったんですが、ある日突然意図に気づきました。
弱点
- フィルタの2回重ねがけを強要されます。
- 注意したいのは、例えば「-12dB/Oct のローパスフィルタを2回」=「-24dB/Oct のローパスフィルタを1回」は等価ではないです。
- 大体似たような振幅特性になるのですが等価ではないので注意が必要です。
- このあたりの解説はリンクウィッツ・ライリーフィルタを調べるとわかります。
- ちなみに、リンクウィッツ・ライリーフィルタは同じフィルタを2回かける手法なので、このゼロ位相フィルタリングと相性が良いです。
- そしてリンクウィッツ・ライリーフィルタはクロスオーバーに使われます。
- つまり、位相を崩さずに、キレの良いマルチバンド処理ができます
- リアルタイム処理は出来ません
- 波形をリバース出来ないといけないので、録音済みの波形にしか適用出来ません。
- 因果関係が崩れます
- 例えば、スネアの音にこの方法を適用すると、なりはじめの前の無音部分に影響が発生します
- つまり、未来の音が過去に影響を与えてしまいます!
- 単純にめんどくさい
- EQかけてリバースして…なんてぶっちゃけイチイチやってられない…
感想
こんな簡単なことにも気付かなかったなんて(KNN)