True Peak
True Peak は、信号を再生したときに実際に到達する最大レベルを推定する考え方です。デジタル音声は離散したサンプル点の連なりとして記録され、再生時にはその点をなめらかにつないで連続した波形へ戻します。こうして再構成された波形は、隣り合う 2 つのサンプルのどちらよりも、その間で高くなることがあります。True Peak はこの「点と点の間の最大値」を推定します。
サンプルピークが 0 dBFS 未満でも、変換や再生時の再構成でクリップすることがあります。点と点の間で上限を超えるこの部分が、サンプル間ピーク(ISP: inter-sample peak)です。波形の点だけを見ると安全に見えても、その点をつないでアナログ信号として再生したときに、点と点の間で上限を超えることがあります。単位は dBTP(decibels true peak)で、サンプルピークと同じ dB のスケールを、再構成後の波形に対して測ったものです。
シーリングの選び方と、納品前のマスターの確認は True Peak 安全性 で説明しています。このページでは、その数値が何で、どう測るのかを扱います。
再構成でどこまで上がるか
デジタルファイルは滑らかな曲線ではなく、離散的なサンプル点の列です。DAC(デジタル/アナログ変換器)やエンコーダーはその点を補間して連続波形に戻し、戻した波形は保存された点より高くなることがあります。True Peak 計測では、信号をオーバーサンプリング(保存された点の間に追加の点を計算すること)してからピークを調べることで、このリスクを推定します。2 つの読み値がどれだけ離れるかは、素材によって変わります。
| 信号 | サンプルピーク(dBFS) | True Peak(dBTP) |
|---|---|---|
| サンプルレートの 1/4 の周波数で位相 45° のサイン波 | -3.01 | -0.09 |
| 矩形波(振幅 0.5) | -6.02 | -4.11 |
mixed-stems.wav | -1.1 | +0.2 |
drum.wav | -0.7 | +1.4 |
下の 2 行は、サンプル上は 0 を下回っていても、再構成すると 0 を超えるファイルです。drum.wav は -0.7 で安全に見えますが、再構成するとおよそ 2 dB 高くなります。一般的な素材でおおよそ +0.5〜+1 dB、低域と高域が同時に走るような厳しい素材では +2 dB 近くまで上がることもあります。
最初の行のサイン波の True Peak は、厳密には 0 dBTP です。サンプルはフルスケールの 0.707 倍の位置にあり、それらを通る曲線は 1.0 に達します。4 倍のメーターが -0.09 と読むのは補間フィルターが完全ではないためで、倍率を上げると 0 の前後約 0.1 dB に収まります(8 倍では +0.04)。True Peak の読み値は 0.1 dB 程度の精度と考え、メーターを比べるときは同じオーバーサンプリング倍率にそろえてください。
libsonare で測る
True Peak メーターは既定で 4 倍オーバーサンプリングし、1・2・4・8・16 を指定できます。シーリングを守るリミッターは、チェーンのステージ maximizer.truePeakLimiter です。使い方は True Peak 安全性にあります。
import { init, meteringPeakDb, meteringTruePeakDb } from '@libraz/libsonare';
await init();
const samplePeak = meteringPeakDb(samples, sampleRate); // dBFS
const truePeak = meteringTruePeakDb(samples, sampleRate); // dBTP、4 倍オーバーサンプリングimport libsonare as sonare
audio = sonare.Audio.from_file("song.wav")
sample_peak = audio.peak_db()
true_peak = audio.true_peak_db()sonare-cli meter song.wav # ネイティブ CLI のみ: サンプルピークと True Peak を含む(--oversample で倍率を指定)LUFS との関係
True Peak シーリングはラウドネス目標とは別の制約です。LUFS を上げたいからシーリングを上げる、という判断は危険です。シーリングを上げると一時的に大きくできても、コーデック変換や再生側の再構成でクリップしやすくなります。ラウドネスステージがリミッターをどう駆動し、どこまで駆動を許されるかは ステレオ、リミッター、ラウドネスコントロール で説明しています。
サンプル精度のリミッティング
リミッターの出力はバッファサイズに依存しないので、どのブロック長のプレビューでも、同じファイルのオフライン書き出しでも、サンプル単位で一致します。詳細は下の実装メモにあります。
実装メモ
True Peak 検出は、入力サンプルをそのまま見るサンプルピーク検出とは違い、信号をオーバーサンプリングして再構成後の波形の最大値を取ります。libsonare はこのオーバーサンプリングをポリフェーズ補間フィルターで行い、サンプル間の各位相での値を評価します。ポリフェーズフィルターはオーバーサンプリングの代替手段ではなく、その実現方法そのものです。倍率は 1/2/4/8/16 倍に対応し、デモの既定は 4 倍です。
リミッターは、オーバーサンプリング後のレートで 1 サンプルごとにシーリングを適用します。内部のどの段も、ルックアヘッドもゲインの平滑化もデシメーション後のガードも、サンプル単位で直列に動き、呼び出しをまたいで状態を持ち越します。出力のどこにもブロック全体の統計量から導いた値はないので、同じ素材を 256 サンプルのコールバックで処理しても、16384 サンプルのブロックでも、オフラインで一括でも、トランジェントの途中で切れる不揃いな分割でも、結果は一致します。ホストのバッファサイズが出力音に影響しない場合にだけレンダリングは再現可能になります。ブロックごとにそのブロック自身の最大値でスケールし直すリミッターでは、レベルがブロックサイズの関数になってしまいます。
シーリングの保証は既定のポリフェーズ経路のものです。この経路はオーバーサンプリングした信号を制限してからデシメーションします。applyGainAtInputRate オプションはゲインエンベロープを元のレートの信号に適用します。ベストエフォートであり、サンプル間のシーリングは保証されません。オフのままにしてください。8 倍や 16 倍で動かしたリミッターは、出力を 4 倍で読んだ値もシーリング以下に保ち、検出から外れるチャンネル(LFE)は、ゲインを左右させることなくシーリング以下に収められます。
設定したシーリングを外部の True Peak メーターが上回って読むことがあります。推定値は再構成フィルターとオーバーサンプリング倍率に依存するためです。4 倍のリミッターと 8 倍のメーターを使った 1 つのテスト素材では約 +0.02 dB でしたが、これはすべての音源に共通する上限ではありません。チェーンの outputTruePeakDbtp はリミッターの倍率で測定します。メーターを比較するときは倍率と補間方式を記録し、書き出した音源を納品先のメーターで確認して必要な余裕を確保してください。