1. 程式人生 > 其它 >語音處理之位元速率、位元率、取樣率

語音處理之位元速率、位元率、取樣率

技術標籤:python程式語言訊號處理

基本概念

我們所說的音訊,都是數字音訊。數字音訊由取樣頻率、取樣精度、聲音通道數三個部分組成。取樣頻率,既取樣率,指記錄聲音時每秒的取樣個數,它用赫茲(Hz)來表示。取樣精度,也即是下文中的取樣位數,指記錄聲音的動態範圍,它以位(bit)為單位。

取樣率

音訊取樣,是把聲音從模擬訊號轉換為數字訊號。取樣率,就是每秒對聲音進行採集的次數,同樣也是所得的數字訊號的每秒樣本數。在對聲音進行取樣時,常用的取樣率有:

  • 8,000 Hz - 電話所用取樣率, 對於人的說話已經足夠
  • 11,025 Hz - AM調幅廣播所用取樣率
  • 22,050 Hz和24,000 Hz - FM調頻廣播所用取樣率
  • 32,000 Hz - miniDV 數碼視訊 camcorder、DAT (LP mode)所用取樣率
  • 44,100 Hz - 音訊 CD, 也常用於 MPEG-1 音訊(VCD, SVCD, MP3)所用取樣率
  • 47,250 Hz - 商用 PCM 錄音機所用取樣率
  • 48,000 Hz - miniDV、數字電視、DVD、DAT、電影和專業音訊所用的數字聲音所用取樣率
  • 50,000 Hz - 商用數字錄音機所用取樣率
  • 96,000 或者 192,000 Hz - DVD-Audio、一些 LPCM DVD 音軌、BD-ROM(藍光碟)音軌、和 HD-DVD (高清晰度 DVD)音軌所用所用取樣率
  • 2.8224 MHz - Direct Stream Digital 的 1 位 sigma-delta modulation 過程所用取樣率。

取樣越高,聲音的還原就越真實越自然,人對頻率的識別範圍是 20HZ - 20000HZ, 如果每秒鐘能對聲音做 20000 個取樣, 回放時就足以滿足人耳的需求. 所以 22050 的取樣頻率是常用的, 44100已是 CD 音質, 超過48000的取樣對人耳已經沒有意義。

取樣位數

音訊在經過取樣得到樣本後,還需要對該樣本執行兩個步驟:

  1. 量化。音訊量化的量化位數常用的有:
    • 8bit (也就是1位元組) 只能記錄 256 個數, 也就是隻能將振幅劃分成 256 個等級;
    • 16bit (也就是2位元組) 可以細到 65536 個數, 這已是 CD 標準了;
    • 32bit (也就是4位元組) 能把振幅細分到 4294967296 個等級, 實在是沒必要了.

量化位數又叫做取樣位數、位深度、解析度, 它是指聲音的連續強度被數字表示後可以分為多少級。N-bit的意思聲音的強度被均分為 級。16-bit的話,就是65535級。這是一個很大的數了,人可能也分辨不出65535分之一的音強差別。也可以說是音效卡的解析度,它的數值越大,解析度也就越高,所發出聲音的能力越強。這裡的取樣倍數主要針對的是訊號的強度特性,取樣率針對的是訊號的時間(頻率)特性這是兩個不一樣的概念。

  1. 二進位制編碼。也就是把量化所得的結果,即單個聲道的樣本,以二進位制的碼字進行存放。其中有兩種存放方式:
    • 直接以整形來存放量化結果,即 Two’s complement code;
    • 以浮點型別來存放量化結果,即 Floating point encoding code。

大多數格式的 PCM 樣本資料使用整形來存放,而在對一些對精度要求高的應用方面,則使用浮點型來表示PCM 樣本資料。

聲道

通道數,即聲音的通道的數目。常有單聲道和立體聲之分,單聲道的聲音只能使用一個喇叭發聲,立體聲可以使兩個喇叭都發聲(一般左右聲道有分工),更能感受到空間效果,當然還有更多的通道數。當人聽到聲音時,能對聲源進行定位,那麼通過在不同的位置設定聲源,就可以造就出更好的聽覺感受,如果配合影像進行音訊位置的調整,則會得到更好的視聽效果。常見的聲道有:

  • 單聲道,mono
  • 雙聲道,stereo,最常見的型別,包含左聲道以及右聲道
  • 2.1聲道,在雙聲道基礎上加入一個低音聲道
  • 5.1聲道,包含一個正面聲道、左前方聲道、右前方聲道、左環繞聲道、右環繞聲道、一個低音聲道,最早應用於早期的電影院
  • 7.1聲道,在5.1聲道的基礎上,把左右的環繞聲道拆分為左右環繞聲道以及左右後置聲道,主要應用於BD以及現代的電影院

位元率

單位時間內播媒體壓縮後的位元數量。在多媒體領域也稱位元速率碼流,位元率代表了資訊的數量。一般原始的多媒體檔案都比較大,為了便於使用需要(更好的儲存與傳輸)對其進行壓縮,而碼流就對應了壓縮時的取樣率,單位時間內取樣率越大,精度就越高,處理出來的檔案就越接近原始檔案,但是檔案也會越大。影響位元率的因素:

  1. 對原始檔案的取樣頻率;
  2. 壓縮演算法;
  3. 資料編碼方式等。

對於 mp3 檔案的壓縮有 CBR、VBR 兩種方式。CBR 指 Constants Bit Rate,即恆定位元率;VBR 指 Variable Bit Rate,即動態位元率。理論上說,VBR 的方式是根據音訊原始檔中聲音的具體頻率,自動修正一些位元率,以達到在同樣位元率效果中,達到更小的檔案。

舉個例子:
128kbps 的音訊檔案對應的大小為:
,即 128kbps 位元速率的音樂檔案每分鐘大小為 0.9375MB。

Q&A:

  1. 位元速率與視訊解析度關係 ?

    • 解析度是單位英寸中所包含的畫素點數。在解析度一定的情況下,位元速率與清晰度成正比關係,位元速率越高,影象越清晰;位元速率越低,影象越不清晰。
    • 關於一個視訊流的資料量:
      位元速率如果為10Mb/s,代表1秒鐘有10M bit的視訊資料,對於YUV422格式的1080P視訊而言,一幀影象是 1920x1080x2(通道)x8/1024/1024 = 31.64Mbit,1秒鐘30幀影象的話,則有949.2Mb/s,可見其資料量之大,不壓縮根本無法網上傳播,所以一定要經過視訊壓縮處理。1080P的視訊不一定是高清的,清晰度還跟視訊位元速率密切相關,對於1080P的視訊而言,藍光視訊的位元速率是20Mb/s,一般下載的視訊位元速率大都是10Mb/s,一些IPCamera/無人機的位元速率是2~8Mb/s,而很多視訊網站的位元速率甚至低於5M/s,其實有時還不如高位元速率的720P清晰。比如愛奇藝的 1080p 超高清視訊還不如 Netflix 的720p。
  2. 位元速率與取樣率什麼關係?
    取樣(頻)率是指把音訊訊號數字化後一個通道1秒鐘有多少個樣本,對應而來的就是原始的資料。如 44.1kHz 的取樣率,就是指1個通道1秒鐘有44.1k個數據。
    位元速率就是音訊檔案或者音訊流中1秒中的資料量,如1.44Mbps,就是1秒鐘內的資料量達1.44Mbits。
    對於2通道的音訊,如果其取樣率為 44.1kHz,取樣位數為 16bit,那麼音訊資料1秒鐘的資料量是44.1k162=1411.2kbits, 壓縮成 128kbps 的 MP3,1秒鐘資料就變成了 128kbits 了。

  3. 幀率與位元速率區別?
    即是幀速率 FPS(Frames PerSecond):幀/秒,指每秒鐘重新整理的圖片的幀數,也可以理解為圖形處理器每秒鐘能夠重新整理幾次。每秒鐘幀數(FPS)越多,所顯示的動作就會越流暢。捕捉動態視訊內容時,此數字愈高愈好。
    位元速率(Data Rate)是指視訊檔案在單位時間內使用的資料流量,也叫碼流或碼流率,通俗一點的理解就是取樣率,是視訊編碼中畫面質量控制中最重要的部分,一般我們用的單位是kb/s或者Mb/s。一般來說同樣解析度下,視訊檔案的位元速率越大,壓縮比就越小,畫面質量就越高。碼流越大,說明單位時間內取樣率越大,資料流,精度就越高,處理出來的檔案就越接近原始檔案,影象質量越好,畫質越清晰,要求播放裝置的解碼能力也越高。

wave 讀取音訊

wave 是 Python 自帶一個操作 wav 格式檔案的介面,不支援壓縮/解壓功能,但支援單聲道/立體聲。

f = wave.open('test.wav', 'rb') ### 讀取檔案
f.getnchannels() # 讀取聲道資訊
f.getsampwidth() # 取樣位數
f.getframerate() # 取樣率

Reference