智能手機(jī)的音頻技術(shù)介紹
手機(jī)可以說是現(xiàn)在人日常生活中最離不開的電子設(shè)備了。它自誕生以來,從模擬的發(fā)展到數(shù)字的,從1G發(fā)展到目前的4G以及不久將來的5G,從最初的只有唯一的功能(打電話)發(fā)展到目前的全功能,從功能機(jī)(feature phone)發(fā)展到智能機(jī)(smart phone),可謂變化巨大。對于手機(jī)上的音頻來說,剛開始只有語音通信功能,現(xiàn)在不僅語音通信,還可以聽音樂、錄音、智能語音(語音輸入/語音交互)等。智能手機(jī)中的音頻場景眾多,可以說是手機(jī)多媒體系統(tǒng)中最復(fù)雜的子系統(tǒng)了。今天我們就談?wù)凙ndroid智能手機(jī)上的音頻。
先從硬件談起吧。下圖是android智能手機(jī)中目前主流的跟音頻相關(guān)的硬件框圖。
上圖中AP是應(yīng)用處理器(applicaTIon processor),在上面主要運(yùn)行的是操作系統(tǒng)(OS,例如android)和應(yīng)用程序。CP是通信處理器(communicaTIon processor),也叫基帶處理器(baseband processor,BP)或者modem,上面主要處理跟通信相關(guān)的,比如手機(jī)信號好不好就跟它相關(guān)。Audio DSP,顧名思義,就是一個(gè)處理音頻的DSP。我在剛做手機(jī)的時(shí)候就很納悶現(xiàn)在AP處理器頻率那么高,音頻處理(尤其是語音)CPU load 不高,AP上完全可以處理,為啥還要額外加一個(gè)音頻DSP處理音頻呢,這不是增加了成本嗎?隨著做的深入,知道了這主要是出于功耗的考慮。功耗是手機(jī)上的一個(gè)重要指標(biāo),也是過認(rèn)證的必選項(xiàng),它決定了手機(jī)的續(xù)航能力。在手機(jī)電池技術(shù)沒有獲得突破的現(xiàn)在,要想續(xù)航能力強(qiáng),就得降功耗。音頻中的打電話和聽音樂是手機(jī)上的最主要功能之一,必須在這兩種場景下降功耗。怎么降呢?就是加一塊專門處理音頻的DSP,在打電話和聽音樂時(shí)讓AP在絕大多數(shù)時(shí)間都出于sleep狀態(tài),這樣功耗就降下來了。 AP、CP和audio DSP之間通過IPC(inter-processor communicaTIon)通信,交互控制消息和音頻數(shù)據(jù)。通常AP、CP和audio DSP(當(dāng)然還包括其他功能的處理器)集成在一個(gè)芯片內(nèi),形成一個(gè)SOC(system on chip,片上系統(tǒng))。此外有一個(gè)主要用于音頻采集和播放的硬件codec芯片,它受AP控制(使能以及選擇不同音頻路徑等,主要是配置寄存器),與audio DSP通過I2S總線交換音頻數(shù)據(jù)。連著硬件codec的是各種外設(shè),有MIC(現(xiàn)在主流的是雙MIC方案)、earpiece(聽筒)、speaker(揚(yáng)聲器)、有線耳機(jī)(有三段式四段式兩種,三段式?jīng)]有MIC功能,四段式有)等。但是藍(lán)牙耳機(jī)比較特殊,它是直接通過I2S總線與audio DSP連接的,主要是因?yàn)橐纛l的采集和播放在藍(lán)牙芯片里都有了。當(dāng)用藍(lán)牙耳機(jī)聽音樂時(shí),音頻碼流在AP上解碼成PCM數(shù)據(jù)用A2DP協(xié)議經(jīng)過UART直接送給藍(lán)牙耳機(jī)播放,而不是經(jīng)過audio DSP通過IIS總線送給藍(lán)牙耳機(jī)播放。
再來看軟件。音頻相關(guān)的軟件在三個(gè)處理器(AP/CP/audio DSP)上都有,先看AP上的音頻軟件。本文講的是Android智能手機(jī)上的音頻,運(yùn)行的當(dāng)然就是Android系統(tǒng)了,Android系統(tǒng)就運(yùn)行在AP上。Android里有mulTImedia framework,audio是其中的一部分,AP上audio部分的軟件框圖如下:
Android音頻軟件分不同的層,主要有kernel/user/Framework/JNI/Java。從底層kernel向上講吧。Android的核用的是Linux的。Linux上音頻相關(guān)的子系統(tǒng)叫ALSA,包括kernel space和user space兩部分。Kernel space里是音頻驅(qū)動(dòng),user space里主要是提供API給應(yīng)用程序調(diào)用。Android的音頻驅(qū)動(dòng)跟Linux是一樣的,在user space里對ALSA進(jìn)行了裁剪形成了tinyalsa。關(guān)于這些我在前面的文章( 音頻的采集和播放)里簡單描述過,有興趣可以去看看。同時(shí)user space里還有音頻軟件編解碼的各種庫,包括音樂的(MP3/AAC等)和語音的(AMR-NB/AMR-WB等)。再向上就是Framework,里面模塊眾多,主要有NuPlayer/stageFright Record/openMAX/AudioFlinger等,網(wǎng)上講audio Framework的文章太多了,這里就不細(xì)講了。Auido HAL(Hardware Adapter Layer,硬件適配層)也在這一層。Framework上層是JNI(Java Native Interface),提供接口供Java調(diào)用,提供的接口主要有MediaRecorder/MediaPlayer/AudioTrack/AudioRecorder。最上層是Java層,也就是各種帶有音頻功能的APP(調(diào)用提供的API)了。
再看audio DSP上的音頻軟件。下圖是audio的軟件框圖:
從上圖看出,模塊主要有codec(MP3/AAC/AMR/EVS等)、前處理(AGC/ANS/AGC等)、后處理(EQ/AGC/ANS 等)、重采樣(SRC)、混音(MIX)、從DMA獲取采集到的音頻數(shù)據(jù)(CAPTURE)、將音頻數(shù)據(jù)送給DMA后播放(PLAY)等,當(dāng)然還有接收和發(fā)送給其他處理器的音頻數(shù)據(jù)處理等,AP和CP都要與audio DSP交互語音數(shù)據(jù)。
最后看CP上的音頻軟件,它上面處理的就是跟語音通信相關(guān)的。2/3G跟4G完全處理完全不一樣(2/3G是CS call,會(huì)有專用的信道處理語音。4G是一個(gè)純IP的網(wǎng)絡(luò),是PS call),會(huì)有兩套處理機(jī)制。我沒做過CP上的音頻處理(我主要做audio DSP上的音頻處理,偶爾做些AP上的音頻處理),對2/3G下的語音處理不熟悉,對4G下的語音處理了解。下圖是4G下的音頻軟件處理框圖:
主要分兩大部分,IMS stub,處理IMS(IP Multimedia Subsystem, IP多媒體子系統(tǒng))中的語音數(shù)據(jù)相關(guān)的(IMS 控制協(xié)議相關(guān)的在AP中處理)。Audio,對IMS中語音數(shù)據(jù)的pack/unpack以及與audio DSP的交互等。
智能手機(jī)中音頻場景眾多,有些場景中三個(gè)處理器中的音頻軟件都會(huì)涉及,比如打電話,AP上主要是處理一些控制上的邏輯,CP和audio DSP上不僅有控制邏輯,還有語音數(shù)據(jù)的處理,上行是先從MIC采集到語音經(jīng)Audio DSP處理后變成碼流發(fā)給CP,CP處理后經(jīng)過空口發(fā)到網(wǎng)絡(luò)上,下行是CP從空口拿語音碼流,處理后發(fā)給audio DSP,audio DSP再解碼后發(fā)給codec芯片直到外設(shè)播放出來。有些場景只涉及部分處理器中的音頻軟件,比如在播放音樂時(shí)CP上的音頻軟件就不會(huì)涉及,在用APP播放音樂時(shí),是音樂從AP上傳到audio DSP上,經(jīng)過相關(guān)處理后通過外設(shè)播放出來。在下一篇文章中我會(huì)詳細(xì)的描述在各種音頻場景中音頻數(shù)據(jù)的流向。