智能手機(jī)的音頻技術(shù)介紹
手機(jī)可以說(shuō)是現(xiàn)在人日常生活中最離不開(kāi)的電子設(shè)備了。它自誕生以來(lái),從模擬的發(fā)展到數(shù)字的,從1G發(fā)展到目前的4G以及不久將來(lái)的5G,從最初的只有唯一的功能(打電話)發(fā)展到目前的全功能,從功能機(jī)(feature phone)發(fā)展到智能機(jī)(smart phone),可謂變化巨大。對(duì)于手機(jī)上的音頻來(lái)說(shuō),剛開(kāi)始只有語(yǔ)音通信功能,現(xiàn)在不僅語(yǔ)音通信,還可以聽(tīng)音樂(lè)、錄音、智能語(yǔ)音(語(yǔ)音輸入/語(yǔ)音交互)等。智能手機(jī)中的音頻場(chǎng)景眾多,可以說(shuō)是手機(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ī)信號(hào)好不好就跟它相關(guān)。Audio DSP,顧名思義,就是一個(gè)處理音頻的DSP。我在剛做手機(jī)的時(shí)候就很納悶現(xiàn)在AP處理器頻率那么高,音頻處理(尤其是語(yǔ)音)CPU load 不高,AP上完全可以處理,為啥還要額外加一個(gè)音頻DSP處理音頻呢,這不是增加了成本嗎?隨著做的深入,知道了這主要是出于功耗的考慮。功耗是手機(jī)上的一個(gè)重要指標(biāo),也是過(guò)認(rèn)證的必選項(xiàng),它決定了手機(jī)的續(xù)航能力。在手機(jī)電池技術(shù)沒(méi)有獲得突破的現(xiàn)在,要想續(xù)航能力強(qiáng),就得降功耗。音頻中的打電話和聽(tīng)音樂(lè)是手機(jī)上的最主要功能之一,必須在這兩種場(chǎng)景下降功耗。怎么降呢?就是加一塊專(zhuān)門(mén)處理音頻的DSP,在打電話和聽(tīng)音樂(lè)時(shí)讓AP在絕大多數(shù)時(shí)間都出于sleep狀態(tài),這樣功耗就降下來(lái)了。 AP、CP和audio DSP之間通過(guò)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通過(guò)I2S總線交換音頻數(shù)據(jù)。連著硬件codec的是各種外設(shè),有MIC(現(xiàn)在主流的是雙MIC方案)、earpiece(聽(tīng)筒)、speaker(揚(yáng)聲器)、有線耳機(jī)(有三段式四段式兩種,三段式?jīng)]有MIC功能,四段式有)等。但是藍(lán)牙耳機(jī)比較特殊,它是直接通過(guò)I2S總線與audio DSP連接的,主要是因?yàn)橐纛l的采集和播放在藍(lán)牙芯片里都有了。當(dāng)用藍(lán)牙耳機(jī)聽(tīng)音樂(lè)時(shí),音頻碼流在AP上解碼成PCM數(shù)據(jù)用A2DP協(xié)議經(jīng)過(guò)UART直接送給藍(lán)牙耳機(jī)播放,而不是經(jīng)過(guò)audio DSP通過(guò)IIS總線送給藍(lán)牙耳機(jī)播放。
再來(lái)看軟件。音頻相關(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里對(duì)ALSA進(jìn)行了裁剪形成了tinyalsa。關(guān)于這些我在前面的文章( 音頻的采集和播放)里簡(jiǎn)單描述過(guò),有興趣可以去看看。同時(shí)user space里還有音頻軟件編解碼的各種庫(kù),包括音樂(lè)的(MP3/AAC等)和語(yǔ)音的(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交互語(yǔ)音數(shù)據(jù)。
最后看CP上的音頻軟件,它上面處理的就是跟語(yǔ)音通信相關(guān)的。2/3G跟4G完全處理完全不一樣(2/3G是CS call,會(huì)有專(zhuān)用的信道處理語(yǔ)音。4G是一個(gè)純IP的網(wǎng)絡(luò),是PS call),會(huì)有兩套處理機(jī)制。我沒(méi)做過(guò)CP上的音頻處理(我主要做audio DSP上的音頻處理,偶爾做些AP上的音頻處理),對(duì)2/3G下的語(yǔ)音處理不熟悉,對(duì)4G下的語(yǔ)音處理了解。下圖是4G下的音頻軟件處理框圖:
主要分兩大部分,IMS stub,處理IMS(IP Multimedia Subsystem, IP多媒體子系統(tǒng))中的語(yǔ)音數(shù)據(jù)相關(guān)的(IMS 控制協(xié)議相關(guān)的在AP中處理)。Audio,對(duì)IMS中語(yǔ)音數(shù)據(jù)的pack/unpack以及與audio DSP的交互等。
智能手機(jī)中音頻場(chǎng)景眾多,有些場(chǎng)景中三個(gè)處理器中的音頻軟件都會(huì)涉及,比如打電話,AP上主要是處理一些控制上的邏輯,CP和audio DSP上不僅有控制邏輯,還有語(yǔ)音數(shù)據(jù)的處理,上行是先從MIC采集到語(yǔ)音經(jīng)Audio DSP處理后變成碼流發(fā)給CP,CP處理后經(jīng)過(guò)空口發(fā)到網(wǎng)絡(luò)上,下行是CP從空口拿語(yǔ)音碼流,處理后發(fā)給audio DSP,audio DSP再解碼后發(fā)給codec芯片直到外設(shè)播放出來(lái)。有些場(chǎng)景只涉及部分處理器中的音頻軟件,比如在播放音樂(lè)時(shí)CP上的音頻軟件就不會(huì)涉及,在用APP播放音樂(lè)時(shí),是音樂(lè)從AP上傳到audio DSP上,經(jīng)過(guò)相關(guān)處理后通過(guò)外設(shè)播放出來(lái)。在下一篇文章中我會(huì)詳細(xì)的描述在各種音頻場(chǎng)景中音頻數(shù)據(jù)的流向。





