音訊程式設計基礎

2021-07-27 22:54:05 字數 2609 閱讀 2354

取樣 ->量化->編碼

取樣就是每隔一定時間就讀一次聲音頻號的幅度,而量化則是將取樣得到的聲音頻號幅度轉換為數字值,從本質上講,取樣是時間上的數位化,而量化則是幅度上的數位化。

音訊取樣:自然界中音訊訊號是一種連續變化的模擬訊號,但計算機只能處理和記錄二進位制的數碼訊號,由自然音源得到的音訊訊號必須經過模數轉化器(a/d),轉換成數字音訊訊號之後,才能送到計算機中作進一步的處理。

取樣頻率是指將模擬聲音波形進行數位化時,每秒鐘抽取聲波幅度樣本的次數。常用的音訊取樣頻率有8khz、11.025khz、22.05khz、16khz、37.8khz、44.1khz、48khz等,如果採用更高的取樣頻率,還可以達到***的音質。

量化位數是指對模擬音訊訊號的幅度進行數位化,它決定了模擬訊號數位化以後的動態範圍,常用的有8位、12位和16位。量化位越高,訊號的動態範圍越大,數位化後的音訊訊號就越可能接近原始訊號,但所需要的儲存空間也越大。

有單聲道和雙聲道之分。雙聲道又稱為立體聲,在硬體中有兩條線路,音質和音色都要優於單聲道,但數位化後佔據的儲存空間的大小要比單聲道多一倍。

錄音:a/d模擬訊號轉換成數碼訊號(讀資料)

放音:d/a數碼訊號轉換成模擬訊號(寫資料)

出於對安全性方面的考慮,linux下的應用程式無法直接對音效卡這類硬體裝置進行操作,而是必須通過核心提供的驅動程式才能完成。在linux上進行音訊程式設計的本質就是要借助於驅動程式,來完成對音效卡的各種操作。

對硬體的控制涉及到暫存器中各個位元位的操作,通常這是與裝置直接相關並且對時序的要求非常嚴格,如果這些工作都交由應用程式設計師來負責,那麼對音效卡的程式設計將變得異常複雜而困難起來,驅動程式的作用正是要遮蔽硬體的這些底層細節,從而簡化應用程式的編寫。目前linux下常用的音效卡驅動程式主要有兩種:oss和alsa。

如何對各種音訊裝置進行操作是在linux上進行音訊程式設計的關鍵,通過核心提供的一組系統呼叫,應用程式能夠訪問音效卡驅動程式提供的各種音訊裝置介面,這是在linux下進行音訊程式設計最簡單也是最直接的方法。

無論是oss還是alsa,都是以核心驅動程式的形式執行在linux核心空間中的,應用程式要想訪問音效卡這一硬體裝置,必須借助於linux核心所提供的系統呼叫(system call)。從程式設計師的角度來說,對音效卡的操作在很大程度上等同於對磁碟檔案的操作:首先使用open系統呼叫建立起與硬體間的聯絡,此時返回的檔案描述符將作為隨後操作的標識;接著使用read系統呼叫從裝置接收資料,或者使用write系統呼叫向裝置寫入資料,而其它所有不符合讀/寫這一基本模式的操作都可以由ioctl系統呼叫來完成;最後,使用close系統呼叫告訴linux核心不會再對該裝置做進一步的處理。

系統呼叫open可以獲得對音效卡的訪問權,同時還能為隨後的系統呼叫做好準備,其函式原型如下所示:

int open(const char *pathname, int flags, int mode);

引數pathname是將要被開啟的裝置檔案的名稱,對於音效卡來講一般是/dev/dsp。引數flags用來指明應該以什麼方式開啟裝置檔案,它可以是o_rdonly、o_wronly或者o_rdwr,分別表示以唯讀、只寫或者讀寫的方式開啟裝置檔案;引數mode通常是可選的,它只有在指定的裝置檔案不存在時才會用到,指明新建立的檔案應該具有怎樣的許可權。 如果open系統呼叫能夠成功完成,它將返回乙個正整數作為檔案識別符號,在隨後的系統呼叫中需要用到該識別符號。如果open系統呼叫失敗,它將返回-1,同時還會設定全域性變數errno,指明是什麼原因導致了錯誤的發生。

系統呼叫read用來從音效卡讀取資料,其函式原型如下所示:

int read(int fd, char *buf, size_t count);

引數fd是裝置檔案的識別符號,它是通過之前的open系統呼叫獲得的;引數buf是指向緩衝區的字元指標,它用來儲存從音效卡獲得的資料;引數count則用來限定從音效卡獲得的最大位元組數。如果read系統呼叫成功完成,它將返回從音效卡實際讀取的位元組數,通常情況會比count的值要小一些;如果read系統呼叫失敗,它將返回-1,同時還會設定全域性變數errno,來指明是什麼原因導致了錯誤的發生。

系統呼叫write來向音效卡寫入資料,其函式原型如下所示::

size_t write(int fd,const char *buf,size_t count);

系統呼叫write和系統呼叫read在很大程度是類似的,差別只在於write是向音效卡寫入資料,而read則是從音效卡讀入資料。引數fd同樣是裝置檔案的識別符號,它也是通過之前的open系統呼叫獲得的;引數buf是指向緩衝區的字元指標,它儲存著即將向音效卡寫入的資料;引數count則用來限定向音效卡寫入的最大位元組數。 如果write系統呼叫成功完成,它將返回向音效卡實際寫入的位元組數;如果read系統呼叫失敗,它將返回-1,同時還會設定全域性變數errno,來指明是什麼原因導致了錯誤的發生。無論是read還是write,一旦呼叫之後linux核心就會阻塞當前應用程式,直到資料成功地從音效卡讀出或者寫入為止。

當應用程式使用完音效卡之後,需要用close系統呼叫將其關閉,以便及時釋放占用的硬體資源,其函式原型如下所示:

int close(int fd);

引數fd是裝置檔案的識別符號,它是在裝置開啟時獲得的。一旦應用程式呼叫了close系統呼叫,linux核心就會釋放與之相關的各種資源,因此建議在不需要的時候盡量及時關閉已經開啟的裝置。

音訊基礎,筆記

常見44.1khz,48khz的取樣率,也就是取樣頻率,物理意義就是一秒鐘對音訊取樣的次數。由於人耳分辨的頻率範圍是20hz 20khz,根據奈奎斯特取樣定理,需要40khz來保證不失真。取樣精度是指每一次取樣的資料精度,比如常見的16bits,或者粗糙一些的8bits。l 16bits r 16b...

音訊基礎學習(未完)

1.取樣頻率 sampling rate 取樣頻率是指每秒鐘抽取聲波幅度樣本的次數,其單位為hz 赫茲 取樣頻率不應低於原始聲音的最高頻率的2倍,這樣才能把以數字表達的聲音還原成原來的聲音。2.取樣精度 bit resolution 用於描述每個聲音樣本的振幅大小或者聲音樣本資料的二進位制位數。3....

音訊基礎知識

1.音效卡的工作原理 音效卡的工作原理其實很簡單 我們知道,麥克風和喇叭所用的都是模擬訊號,而電腦所能處理的都是數碼訊號,兩者不能混用,音效卡的作用就是實現兩者的轉換。從結構上分,音效卡可分為模數轉換電路和數模轉換電路兩部分,模數轉換電路負責將麥克風等聲音輸入裝置採到的模擬聲音頻號轉換為電腦能處理的...