* 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デコード処理のフローチャートを書いてみました。 PDF・Visio 前々回に示した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方式の全てのADPCM値の意味を表にすると、次のようになりました。
YM2608 bit3 bit2 bit1 bit0 増減方向 変化率 これに対して、P/ECE方式のADPCMのビット構成は、次のとおりです。
YM2608 ADPCM値 増減方向 変化率 実際の変化量 0 0:増加 0 +予測変化量× 1÷8 1 0:増加 1 +予測変化量× 3÷8 2 0:増加 2 +予測変化量× 5÷8 3 0:増加 3 +予測変化量× 7÷8 4 0:増加 4 +予測変化量× 9÷8 5 0:増加 5 +予測変化量×11÷8 6 0:増加 6 +予測変化量×13÷8 7 0:増加 7 +予測変化量×15÷8 8 1:減少 0 −予測変化量× 1÷8 9 1:減少 1 −予測変化量× 3÷8 10 1:減少 2 −予測変化量× 5÷8 11 1:減少 3 −予測変化量× 7÷8 12 1:減少 4 −予測変化量× 9÷8 13 1:減少 5 −予測変化量×11÷8 14 1:減少 6 −予測変化量×13÷8 15 1:減少 7 −予測変化量×15÷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 bit3 bit2 bit1 bit0 変化率 + 8 YM2608方式では予測変化量を中心に1/8倍〜15/8倍までカバーしていたのに較べ、P/ECE方式では予測変化単位量を最小単位として0倍〜7倍までをカバーします。 増加方向または減少方向の一方に注目して、カバーできる範囲の中央を予測変化量と考えると、 P/ECE方式における予測変化量は、予測変化単位量の3.5倍に相当する ということになります。 # YM2608方式との対比のために予測変化量を持ち出しているだけで、あまり重要ではないので深く考えないで下さい。 # P/ECE方式のADPCMだけを考えるならば、予測変化量の概念は不要です。予測変化単位量だけを意識すれば充分です。 PDF・Visio P/ECE方式において、予測変化単位量の初期値を16と定めることは、予測変化量の初期値を16×3.5 = 56に定めていることと同じです。 (YM2608方式における予測変化量の初期値127に較べると半分弱ですけれど、この程度の違いは個々の方式の調整の範疇だと思います。) さて初期状態では(仮想的な)前回のPCM値が0、予測変化単位量が16ですので、最初のADPCM値でカバーできる範囲は次のようになります。 PDF・Visio 最初のADPCM値を13、としましょう。一回目のPCM出力値は80、ということになります。 PDF・Visio 次回のために、予測変化単位量を更新します。 予測変化量は16×3.5 = 56でしたが、実際の変化量はそれよりも大きな値(80)でした。 そこで、次回の変化量も56より大きいだろう見込んで、予測変化量をより大きな値に修正します。 予測変化量は予測変化単位量に比例しますから、結局、予測変化単位量を大きくすればいいわけです。 予測変化単位量を修正する計算式は、今回の変化率の絶対値によって決まります。 今回の変化率の絶対値(|変化率|)と、予測変化単位量を修正する計算式との対応は、次のとおりです。
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 0 0 9 1 +予測変化単位量×1 10 2 +予測変化単位量×2 11 3 +予測変化単位量×3 12 4 +予測変化単位量×4 13 5 +予測変化単位量×5 14 6 +予測変化単位量×6 15 7 +予測変化単位量×7 ちょっと本題から外れて、YM2608方式とP/ECE方式の係数を比較してみることにします。
|変化率| 予測変化単位量を修正する計算式 0 次回の予測変化単位量←今回の予測変化単位量×233÷256 1 2 3 4 次回の予測変化単位量←今回の予測変化単位量×310÷256 5 次回の予測変化単位量←今回の予測変化単位量×375÷256 6 次回の予測変化単位量←今回の予測変化単位量×453÷256 7 次回の予測変化単位量←今回の予測変化単位量×549÷256 だいたい同じ傾向ですけれど、|変化率|が6〜7あたりの係数にやや開きがありますね。 このあたりが、各ADPCM方式特有の調整に依存する部分なのだと思います。 話を元に戻して、今回の|変化率|は5、予測変化単位量は16でしたから、次回の予測変化単位量は 16×375÷256 = 23 となります。 PDF・Visio
|変化率| YM2608 P/ECE 0 57÷64 = 89% 233÷256 = 91% 1 2 3 4 77÷64 = 120% 310÷256 = 121% 5 102÷64 = 159% 375÷256 = 147% 6 128÷64 = 200% 453÷256 = 177% 7 153÷64 = 239% 549÷256 = 214%
二回目のADPCM値でカバーできる範囲を示します。 PDF・Visio 二回目のADPCM値を6、としましょう。二回目のPCM出力値は34、ということになります。 また、三回目の予測変化単位量は、 23×233÷256 = 20 となります。 PDF・Visio 以上のような手順の繰り返しで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方式の利点の一つです。 詳しくは次回。 (続きます...)