* Fri Dec 3 00:00:00 JST 2004 Naoyuki Sawa

- ADPCMの仕組み#3




前回まで、YM2608方式のADPCMのデコード・エンコード手順について見てきました。 今回より、P/ECE方式のADPCMのデコード・エンコード手順について見ていこうと思います。 YM2608方式とP/ECE方式を較べると、予測変化量の扱い方や係数などにやや違いはあるものの、おおまかな手順はほとんど同じです。 YM2608方式のADPCMを理解してしまえば、P/ECE方式のADPCMを理解するのも簡単だと思います。 今回、まずデコード処理を解説し、それからエンコード処理を解説することにします。
P/ECE方式のADPCMデコード処理のフローチャートを書いてみました。 PDFVisio 前々回に示したYM2608方式のADPCMデコード処理のフローチャートと較べてみると、P/ECE方式の方がやや単純です。
それでは、一手順づつ追ってみます。 初期状態では“前のデータ”がありませんので、適切な初期値を定める必要があります。 P/ECE方式は初期状態で、(仮想的な)前回のPCM出力値を0と仮定します。(YM2608方式と同じですね) PCM値は符号付き16bitで、値の範囲は-32768〜32767なので、0は中央です。 また、初期状態での予測変化単位量を16と仮定します。 予測変化単位量という用語は初出ですが、これは僕が勝手にそう呼ぶことにしただけで(^^;、P/ECEカーネルソースの中では“delta”と名付けられています。 YM2608方式では“予測変化量”の初期値を127と定めたのに対して、P/ECE方式では“予測変化単位量”の初期値を16と定めます。 予測変化量と予測変化単位量の違いについては、このあと説明します。 最初のADPCM値を読み込みました。 P/ECE方式のADPCM値もYM2608方式と同じく、1サンプル当り4bitで構成されています。 が、解釈の仕方が異なります。 YM2608方式のADPCM値のビット構成は、こうでした。
YM2608
bit3bit2bit1bit0
増減方向変化率
YM2608方式の全てのADPCM値の意味を表にすると、次のようになりました。
YM2608
ADPCM値増減方向変化率実際の変化量
00:増加0+予測変化量× 1÷8
10:増加1+予測変化量× 3÷8
20:増加2+予測変化量× 5÷8
30:増加3+予測変化量× 7÷8
40:増加4+予測変化量× 9÷8
50:増加5+予測変化量×11÷8
60:増加6+予測変化量×13÷8
70:増加7+予測変化量×15÷8
81:減少0−予測変化量× 1÷8
91:減少1−予測変化量× 3÷8
101:減少2−予測変化量× 5÷8
111:減少3−予測変化量× 7÷8
121:減少4−予測変化量× 9÷8
131:減少5−予測変化量×11÷8
141:減少6−予測変化量×13÷8
151:減少7−予測変化量×15÷8
これに対して、P/ECE方式のADPCMのビット構成は、次のとおりです。
P/ECE
bit3bit2bit1bit0
変化率 + 8
YM2608方式では変化率と増減方向のビットが分かれていましたが、P/ECE方式ではADPCM値全体が変化率を表しています。 ただし、変化率に対してADPCM値は+8バイアスがかかっていますので、ADPCM値から変化率を求めるには、 変化率←ADPCM値 - 8 とします。 ADPCM値は4bitで構成されていますから、本来0〜15の範囲の値をとることができます。 従って、変化率の範囲は-8〜+7となるはずです。 しかし実際には、P/ECE方式のADPCMでは、ADPCM値として0を使わず、1〜15の範囲の値だけを利用します。 従って、変化率の範囲は-7〜+7となります。 pPCMCnv.exe(P/ECE開発環境の音声データ作成ツール)を使ってADPCM形式の音声データを作成した場合、ADPCM値0が含まれることは絶対にありません。 もしも、ADPCM形式の音声データにADPCM値0が含まれていた場合、P/ECEカーネルのADPCMデコーダの動作は予測不能となります。 音声データ作成ツールを自作したりする場合は、要注意です。 P/ECE方式の全てのADPCM値の意味を表にすると、次のようになります。
P/ECE
ADPCM値変化率実際の変化量
0-8使用不可!!
1-7−予測変化単位量×7
2-6−予測変化単位量×6
3-5−予測変化単位量×5
4-4−予測変化単位量×4
5-3−予測変化単位量×3
6-2−予測変化単位量×2
7-1−予測変化単位量×1
8 00
9 1+予測変化単位量×1
10 2+予測変化単位量×2
11 3+予測変化単位量×3
12 4+予測変化単位量×4
13 5+予測変化単位量×5
14 6+予測変化単位量×6
15 7+予測変化単位量×7
YM2608方式では予測変化量を中心に1/8倍〜15/8倍までカバーしていたのに較べ、P/ECE方式では予測変化単位量を最小単位として0倍〜7倍までをカバーします。 増加方向または減少方向の一方に注目して、カバーできる範囲の中央を予測変化量と考えると、 P/ECE方式における予測変化量は、予測変化単位量の3.5倍に相当する ということになります。 # YM2608方式との対比のために予測変化量を持ち出しているだけで、あまり重要ではないので深く考えないで下さい。 # P/ECE方式のADPCMだけを考えるならば、予測変化量の概念は不要です。予測変化単位量だけを意識すれば充分です。 PDFVisio P/ECE方式において、予測変化単位量の初期値を16と定めることは、予測変化量の初期値を16×3.5 = 56に定めていることと同じです。 (YM2608方式における予測変化量の初期値127に較べると半分弱ですけれど、この程度の違いは個々の方式の調整の範疇だと思います。) さて初期状態では(仮想的な)前回のPCM値が0、予測変化単位量が16ですので、最初のADPCM値でカバーできる範囲は次のようになります。 PDFVisio 最初のADPCM値を13、としましょう。一回目のPCM出力値は80、ということになります。 PDFVisio 次回のために、予測変化単位量を更新します。 予測変化量は16×3.5 = 56でしたが、実際の変化量はそれよりも大きな値(80)でした。 そこで、次回の変化量も56より大きいだろう見込んで、予測変化量をより大きな値に修正します。 予測変化量は予測変化単位量に比例しますから、結局、予測変化単位量を大きくすればいいわけです。 予測変化単位量を修正する計算式は、今回の変化率の絶対値によって決まります。 今回の変化率の絶対値(|変化率|)と、予測変化単位量を修正する計算式との対応は、次のとおりです。
|変化率|予測変化単位量を修正する計算式
0次回の予測変化単位量←今回の予測変化単位量×233÷256
1
2
3
4次回の予測変化単位量←今回の予測変化単位量×310÷256
5次回の予測変化単位量←今回の予測変化単位量×375÷256
6次回の予測変化単位量←今回の予測変化単位量×453÷256
7次回の予測変化単位量←今回の予測変化単位量×549÷256
ちょっと本題から外れて、YM2608方式とP/ECE方式の係数を比較してみることにします。
|変化率|YM2608P/ECE
0 57÷64 = 89%233÷256 = 91%
1
2
3
4 77÷64 = 120%310÷256 = 121%
5102÷64 = 159%375÷256 = 147%
6128÷64 = 200%453÷256 = 177%
7153÷64 = 239%549÷256 = 214%
だいたい同じ傾向ですけれど、|変化率|が6〜7あたりの係数にやや開きがありますね。 このあたりが、各ADPCM方式特有の調整に依存する部分なのだと思います。 話を元に戻して、今回の|変化率|は5、予測変化単位量は16でしたから、次回の予測変化単位量は 16×375÷256 = 23 となります。 PDFVisio
二回目のADPCM値でカバーできる範囲を示します。 PDFVisio 二回目のADPCM値を6、としましょう。二回目のPCM出力値は34、ということになります。 また、三回目の予測変化単位量は、 23×233÷256 = 20 となります。 PDFVisio 以上のような手順の繰り返しでADPCM→PCM変換(デコード)を行うのが、PIECE方式のADPCMです。
今回は、PIECE方式のADPCMのADPCM→PCM変換(デコード)の手順を追ってみました。 次回は、PIECE方式のADPCMのPCM→ADPCM変換(エンコード)の手順を追ってみます。 ところで今回説明したP/ECE方式のデコード処理において、YM2608方式には存在した手順が一つ抜けていることに気付きましたか? 予測変化(単位)量が小さくなりすぎないよう、あるいは大きくなりすぎないよう、上限下限を設けてクリッピングする処理です。 P/ECE方式のデコード処理では、予測変化単位量が小さくなりすぎたり、大きくなりすぎたりしないのでしょうか? 実は、大丈夫です。 ちょっと次回を先取りして説明すると、予測変化単位量が小さくなりすぎないよう、エンコード時にADPCM値に細工しておくのです。 また、各パラメータの特性により、予測変化単位量がオーバーフローするほどに大きくなることは絶対にありません。 従って、P/ECE方式のデコード処理では、予測変化単位量の上限下限クリッピング処理が不要です。 クリッピング処理不要な分、P/ECEカーネルのADPCMデコード処理が軽くなるわけで、これはP/ECE方式の利点の一つです。 詳しくは次回。 (続きます...)

nsawa@piece-me.org