IMA ADPCM

1.IMA是Interactive Multimedia Association的縮寫,就是互動多媒體協會。IMA ADPCM就是說標準是IMA制定的,當然還有Microsoft ADPCM,標準就是MS制定的;
2.ADPCM自適應差分PCM編碼,和PCM編碼的差別就在於差分兩個字。。如果已經瞭解的PCM編碼,請繼續往下看。

差分編碼就是用下一個採樣點與現在採樣點的電平差進行編碼。。而不是直接用一個二進制數表示當前的電平大小。。自適應的編碼方式加上了預測,使得可以用比較少的位率完整的存儲每個樣本的電平值。。

比如8 Bit的PCM,編碼從00H-FFH。現在有三個點,電平大小是零電平,正的-6dB,0dB。則對應的PCM編碼是80H,C0H,FFH。這樣需要三個Byte來存儲。
而ADPCM會進行預測,它已知第一個點是零電平,並且也已知前一個點的電平,它就會根據之前的採樣點和現在的採樣點預測下一個點也就是第二個點的電平。當然預測不可能精準。。可能預測成了24H或者C3H之類,於是就一個較低位數的二進制數來描述實際值與預測值的差距。比如,用4Bit 或者5Bit。下一次預測可能預測成F0之類的。。解碼的過程反之。。這樣就能獲得50%-62.5%的壓縮率。。

所以,ADPCM算法的好壞,取決於預測的準確性。。。也只能用來壓縮音頻信號之類的有規律的信號,如果是隨機信號,那就沒得玩了。。
3.ADPCM(Adaptive Differential Pulse Code Modulation),是一種針對 16bits( 或8bits或者更高) 聲音波形數據的一種有損壓縮算法,它將聲音流中每次採樣的 16bit 數據以 4bit 存儲,所以壓縮比 1:4. 而且壓縮/解壓縮算法非常簡單,所以是一種低空間消耗,高質量高效率聲音獲得的好途徑。保存聲音的數據文件後綴名爲 .AUD 的大多用ADPCM 壓縮。
  ADPCM 主要是針對連續的波形數據的,保存的是波形的變化情況,以達到描述整個波形的目的,由於它的編碼和解碼的過程卻很簡潔,列在後面,相信大家能夠看懂。
  8bits採樣的聲音人耳是可以勉強接受的,而 16bit 採樣的聲音可以算是高音質了。ADPCM 算法卻可以將每次採樣得到的 16bit 數據壓縮到 4bit 。需要注意的是,如果要壓縮/解壓縮得是立體聲信號,採樣時,聲音信號是放在一起的,需要將兩個聲道分別處理。

ADPCM 壓縮過程
  首先我們認爲聲音信號都是從零開始的,那麼需要初始化兩個變量
    int index=0,prev_sample=0;
  下面的循環將依次處理聲音數據流,注意其中的 getnextsample() 應該得到一個 16bit 的採樣數據,而 outputdata() 可以將計算出來的數據保存起來,程序中用到的 step_table[],index_adjust[] 附在後面:
    int index=0,prev_sample:=0;
    while (還有數據要處理)
    {
      cur_sample=getnextsample();        // 得到當前的採樣數據
      delta=cur_sample-prev_sample;       // 計算出和上一個的增量
      if (delta<0) delta=-delta,sb=8;      // 取絕對值
      else sb = 0 ;               // sb 保存的是符號位
      code = 4*delta / step_table[index];    // 根據 steptable[]得到一個 0-7 的值
      if (code>7) code=7;            // 它描述了聲音強度的變化量
      index += index_adjust[code] ;       // 根據聲音強度調整下次取steptable 的序號
      if (index<0) index=0;           // 便於下次得到更精確的變化量的描述
      else if (index>88) index=88;
      prev_sample=cur_sample;
      outputode(code|sb);            // 加上符號位保存起來
    }
  有關ADPCM壓縮過程更詳細的信息,參見本站 ADPCM壓縮過程演示程序

ADPCM 解壓縮過程
  接壓縮實際是壓縮的一個逆過程,同樣其中的 getnextcode() 應該得到一個編碼,,而 outputsample() 可以將解碼出來的聲音信號保存起來。這段代碼同樣使用了同一個的 setp_table[] 和 index_adjust() 附在後面:
    int index=0,cur_sample=0;
    while (還有數據要處理)
    {
        code=getnextcode();                       // 得到下一個數據
        if ((code & 8) != 0) sb=1 else sb=0;
        code&=7;                            // 將 code 分離爲數據和符號
        delta = (step_table[index]*code)/4+step_table[index]/8;     // 後面加的一項是爲了減少誤差
        if (sb==1) delta=-delta;
        cur_sample+=delta;                        // 計算出當前的波形數據
        if (cur_sample>32767) output_sample(32767);
        else if (cur_sample<-32768) output_sample(-32768);
        else output_sample(cur_sample);
        index+=index_adjust[code];
        if (index<0) index=0;
        if (index>88) index=88;
     }
  有關ADPCM解壓過程更詳細的信息,參見本站 ADPCM解壓過程演示程序
附表
     int index_adjust[8] = {-1,-1,-1,-1,2,4,6,8};

     int step_table[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
     }

特殊ADPCM壓縮
  根據ADPCM壓縮/解壓原理,本站提供了 3bits ADPCM 和 4bits ADPCM 壓縮程序,另外還提供 ADPCM係數表設計程序 下載。
AUD文件結構
  關於 WestWood 的 .AUD 文件,結構比較簡單,這裏順帶提一下,有興趣可以自己寫處理AUD文件的程序,其 8bit 的聲音壓縮算法尚不知曉,但用的最廣泛的 16bit 聲音正是用 ADPCM 壓縮,每個 AUD 文件都有一個文件頭,結構如下:
    struct
    {
      unsigned short int samplespersec ;    // 頻率
      long int size;              // 除掉文件頭的大小
      long int outsize;            // 輸出數據大小 (通常是 4 倍)
      unsigned char flags;           // 位 0 描述是否立體聲,位 1 描述是否 16 bit
      unsigned char type ;           // 1=WW 壓縮,99=IMA ADPCM
    }
  AUD文件的聲音信號是按塊存放的,每塊大約 512 字節,每一塊都有一個塊頭結構:
    struct
    {
      unsigned short int size; // 壓縮過的數據大小
      unsigned short int outsize; // 輸出數據大小 (通常是 4 倍)
      long int id; // 永遠是 0x0000DEAF
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章