1. 音頻常用術(shù)語
2. Pcm (playback 、capture)
PCM 是英文 Pulse-code modulation 的縮寫,中文譯名是脈沖編碼調(diào)制。PCM就是要把聲音從模擬轉(zhuǎn)換成數(shù)字信號的一種技術(shù),簡單的來說就是利用一個固定的頻率對模擬信號進行采樣,采樣后的信號的幅值按一定的采樣精度進行量化,量化后的數(shù)值被連續(xù)地輸出、傳輸、處理或記錄到存儲介質(zhì)中。
PCM 信號的兩個重要指標是采樣頻率和量化精度。
通常,播放音樂時,用程序從存儲介質(zhì)中讀取音頻數(shù)據(jù)(MP3、WMA、AAC…),經(jīng)過解碼后,最終送到音頻驅(qū)動程序中的就是PCM數(shù)據(jù),反過來,在錄音時,音頻驅(qū)動不停地把采樣所得的PCM數(shù)據(jù)送回給應(yīng)用程序,由應(yīng)用程序完成壓縮、存儲等任務(wù)。所以,音頻驅(qū)動的兩大核心任務(wù)就是:
- playback
如何把用戶空間的應(yīng)用程序發(fā)過來的PCM數(shù)據(jù),轉(zhuǎn)化為人耳可以辨別的模擬音頻;
- capture
把mic拾取到得模擬信號,經(jīng)過采樣、量化,轉(zhuǎn)換為PCM信號送回給用戶空間的應(yīng)用程序。
3. 聲音要素
聲音三要素 - 音調(diào)、響度、音色
- 1、音調(diào) “刺耳、低沉”,這其實是我們對聲音高低的感覺描述,這一特征我們稱之為音調(diào)。
在物理定義上,聲音是物體振動(比如我們的聲帶)產(chǎn)生的波,而音調(diào)由發(fā)聲體振動的頻率決定,頻率越高(振動越快)則音調(diào)越高,聽起來就越“刺耳”,反之音調(diào)越低、聽起來就越低沉。
我們聲帶的振動頻率,約在100Hz~10KHz之間,基本對應(yīng)于常說的男低音至女高音的頻率。
而我們耳朵的聽力范圍僅限于頻率20Hz ~ 20KHz,低于或者高于這個頻率范圍的聲音,分別被稱為次聲波(<20Hz)和超聲波(>20KHz),無法被人耳感知。不難發(fā)現(xiàn),雖然人耳的感知范圍有限,但人類的發(fā)聲頻率完全包含于人耳的感知范圍之內(nèi),這意味著任何人說的話,總能被耳朵捕捉到,每個人都有發(fā)聲的權(quán)力,也總有一雙耳朵能傾聽到你的聲音。
- 2、響度 “響亮、微弱”,是我們對聲音強弱的感覺描述,這種特征我們稱之為響度。響度由發(fā)聲體振動的幅度決定,當(dāng)傳播的距離相同時,振動幅度越大、則響度越大;相反,當(dāng)振幅一定時,傳播距離越遠,響度越小,就是我們常說的“距離太遠了,聽不見”的原因。
- 3、音色 “風(fēng)聲、雨聲、人聲”,是我們對各種音調(diào)、各種響度聲音的綜合感受,這種特征我們稱之為“音色”。音色是一種“感官屬性”,我們利用這種“感官屬性”,能區(qū)分發(fā)聲的物體,發(fā)聲的狀態(tài),還能評價聽感上的優(yōu)劣,比如“鋼琴聲、二胡聲”,比如“只聞其聲,如見其人”,比如“悅耳、動聽”等等。那么音色是怎么“產(chǎn)生”的,又由什么“決定”呢?前面我們了解到,聲音是由物體振動產(chǎn)生的波,而物體整體振動發(fā)出的只是基音,其各部分還有復(fù)合的振動,這些復(fù)合的振動也會發(fā)出聲音并形成泛音,基音+泛音的不同組合就產(chǎn)生了多樣化的音色,聲音世界才變得豐富多彩起來。我們一般認為音色由發(fā)聲體的材質(zhì)決定。
4. 聲音采樣-ADC/DAC
處理器要想“聽到”外界的聲音必須要把外界的聲音轉(zhuǎn)化為自己能夠理解的“語言”,處理器能理解的就是 0 和 1,也就是二進制數(shù)據(jù)。
所以我們需要先把外界的聲音轉(zhuǎn)換為處理器能理解的 0 和 1,在信號處理領(lǐng)域,外界的聲音是模擬信號,處理器能理解的是數(shù)字信號,因 此這里就涉及到一個模擬信號轉(zhuǎn)換為數(shù)字信號的過程,而完成這個功能的就是 ADC 芯片。
1)采樣
以一定采樣率,在時間軸上對模擬信號進行數(shù)字化。
首先,我們沿著時間軸,按照固定的時間間隔 T(假設(shè) T=0.1s),依次取多個點(如圖中 1~10 所對應(yīng)波上的點)。
此時 T 稱為取樣周期,T 的倒數(shù)為本次取樣的采樣率(f=1/T=10Hz),f 即表示每秒鐘進行采樣的次數(shù),單位為赫茲(Hz)。顯然,采樣率越高、單位時間的采樣點越多,就能越好的表示原波形(如果高頻率、密集地采集無數(shù)個點,就相當(dāng)于完整地記錄了原波形)。
2)量化
以一定精度,在幅度軸上對模擬信號進行數(shù)字化。
完成采樣后,我們接下來進行音頻數(shù)字化的第二步,量化。采樣是在時間軸上對音頻信號進行數(shù)字化,得到多個采樣點;而量化,則是在幅度方向上進行數(shù)字化,得到每個采樣點的幅度值。
如下圖所示,我們設(shè)定縱軸的坐標取值范圍為 0 ~8,得到每個采樣點的縱坐標(向上取整),這里的坐標值即為量化后的幅度值。因為我們將幅度軸分為了 8 段,有 8 個值用于量化取整,即本次量化的精度為 8。
顯然,如果分段越多,則幅度的量化取值將越準確(取整帶來的誤差就越小),也能越好的表示原波形。對于幅度的量化精度,有一個專有術(shù)語描述 – 位深,我們后面會詳細說明。
3)編碼
編碼是整個聲音數(shù)字化的最后一步,其實聲音模擬信號經(jīng)過采樣,量化之后已經(jīng)變?yōu)榱藬?shù)字形式,但是為了方便計算機的儲存和處理,我們需要對它進行編碼,以減少數(shù)據(jù)量。
常見的音頻編碼格式有PCM、PDM。
經(jīng)過量化后,我們得到了每個采樣點的幅度值。接下來,就是音頻信號數(shù)字化的最后一步,編碼。編碼是將每個采樣點的幅度量化值,轉(zhuǎn)化為計算機可理解的二進制字節(jié)序列。
如下圖所示,參照編碼部分的表格,樣本序號為樣本采樣順序,樣本值(十進制)為量化的幅度值。而樣本值(二進制)即為幅度值轉(zhuǎn)換后的編碼數(shù)據(jù)。最終,我們就得到了“0”、“1”形式的二進制字節(jié)序列,也即離散的數(shù)字信號。
這里得到的,是未經(jīng)壓縮的音頻采樣數(shù)據(jù)裸流,也叫做PCM 音頻數(shù)據(jù)(Pulse Code Modulation,脈沖編碼調(diào)制)。實際應(yīng)用中,往往還會使用其他編碼算法做進一步壓縮,以后的文章我們會再展開討論。
同理,如果處理器要向外界傳達自己的“心聲”,也就是放音,那么就涉及到將處理器能理解的 0 和 1 轉(zhuǎn)化為外界能理解的連續(xù)變化的聲音,這個過程就是將數(shù)字信號轉(zhuǎn)化為模擬信號,而完成這個功能的是 DAC 芯片。
5. 音頻數(shù)字信號質(zhì)量三要素
1)采樣率
音頻采樣率,指的是單位時間內(nèi)(1s)對聲音信號的采樣次數(shù)(參考數(shù)字化過程-采樣)。常說的 44.1KHz 采樣率,也即 1 秒采集了 44100 個樣本。
我們前面了解到,采樣率越高、采樣點越多,就可以越好的表示原波形,這就是采樣率的影響。
參考奈奎斯特采樣定理:采樣率 f,必須大于原始音頻信號最大振動頻率fmax 的 2 倍(也即 f > 2fmax,fmax 被稱為奈奎斯特頻率),采樣結(jié)果才能用于完整重建原始音頻信號;如果采樣率低于 2fmax,那么音頻采樣就存在失真。
比如,要對最高頻率fmax=8KHz 的原始音頻進行采樣,則采樣率 f 至少為 16KHz。
對于最大頻率為 f 的音頻信號,當(dāng)我們分別采用 f、2f、4f/3 的采樣率進行采樣時,所得到的采樣結(jié)果參考下圖。顯然,只有當(dāng)采樣率為 2f 時,才能有效的保留原信號特征。采樣率 f 和3f/4 下得到的結(jié)果,都和原波形差別很大。
那么,我們需要多大的采樣率?
按前面的討論,采樣率似乎越大越好,是否如此呢?理論上來說,最低采樣率需要滿足奈奎斯特采樣定理,在該前提下,采樣率越高則保留的原始音頻信息越多,聲音自然就越真實。
但需要注意的是,采樣率越高則采樣得到的數(shù)據(jù)量越大,對存儲和帶寬的要求也就越高。在實際應(yīng)用中,我們?yōu)榱似胶鈳捄鸵糍|(zhì),不同場景往往會有不同的選擇。常見的選擇如下:
當(dāng)采樣率從 8KHz 翻倍至 16KHz 時,聽感明顯變得更清晰、空靈和舒適。
此時,采樣率的提升帶來了明顯的音質(zhì)提升。而采樣率從 16KHz 提升至 44.1KHz 時,實際聽感卻好像沒有太大的變化,這是因為采樣率到達一定程度后,音頻質(zhì)量已經(jīng)比較高,再往上提升帶來的優(yōu)化已經(jīng)很細微。
借助專業(yè)的頻譜分析軟件,或許可以觀察到高頻譜區(qū)域的能量差異,但對于人耳來說,已經(jīng)很難進行區(qū)分。所以實際應(yīng)用中,我們不需要一味追求高采樣率,而是要綜合帶寬、性能、實際聽感,選擇合適的配置即可。
2)采樣位深/量化精度
位深度,也叫位寬,量化精度。
指的是在音頻采集量化過程中,每個采樣點幅度值的取值精度,一般使用bit作為單位。
常見的位寬有:8bit或者16bit。
比如,當(dāng)采樣位深為 8bit,則每個采樣點的幅度值可以用 2^8=256 個量化值表示;采樣位深為 16bit 時,則每個采樣點的幅度值可以用 2^16=65536 個量化值表示。
顯然,16bit 比 8bit 可存儲、表示的數(shù)據(jù)更多、更精細,量化時產(chǎn)生的誤差損失就越小。位深影響聲音的解析精度、細膩程度,我們可以將其理解為聲音信號的“分辨率”,位深越大,音色也越真實、生動。
采樣位深選擇和采樣率的選擇類似,雖然理論上來說位深越大越好,但是綜合帶寬、存儲、實際聽感的考慮,我們應(yīng)該為不同場景選用不同的位深。
3)聲道數(shù)
我們常說的單聲道、雙聲道,其實就是在描述一個音頻信號的聲道數(shù)(分別對應(yīng)于聲道數(shù) 1 和 2)。
聲波是可以疊加的,音頻的采集和播放自然也如此,我們可以同時從多個音頻源采集聲音,也可以分別輸出到多個揚聲器,聲道數(shù)一般指聲音采集錄制時的音源數(shù)量或播放時的揚聲器數(shù)量。
除了常見的聲道數(shù)1、2,PC上還有4,6,8等聲道的擴展。一般來說聲道數(shù)越多,聲音的方向感、空間感越豐富,聽感也就越好。
目前很多手機廠商已經(jīng)將雙聲道揚聲器作為旗艦標配。在RTC音樂場景,越來越多的應(yīng)用也開始采用雙聲道配置,其目的也是進一步提高聽感,給用戶更好的體驗。
聲道數(shù)的選擇實時音視頻場景下,聲道的選擇受限于編解碼器、前處理算法的能力,一般僅支持單、雙聲道。而雙聲道配置主要在語音電臺、音樂直播、樂器教學(xué)、ASMR 直播等場景使用,其它場景單聲道即可滿足。
當(dāng)然,最終能否使用哪一種聲道配置,還是由實際采集、播放設(shè)備的能力決定。解碼音頻數(shù)據(jù)時,可以獲取數(shù)據(jù)的聲道數(shù),在實際播放時,也要先獲取設(shè)備屬性。
如果設(shè)備支持雙聲道,但待播放數(shù)據(jù)是單聲道的,就需要將單聲道數(shù)據(jù)轉(zhuǎn)成雙聲道數(shù)據(jù)再播放;同理,如果設(shè)備只支持單聲道,但數(shù)據(jù)是雙聲道的,也需要將雙聲道數(shù)據(jù)轉(zhuǎn)換成單聲道數(shù)據(jù)再播放。
目前,CD音頻的采樣頻率通常為 44100 Hz,量化精度是 16bit。
6. 音頻碼率
數(shù)字音頻的三要素不僅影響音頻質(zhì)量,也會影響音頻存儲、傳輸所需的空間、帶寬。而實際應(yīng)用場景下,音質(zhì)決定用戶體驗、帶寬決定成本,都是我們必須考慮到。
音質(zhì)可能更多是主觀上的感受,但帶寬、空間是比較容易量化的,我們需要了解音頻碼率的概念。
音頻碼率,又稱為比特率,指的是單位時間內(nèi)(一般為1s)所包含的音頻數(shù)據(jù)量,可以通過公式計算。
數(shù)據(jù)傳輸率:數(shù)據(jù)傳輸率(bps) = 采樣頻率 × 量化位數(shù) × 聲道數(shù)。
聲音信號的數(shù)據(jù)量:數(shù)據(jù)量(byte)= 數(shù)據(jù)傳輸率 * 持續(xù)時間 / 8。
比如采樣率 44.1K Hz,位深16bit、雙聲道音頻PCM數(shù)據(jù),它的原始碼率為:
原始碼率 = 采樣率/s x 位深/bit x 聲道數(shù) x 時長(1s)
44.1 * 1000 * 16 * 2 * 1 = 1411200 bps = 1411.2 kbps = 1.411 Mbps (需要注意單位之間的差異和轉(zhuǎn)換,b=bit)
如果一個PCM文件時長為1分鐘,則傳輸/存儲這個文件需要的數(shù)據(jù)量為:
1.411 Mbps * 60s = 86.46Mb
上述計算結(jié)果是未經(jīng)壓縮的、原始音頻PCM數(shù)據(jù)的碼率。
RTC場景下,往往還需要再使用 AAC、OPUS 等編碼算法做編碼壓縮,進一步減小帶寬、存儲的壓力。碼率的選擇也是一個綜合質(zhì)量和成本的博弈。
7. 噪聲抑制
有上圖所示, 1、某一時刻,用戶 A 開始說話,產(chǎn)生的語音 A 被麥克風(fēng) A 采集、并通過網(wǎng)絡(luò)傳輸給用戶 B,成為待播放的語音 A1
2、語音 A1 被揚聲器 B 播放后,通過直射、周圍環(huán)境反射等方式,最終又被麥克風(fēng) B 采集為語音 A2(圖中的回聲 A2)
3、被回采的語音 A2,會通過網(wǎng)絡(luò)傳再輸給用戶 A,并通過揚聲器 A 播放出來
經(jīng)過上述過程,用戶 A 會發(fā)現(xiàn):自己剛說完一句話,過一會兒居然又聽到了自己的“復(fù)述”,這就是 RTC 場景下的“回聲”現(xiàn)象。
噪聲抑制技術(shù)用于消除背景噪聲,改善語音信號的信噪比和可懂度,讓人和機器聽得更清楚。
8. I2S
I2S(Inter-IC Sound)總線有時候也寫作 IIS, I2S 是飛利浦公司提出的一種用于數(shù)字音頻設(shè)備之間進行音頻數(shù)據(jù)傳輸?shù)目偩€。
I2S 總線用于主控制器(譬如 ZYNQ 7010/7020)和音頻 CODEC 芯片之間傳輸音頻數(shù)據(jù);主控制器和音頻 CODEC 都得支持 I2S 協(xié)議 。
在I2S總線上,只能同時存在一個主設(shè)備和發(fā)送設(shè)備,主設(shè)備可以是發(fā)送設(shè)備或接收設(shè)備。
I2S是PCM的一個分支,接口定義相同。
I2S的采樣率一般為44.1/48KHZ,PCM采樣頻率一般為8/16KHZ等。
I2S接口有4組信號:SCK(位時鐘)、LRCK(幀時鐘)、SDI/SDO(數(shù)據(jù))。
LRCLK
采樣時鐘,也叫WS(Word Select):字段選擇線,幀時鐘 (LRC) 線,
用于切換左右聲道數(shù)據(jù),
- 1 :傳輸左聲道的數(shù)據(jù)
0 :表示正在傳輸右聲道的數(shù)據(jù)
WS的頻率等于采樣頻率,比如采樣率為44.1KHz的音頻,WS=44.1KHz;
SCLK/BCLK
串行時鐘信號,也叫位時鐘(BCLK)、CK(Serial Clock)
數(shù)字音頻的每一位數(shù)據(jù)都對應(yīng)有一個 CK脈沖,它的頻率為:2* 采樣頻率 * 量化位數(shù), 2 代表左右兩個通道數(shù)據(jù)
比如采樣頻率為44.1KHz、 16位的立體聲音頻,那么
SCK=2×44100×16=1411200Hz=1.4112MHz;
SD/DATA
SD(Serial Data):串行數(shù)據(jù)線
用于發(fā)送或接收兩個時分復(fù)用的數(shù)據(jù)通道上的數(shù)據(jù) (僅半雙工模式),如果是全雙工模式,該信號僅用于發(fā)送數(shù)據(jù)。
MCLK
MCLK (Master/System clock input)也叫做主時鐘或系統(tǒng)時鐘,音頻 CODEC 芯片與主控制器之間同步用,一般是采樣率的 256 倍或 384 倍。
之所以引入MCLK。這是由CODEC內(nèi)部基于Delta-Sigma (ΔΣ)的架構(gòu)設(shè)計要求使然,其主要原因是因為這類的CODEC沒有所謂提供芯片的工作時鐘晶振電路,需要使用控制器為編解碼芯片提供的系統(tǒng)時鐘。
如果使用MCLK時鐘的話,MCLK時鐘頻率一般為采樣頻率的256倍或384倍,具體參考特定器件手冊。
下圖為一幀立體聲音頻時序圖
邏輯分析儀抓到的數(shù)據(jù)幀:
通道 0 是 LRCK 時鐘,通道 1 為 BCLK,通道 2 是 DACDATA,通道 3 是MCLK。
9. codec
處理器如果要想播放或者采集聲音, 需要用到 DAC 和 ADC 這兩款芯片。
那是不是買兩顆 DAC 和 ADC 芯片就行了呢?
答案肯定是可以的,但是音頻不單單是能出聲、能聽到就行。
我們往往需要聽到的聲音動聽、錄進去的語音貼近真實、可以調(diào)節(jié)音效、對聲音能夠進行一些處理(需要 DSP 單元)、擁有統(tǒng)一的標準接口,方便開發(fā)等等。
將這些針對聲音的各種要求全部疊加到 DAC 和ADC 芯片上,那么就會得到一個專門用于音頻的芯片,也就是音頻編解碼芯片,英文名字就是 Audio CODEC。
codec芯片舉例:
wolfson(歐勝) 的WM8960;順芯的es8388、es8396;瑞芯微的rk809
Codec里面包含了I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多種輸入Mic、Line-in、I2S、PCM和多個輸出hp(headphone)耳機、spk(Speak)喇叭、聽筒,Line-out
下圖是codec es8396芯片的模塊圖。
10. dai
dai(digital audio interface)
數(shù)字音頻接口全部是硬件接口,是實實在在的物理連線方式,即同一個PCB板上IC芯片和IC芯片之間的通訊協(xié)議。和音頻編碼格式完全是兩回事。
數(shù)字音頻接口有PCM、I2S、AC97、PDM;
- I2S和PCM(TDM)接口傳輸?shù)臄?shù)據(jù)是PCM編碼格式的音頻數(shù)據(jù);
- PDM接口傳輸?shù)臄?shù)據(jù)是PDM編碼格式的音頻數(shù)據(jù);
下圖是接口硬件接線的一般場景: