Skip to content

True Peak ​

True Peak は、信号を再生したときに実際に到達する最大レベルを推定する考え方です。デジタル音声は離散したサンプル点の連なりとして記録され、再生時にはその点をなめらかにつないで連続した波形へ戻します。こうして再構成された波形は、隣り合う 2 つのサンプルのどちらよりも、その間で高くなることがあります。True Peak はこの「点と点の間の最大値」を推定します。

サンプルピークが 0 dBFS 未満でも、変換や再生時の再構成でクリップすることがあります。点と点の間で上限を超えるこの部分が、サンプル間ピーク(ISP: inter-sample peak)です。波形の点だけを見ると安全に見えても、その点をつないでアナログ信号として再生したときに、点と点の間で上限を超えることがあります。単位は dBTP(decibels true peak)で、サンプルピークと同じ dB のスケールを、再構成後の波形に対して測ったものです。

LOUDNESS · TRUE PEAKIDLE
サンプル間ピーク — マスターが再生時にクリップする理由

ドットは正弦波のサンプル、曲線はその解析的な波形です。山の頂点がサンプル間に来ると、保存された値より高いピークが生じます。その差は周波数と位相で変わり、ナイキスト周波数に近づくほど単調に増えるわけではありません。解析的なピークと、オーバーサンプリングしたメーターの推定値を比較してください。サンプルピークを 0 dBFS に近づけると、サンプル間の超過が生じ、ヘッドルームの足りないコンバーターや後段の処理でクリップする可能性があります。

サンプルピーク
-0.3 dBFS
周波数(×ナイキスト)
0.4

シーリングの選び方と、納品前のマスターの確認は 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 安全性にあります。

typescript
import { init, meteringPeakDb, meteringTruePeakDb } from '@libraz/libsonare';

await init();

const samplePeak = meteringPeakDb(samples, sampleRate);        // dBFS
const truePeak = meteringTruePeakDb(samples, sampleRate);      // dBTP、4 倍オーバーサンプリング
python
import libsonare as sonare

audio = sonare.Audio.from_file("song.wav")
sample_peak = audio.peak_db()
true_peak = audio.true_peak_db()
bash
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 はリミッターの倍率で測定します。メーターを比較するときは倍率と補間方式を記録し、書き出した音源を納品先のメーターで確認して必要な余裕を確保してください。

関連: True Peak 安全性、マスタリングチェーン、LUFS