クロスオーバーのスロープとモード
マルチバンドプロセッサはどれも、信号を周波数帯域に切り分け、帯域ごとに処理し、また足し合わせるところから始まります。切り分けを担うのがクロスオーバーです。その設定は、どの帯域にも手を加えないときでさえ聞き取れる 2 つのことを決めます。帯域を足し戻したときに元のレベルに戻るかどうかと、通過するあいだにタイミングと位相に何が起きるかです。
カットオフとスロープ
カットオフは、ある帯域が次の帯域へ受け渡す周波数です。フィルターはある周波数でぴたりと止まれないので、各帯域はカットオフをまたいで徐々に消えていきます。その速さを表すのがスロープで、カットオフを過ぎてから 1 オクターブあたり何デシベル下がるかで示します。スロープが緩いと隣の帯域が広く重なり、低域のコンプレッサーが中域の一部にも反応します。急なスロープは各帯域を自分の範囲に収めますが、そのぶんフィルター段が増えます。
libsonare はスロープをフィルター次数で呼びます。lr2・lr4・lr8 は 2 次・4 次・8 次で、それぞれ 1 オクターブあたり 12・24・48 dB です。接頭辞の lr は次数を表す名前にすぎず、Butterworth と Bessel のモードでも同じ 3 つの値で次数を決めます。multiband.compressor の低域帯をカットオフ 120 Hz で測ると、カットオフの 1 オクターブ上では −14.0・−24.6・−48.2 dB、2 オクターブ上では −24.6・−48.2・−96.3 dB でした。
4 つのモード
モードはフィルターの系統を選びます。スロープが同じでも、系統によってカットオフでの各帯域のレベルが違い、そのため和の形も変わります。以下の値は、multiband.compressor を既定のカットオフ 120 Hz と 2 kHz、既定のスロープ lr4 で動かし、全帯域のレシオを 1 にして測ったものです。この状態では、プロセッサが信号を変えるのはクロスオーバーだけです。
mode | カットオフでの帯域レベル | lr4 での帯域の和 | レイテンシ |
|---|---|---|---|
linkwitzRiley(既定) | −6.0 dB | 平坦(0.00 dB)、位相は回転 | 0 |
butterworth | −3.0 dB | 各カットオフで +3.0 dB の盛り上がり | 0 |
bessel | −3.0 dB、減衰が緩い | 各カットオフで +1.7 dB の盛り上がり | 0 |
firLinearPhase | カーネルが十分長ければ −6.0 dB | 遅延後に完全一致(0 dB、0°) | (firKernelSize − 1) / 2 サンプル |
どのスロープでも和が平坦になるのは Linkwitz-Riley と FIR モードだけです。残りの 2 つはカットオフで盛り上がり、その量はスロープによって変わります。
| 120 Hz と 2 kHz のカットオフでの和 | lr2 | lr4 | lr8 |
|---|---|---|---|
butterworth | +3.0 dB | +3.0 dB | +3.0 dB |
bessel | +2.7 dB | +1.7 dB | +3.0 dB |
2 つのカットオフの値は 0.05 dB 以内で一致します。スロープによっては、カットオフで 2 つの帯域の位相が 1/4 周期より大きくずれ、そのまま足すと打ち消し合います。libsonare はそうした組の高域側を極性反転するので、和はノッチにならずカットオフで盛り上がります。3 帯域以上の分割では、さらに下側の帯域を位相補償します。Linkwitz-Riley と線形位相 FIR モードはこの影響を受けません。
- linkwitzRiley lr4
- firLinearPhase
- butterworth lr4
- bessel lr4
- butterworth lr2
Linkwitz-Riley が既定なのは、カットオフでそれぞれ 6 dB 下がった 2 つの帯域を足すと元の 1 倍に戻るからです。和のレベルはどのスロープでも平坦ですが、位相は平坦ではありません。和はオールパスフィルターとして振る舞い、周波数ごとに違う量だけ遅らせます。既定の lr4 では、和の位相が 1 kHz で −67°、各カットオフ付近で約 180° 回ります。持続音ではまず聞き取れませんが、鋭いトランジェントではアタックがわずかににじみます。
Butterworth は各帯域の通過域を最も平坦にします。ただし 3 dB ずつ下がった 2 帯域を足すと、どのスロープでも各カットオフで +3 dB になります。Bessel は各帯域のタイミングの乱れを抑えますが、3 つの中で最も減衰が緩く(lr4 でカットオフの 1 オクターブ上が −13.4 dB。Linkwitz-Riley では −24.6 dB)、和はカットオフで +1.7〜+3 dB 盛り上がり、lr4 ではその 1 オクターブ上下で約 1 dB 凹みます。どちらも、帯域をどのみち強く加工するので和の特性は問題にならない、という場面で選ぶモードです。
線形位相 FIR は、再帰型フィルターの代わりにカットオフごとの対称な窓付き sinc カーネルを使います。上側の帯域は遅らせた入力から下側の帯域を引いたものなので、帯域の和は入力と完全に一致し、どの周波数でも位相は回りません。このモードでは slope キーは無視され(lr2 と lr8 は同じ出力になります)、急峻さは firKernelSize で決まります。
FIR モードのコスト
FIR モードは完全な再構成と引き換えに、3 つのコストを払います。
- レイテンシ。 帯域どうしをそろえるため、すべての帯域がカーネルの半分だけ遅れます。既定の 513 タップで 256 サンプル(48 kHz で 5.3 ms)、2049 タップで 1024 サンプルです。IIR のモードは遅延を加えません。インサートはこの遅延を報告し、
masteringProcessは入力と位置をそろえた出力を返します。 - 分解能はオクターブではなくヘルツ単位。 カーネルの遷移帯域の幅はヘルツで一定なので、1 kHz できれいに分けられるカーネルでも低いカットオフは分けきれません。120 Hz で 513 タップのとき、低域帯は 60 Hz ですでに −1.3 dB、カットオフでは −5.3 dB にとどまります。4097 タップにするとカットオフで −6.0 dB、1 オクターブ下で 0.0 dB に戻りますが、レイテンシは 2048 サンプルになります。
- 減衰の底とプリリンギング。 ハン窓を掛けたカーネルの阻止量は、どこまでも下がるのではなくおよそ −43〜−52 dB で底を打ちます。また対称なカーネルは、トランジェントの後だけでなく前にも鳴ります。
ライブで動くものや演奏者に追従するものでは、既定の Linkwitz-Riley のままにします。firLinearPhase を選ぶのは、帯域ごとの処理が大きく違い、帯域間の位相のそろい方が問題になるオフラインのマスターです。その場合、カーネルは最も高いカットオフではなく最も低いカットオフに合わせて決めます。
libsonare でのクロスオーバーの設定
クロスオーバーは multiband.* のすべてのプロセッサ(compressor、expander、limiter、imager、saturation、dynamicEq)で共通で、ソロの masteringProcess 呼び出し、ミキサーのストリップ、リアルタイムエンジンのインサートのどこで動かしても同じです。インサートのキーは cutoff0Hz 〜 cutoff7Hz(最大 8 個。正の値で厳密に昇順、ナイキスト未満。既定は 120 Hz と 2000 Hz)、slope('lr2' / 'lr4' / 'lr8'、既定は 'lr4')、mode('linkwitzRiley' / 'butterworth' / 'bessel' / 'firLinearPhase')、firKernelSize(既定 513。奇数かつ 3 以上で、偶数は拒否されます)です。4 つとも構築時のパラメータで、オートメーションできる操作子ではありません。マスタリングチェーンでは同じ設定が dynamics.multibandComp.crossover の下に { cutoffsHz, slope, mode, firKernelSize } としてあり、cutoffsHz はカットオフのリストを置き換えて帯域数を決めます。チェーンでは最大 63 個のカットオフと 64 バンドまで指定できます(チェーン設定 JSON スキーマ を参照)。ある構成のレイテンシは masteringInsertTiming(name, params, sampleRate) で正確に分かります。多分割の Linkwitz-Riley では、下側の各帯域がそれより上の分割点のオールパス段を通るので、すべての帯域が同じ位相回転を持ち、和は平坦なままです。