何かあれば GitHub のリポジトリに issue を作るか ryukau@gmail.com までお気軽にどうぞ。
Update: 2024-08-06
以下は原文へのリンクです。訳文は Markdown のフォーマットに整形しています。
各サンプルについて以下の処理を行う:
後で使うために、現在のサンプルを先読み時間のリングバッファに格納する (そして前段「出力」として抜け落ちてくる値を取得する)
このリングバッファ内の最大値を探す。これはホールドアルゴリズムで効率よく実装することもできる。
「入力ゲイン [dB] 」パラメータによって、この最大値にゲインをかける
必要なゲインリダクション係数を計算する (もしゲインリダクションが起こらないなら =1 、あらゆる 0 dBFS を超える信号については <1)
よりよい数値的な安定性のために、この値を 1 から引く。 (後で必ず元に戻すこと!)
短時間の合計を計算するために、このゲインリダクションの値を 1 つ目の小さいほうのリングバッファに加える (この値を合計に加算して、リングバッファから抜け落ちた値を減算する) 。
合計をリングバッファの長さで割って正規化する (-> / (「先読み時間 [samples] 」 / 2))
この合計を使って 2 つ目のリングバッファで手順 6 と 7 を繰り返す。これらの手順の理由はディラックのインパルスを三角形に変換すること (ディラック -> 矩形 -> 三角形)
リリース時間 (リリース時間 -> リリーススルーレート「係数」 -> その係数で乗算) を「最大ゲインリダクション」状態変数に適用する
今、計算されたゲインリダクションが「最大ゲインリダクション」より高いかをチェックする。もしそうなら入れ替えろ!
手順 5 の (1 - x) をここで除去する
入力から得られた上記の値と出力のゲインから実効ゲインリダクションを計算する。
このゲインリダクションを手順 1 の前段「出力」に適用する
全てのサンプルに上の処理 (手順 1-13) を繰り返せ!
手順 5 と 11 は誤差が減らずにエッジケースが増えるので、実装することはお勧めしません。この誤差について調べたことを以下のリンク先に掲載しています。