« まるちいんふぉめーしょんでぃすぷれい1 | トップページ | 貯まった。 »

2008年9月20日 (土)

電波系電波時計~DVI ADPCM(IMA ADPCM)de-code解説

MEDIO write:

 相変わらず多忙。知人でもストレスで倒れて救急車、なんてのが出るくらい、周りも自分もあわただしい。

 そんな中では、じっくり半田付けをしている時間が取れなくて、欲求不満が溜まる一方で。仕事も技術系でなくて経営ばっかりやっている。

 ネタも無いので、最近こちらにいらっしゃる方の傾向を見ている。アングラネタ(MP3 downloadとかHDD パスワード解析とか)はもちろん多いのだが、電波系電波時計で使っている「IMA ADPCM」を検索キーにしている方が多いことに気がついた。

 いつも通り、内容の保証は全く無いですが、「電波系~」でやっている事を書いてみる。

 「IMA ADPCM」はIntelが開発した音声圧縮コーデックで、基本的にはADPCMの名の通り、標本データの前後関係の増差分を記録していくものです。

 単なるADPCMでは記録単位(記録時のビット長)以上の増差分があった場合、その後のデータにはエラーが累積されるので、大概のADPCM(開発メーカごとの工夫、ですね)には「仕掛け」があります。

 これらの「ADPCMに対しての仕掛け」ですが、例えば「Microsoft ADPCM」では標本元データの変化の度合いによって、増差分を参照するテーブルを動的に書き換えています。これは、処理系が高速で、書き換えテーブル(もちろん書き換え可能なRAM)が大きく取れる場合、音声の品質を上げることが出来ます。

※このあたり、文章で表現するのは難しいので、MicrosoftのRIFF Wave Formatあたりの資料を参照して下さい。多分、見つかるのは英文でしょうけれど。

 それに対して、「IMA ADPCM」では、この参照テーブルは固定(増分89個+倍率8個)で、RAM容量が小さいマイコンに適したコーデックです。

 実際の、電波系電波時計で使っているプログラムから抜粋します、

int16_t  StepTbl[89] = {
7, 8, 9, 10, 11, 12, 13, 14,
16, 17, 19, 21, 23, 25, 28, 31,
34, 37, 41, 45, 50, 55, 60, 66,
73, 80, 88, 97, 107, 118, 130, 143,
157, 173, 190, 209, 230, 253, 279, 307,
337, 371, 408, 449, 494, 544, 598, 658,
724, 796, 876, 963, 1060, 1166, 1282, 1411,
1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024,
3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484,
7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794,
32767 };

int16_t  scale_change_tbl[8] = {
-1, -1, -1, -1, 2, 4, 6, 8};


int32_t Conv(uint8_t code)
{
int32_t dlevel = 0,
           adpcmdata;

int16_t  scale;

dlevel = ((code & 0x07) * 2 + 1) * (StepTbl[scale] >> 3);


if(code & 0x08)
{
  adpcmdata -= dlevel
  if(adpcmdata < -32768)
   adpcmdata = -32768;
}
else
{
  adpcmdata += dlevel;
  if(adpcmdata >= 32767)
   adpcmdata =  32767;
}

scale += scale_change_tbl[code & 0x07];

if(scale < 0)
  scale = 0;
else
  if(scale >= 89)
   scale = 88;

return (int16_t)adpcmdata;
}

 プログラムがあれなのは、私がCとかの正式な教育を受けていないからですね。独学だとダメですね、このあたり。人が読んでも分からない。

 とりあえず、上の関数に4bit長のIMA ADPCMデータ(Windowsのサウンドレコーダで作成出来るデータのヘッダを除いたものの1サンプルデータ)を渡すと、16bit長PCMデータにデコードしてくれます。エンディアン等は、使っているマイコンにあわせて。

 まぁ固定の200Byte程度のテーブルすら持てないマイコンであれば、外部のデコーダICに頼ることもアリだとは思いますけれど。

※AVRでも、PROGMEM組み込みマクロ等を使わないと、テーブルが起動直後にRAM領域に転送されます。

|

« まるちいんふぉめーしょんでぃすぷれい1 | トップページ | 貯まった。 »

オーディオ話」カテゴリの記事

パソコン・インターネット」カテゴリの記事

趣味」カテゴリの記事

電子回路」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« まるちいんふぉめーしょんでぃすぷれい1 | トップページ | 貯まった。 »