藍牙協議中的SBC編解碼原理和仿真

1、SBC的原理

  SBC是subband codec的縮寫,中文叫作次頻帶編碼,也叫子帶編碼。其基本原理是把信號的頻率分爲若干子帶,而後對每一個子帶進行編碼,並根據每一個子帶的重要性及特色分配不一樣的位數(採樣深度)來表示數據。
例如,在音頻編碼中,因爲人耳對不一樣頻率的敏感度不一樣,能夠在對人耳敏感的子帶使用較細的量化(較大的採樣深度),對人耳不敏感的子帶使用較粗糙的量化(較小的採樣深度),從而在不下降主觀聽覺效果的狀況下達到較好的壓縮效果。
又例如,離散餘弦變換(DCT)時一種處理數字信號的方法,普遍應用有語音和圖像壓縮。聲音通過離散餘弦變換(DCT)之後,其係數更多的集中在較低序號的部分。對變換後的高序號部分的編碼就很簡單,能夠用很小的採樣深度對其進行編碼。html


上圖是變換前的信號,下圖是DCT變化之後的序號,變換後適合子帶編碼。
linux

2、SBC編碼過程


SBC編碼的輸入是PCM數據,即採樣後的時間序列,輸出是二進制流。
時間序列通過分析過程,轉化爲頻域信號,而後對頻域信號分段編碼。爲每個子頻段指定一個scalfactor及採樣深度,對這個子頻段的數據進行自適應PCM編碼(Adaptive Pulse Code Modulation)。而後把各個子頻段編碼後的數據打包,做爲一幀數據,以二進制流的方式輸出。svn

    1. Analysis Filter
      其目的是爲了把時間序列變換到頻域,使用的方法是多相濾波器組。子頻段的個數能夠是4個或8個,對應不一樣的多相濾波器組。
    2. Scale Factors計算
      每個子頻段的幅值的範圍是不一樣的,取每個子頻段幅值的最大值做爲這個子頻段的scale factor。好比子頻段1的幅值分佈在(0, 128)區間,子頻段2的幅值分佈在(0, 32)區間,那麼自定子頻段1的scale factor爲128, 子頻段2的scale factor爲32。
    3. Bit Allocation
      每個子頻段有若干幅值須要編碼,每一個幅值須要用若干比特數來表示。同一個子頻段中每一個幅值的比特數相同,不一樣子頻段幅值分配的比特數不一樣。爲每一個子頻段分配幅值比特數的過程叫作bit allocation。
    4. APCM
      根據每一個子頻段的scale factor及每一個幅值須要的比特數,對每個子頻段進行編碼的過程。獲得每一個子頻段的量化結果,即Quantized Subband。
    5. BItStream packing
      把每一個子頻段編碼後的結果組合起來,加上校驗碼、幀頭信息等的過程。

3、SBC解碼過程


SBC解碼過程是編碼過程的逆過程,其輸入是二進制流,輸出是PCM數據。
首先對二進制流進行解包,獲得一幀一幀的數據。每一幀中都包含子頻段數(4或8)、每一個子頻段的scale factor、每一個子頻段幅值須要的比特數,根據這些信息及每一個子頻段編碼以後的數據,重建(Reconstruction)子頻段的編碼前的數據。而後通過逆向的多相濾波器組,獲得原始的PCM數據。將全部子頻段的PCM數據合併,獲得解碼後的PCM數據。ui

4、關於SBC編碼的一些性質

    1. SBC是有損編碼
      因爲無線傳輸的帶寬有限,SBC在對每一個子頻段進行編碼時,進行了有損處理,以達到數據壓縮的目的。即通過SBC編解碼之後,PCM數據發生了變化。所以藍牙設備的音質不是很好。
    2. SBC支持的採樣率
      包括44.1kHz、48kHz、32kHz、16kHz。
    3. SBC支持的聲道
      支持單聲道(MONO CHANNEL)、雙聲道(DUAL CHANNEL)、立體聲(stereo)、聯合立體聲(Joint Stereo)。

5、編解碼仿真

 

  1 下載信息:編碼

    2 編譯和運行:

./configure --prefix=/usr --disable-static --disable-tester &&
make

    3 使用方法:

      編碼:

sbcenc test9a.au > test9.sbc

     解碼:

sbcdec -f test9b.au test9.sbc

  親測有效。

 

參考文檔:

https://www.cnblogs.com/huahuahu/p/lan-ya-xie-yi-zhong-deSBC-bian-ma.html

http://www.linuxfromscratch.org/blfs/view/svn/multimedia/sbc.html

相關文章
相關標籤/搜索