mcelp 1.0.1

Mitsubishi CELP speech codec: a 3.6 kbit/s speech encoder and decoder
Documentation
# 利得

各サブフレームの励振は、2つの寄与に利得を掛けて足したものです。

```
励振 = gₚ · (適応コードブック) + g_c · (固定コードブック)
```

両方の利得は**単一の7ビット索引**から得られます。別々に送らず同時に送るのは、
両者が相関しているためです——強い有声サブフレームは大きなピッチ利得と小さな
符号利得を求め、逆もまた然り——なので、同時コードブックは独立な2本より遥かに
効率よく有用な領域を覆えます。

## 共役コードブック

7ビットは2段に分かれます。

```
索引 = [ 3 ビット ][ 4 ビット ]
          │           └── 第2段:16行 ×(ピッチ項, 符号項)
          └────────────── 第1段: 8行 ×(ピッチ項, 符号項)
```

2つの行を成分ごとに加算します。8 × 16 = 128 通りの組合せを、わずか24行の表
から得ています。これが「共役」構造で、全数探索できるほど探索を安価にします。

和の第1成分がピッチ利得で、そのまま使われます。第2成分は符号利得**ではありま
せん**。*予測された*符号利得に掛ける補正係数です。

## 符号利得を予測する理由

固定コードブック利得は音声のダイナミックレンジ全体——無音から叫び声まで——を
覆う必要があり、直接符号化すると多くのビットを要します。しかし予測しやすい量
でもあります。今回のサブフレームで励振が必要とする電力は、励振自身の電力を
勘案すれば、前サブフレームで必要だった値に近いのです。

そこでコーダは予測します。

1. 今回のサブフレームの励振の電力を取る;
2. 直近4サブフレームの*予測誤差*の4タップ移動平均を取る(dB で保持);
3. 両者を合わせて、今回必要になるはずの利得を予測する;
4. 送るのは補正係数だけ——実際の答えが予測からどれだけ離れているか。

補正係数は利得そのものより遥かに狭い範囲に収まるので、4ビットのコードブックで
運べます。予測器の記憶は、ストリームを途中から復号できなくする状態の1つです。
過去4つの誤差を取り違えると、以降の符号利得はすべて狂います。

ここでの計算はすべて対数領域で行われます。モジュールが `log2` と `2^x` の表を
持つのはそのためです。利得は乗法的な量であり、dB で平均するということは実際に
定常な量を平均するということです。

## エンコーダ側の探索

閉ループは、そのサブフレームを記述する5つの測度を残します。目標・適応寄与・
固定寄与の間の、2つの電力と3つの相関です。候補ごとの符号化誤差は、2つの利得に
関する5項の重み付き和として書けます——

```
p², p, v², v, p·v
```

——ここで `p` が符号利得、`v` がピッチ利得です。したがって探索は何も合成する
必要がなく、この2次形式を128エントリすべてについて評価し、最小のものを残すだけ
です。

5つの測度は、電力と相関が混在するため異なるスケールで届きます。まず共通の指数に
揃えます。最大のものより16ビット以上小さい測度は仮数を下げて残りの差をシフト量に
持たせ、32ビット以上小さいものは完全に捨てます。

## 消失フレーム

フレームが失われるとデコーダは利得索引を読めません。代わりに、両利得は連続する
消失フレームにわたって0へ減衰し、電力予測器の記憶はリセット値の床へ引き下げ
られます。消失が長く続くほど減衰は深くなるので、バースト消失は最後の正常利得で
固まるのでも突然切れるのでもなく、フェードアウトします。