ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

APE の予測器解析ほぼ完了?

疲れた...頑張って仕様書っつーか予測のアルゴリズム
テキストにまとめてきました。


APE の開発元が資料公開しないからこういうことをしなきゃ……
…んで後で資料発見したら泣きますよ!?
しかも書いてあること全然違ったりしたら窓から飛び降りるかもですよ!?
…流石に飛び降りはしないけど。(苦笑)


人に説明するのってものすごく苦手なので、
所々意味不明になってるかもしれませんが、
資料としてここにUPしておきます。

識者の方のツッコミ欲しいです...

§ 概要 §

・予測関数は、圧縮の関数より順番に一個ずつ生データを引数に呼び出される。
・生データは 32bit 整数値である。

1. 生データから第1予測値を算出し、それとの誤差を第1予測誤差とする。
2. 過去の第1予測誤差から第2予測値を算出し、第1予測誤差との誤差を第2予測誤差とする。
3. 過去の第2予測誤差から第3予測値を算出し、第2予測誤差との誤差を第2予測誤差、すなわち出力値とする。

/*-------------------------------------------------------------------*/

§ 第1予測値誤差算出 §

・予測の強さを m / n とする。
・データは一個前のみ覚えておく。

 直前のデータを m / n 倍し、それを第1予測値とする。
それとの誤差を第1予測誤差とする。

/*-------------------------------------------------------------------*/

§ 第2予測値誤差算出 §

・ステレオの場合、直前の反対チャンネルの生データを nB として利用。
 モノラルの場合 nB は常に 0 を示す。 ( nB は当然、第1予測誤差。 )
・予測用データとして、対象データには 4 個、nB には 5 個の整数配列を確保。

▼対象データの予測値の種を算出

 現在の第1予測誤差を対象データとしてバッファに保存。
2個前のデータを1個前のデータより減算し、それを新しい2個前のデータとする。

 対象データと予測用データを各々乗算し、その和を求める。
これを対象データの予測値の種とする。

▼参考データの予測値の種を算出 ( nB )

 現在の nB を参考データとしてバッファに保存。
1個前のデータを現在のデータから減算し、それを新しい1個前のデータとする。
 ( もともと一個前の反対のチャンネルのデータであるので展開可能。)

 参考データと予測用データを各々乗算し、その和を求める。
これを参考データの予測値の種とする。

▼第2予測値算出

 対象データの種 + 参考データの種÷2

を 1024 で割ったものを第2予測値とし、
第2予測値と第1予測誤差との誤差を第2予測誤差とする。

▼適応データの更新

 予測用データの適応データとして、予測用データと同数の整数配列確保。
 対象・参考共に、最新と直前の数値のみを操作する。
 一個前の対象・参照データが負なら 1、正なら -1、0 なら 0 を適応データとする。

▼対象・参考データの更新

 対象・参考データに、適応データを加算・減算する。
 第2予測誤差が正なら減算、負なら加算とする。0の場合は何もしない。

/*-------------------------------------------------------------------*/

§ 第3予測値誤差算出 § ( = NNFilter )

 前提として、予測に使うデータの長さを以下 nOrder とする。
すると、直前までの生データを nOrder 個保持していることになる。
さらにもう一つ。予測に使うため、適応パラメータとして nOrder 個の整数配列も持つ。
※ 過去のデータは初期値 0 で埋められている。

▼第3予測値算出

 まず、nOrder 個ある過去のデータと適応パラメータを各々乗算し、その和をとる。
そして、その数値の上位数 bit を残してを 0 で埋めるが、その際に近いほうへ丸め込む。
 ( つまり、3bit 残すなら xxx00000 と xxx00000 + 00100000 の近いほうを選ぶ )
これを予測値とし、この数値と生データとの差が、第3予測誤差である。

▼適応パラメータの更新

 nOrder 個の適応パラメータと共に、同数の差分パラメータを持つ。

 まず適応パラメータに差分パラメータの数値を各々加算/減算する。
第3予測誤差が正の場合は減算、負の場合に加算とする。0の場合は何もしない。

▼差分パラメータの更新

 生データの過去の平均値を保持しておく。( 算出法は後記 )

下の表によって今回の差分パラメータを生成し、保持する。

 ※ 生データの絶対値が平均値の3倍以上の場合 … 32
        〃     の1.25倍以上の場合 … 16
        〃     より大きい場合   … 8
        〃     より小さい場合   … 0
 ※ 生データの最上位 bit が 0 の場合は負にする。

その後、差分パラメータの過去 1, 2, 8 のデータを半分にする。

▼過去の平均値の更新

 ( 生データの絶対値 - 平均値 ) / 16

を加算する。