音頻處理codec相關概念小記

桃木剑 2024-05-30 07:24 12次浏览 0 条评论 taohigo.com

年紀大瞭,很多東西不記下來就會忘記,回溯時候又要花大量時間研究,寫個文章記錄下最近設計中掌握的信息吧,總體看音頻相關的軟硬件都是挺復雜的。

  • 什麼是codec

先來看一張dialog DA7217的框圖吧

DA7217 拓撲

左邊是音頻的輸入,可以是數字麥或者是模擬麥或者同時二者都有,右邊是輸出,可以是直推二級或者通過功放推喇叭,下邊是給控制器的接口,包括DAI數字音頻的信息通道和芯片配置接口通常為I2C。所有的輸入音頻通道以及DAI通道的音頻都可以混音輸出。

簡單來說Codec就是編解碼器,是編碼器encoder與解碼器decoder的混合體。當然現代大多數codec會集成環境降噪(ENC)、回音消除(AEC)等模塊,下面先記錄一些相關的名詞概念:

  • 音頻設備的三種接口

這個接口應該是DAI數字音頻的基礎也是核心

I2S接口優勢主要就是三根線能做到多通道音頻傳輸,因此很適合立體聲,首先被飛利浦用於消費音頻。信號中的幀時鐘、位時鐘、采樣頻率容易搞混,以及互相怎麼推算,還是要示波器多測一下加深印象。I2S是目前最廣泛的音頻接口。

I2S信號時序圖

PCM接口(脈沖編碼調制),該接口由時鐘脈沖(PCMCLK)、幀同步信號(PCMSYNC)及收發數據(DOUT/DIN)組成。在PCMSYNC信號的上升沿開始同步通信,PCMCLK的第2個上升沿有效傳輸,數據傳輸從MSB(Most Significant Bit)字開始,PCMSYNC頻率等於采樣率。PCMSYNC信號之後開始數據字的傳輸,單個的數據位按順序進行傳輸,1個時鐘周期傳輸1個數據字。PCM信號也可以做到多聲道傳輸(channel/slot)。這種信號接口常用於錄音。

PCM信號時序圖

PDM接口(脈沖密度調制),與傳統PCM(脈沖編碼調制)數字音頻信號不同,PDM信號在傳輸音頻時不需要進行采樣和量化,因此可以避免一些由於采樣和量化引起的失真和噪聲。相反,PDM信號是通過對模擬音頻信號進行比較,以每個采樣周期中脈沖出現的次數來表示原始音頻信號。在PDM信號中,每個采樣周期內有一個脈沖,該脈沖的出現次數與模擬音頻信號的幅度成正比。因此,如果模擬音頻信號的幅度較高,則每個采樣周期內將有更多的脈沖,反之亦然。這種方式可以實現高保真度的音頻傳輸,尤其在一些高保真度音頻應用中,例如音頻放大器、音頻處理器和揚聲器、數字麥克風的輸入接口等。PDM信號的數據量通常較大,需要較高的傳輸速率和更多的存儲空間。為瞭在不增加數據量的情況下提高PDM信號的質量,一些壓縮技術和算法可以用於壓縮PDM信號的數據量,同時保持高質量的音頻輸出。

PDM信號時序圖

  • codec的框圖和時鐘

再看看國產codec ES8311的框圖,記錄瞭一些關鍵的寄存器配置。

ES8311功能框圖

如果用的數字麥克風,PDM的主時鐘是codec給的,即BCLK的時鐘。時鐘頻率定義瞭系統的采樣頻率,同時定義瞭在數據線上傳輸的比特率。雖然沒有定義標準,典型的過采樣率是64。所以為瞭獲取24KHz的帶寬(與一個采樣頻率是48KHz的PCM系統相比較),主時鐘的頻率需要3.072MHz。

ES8311的EQ均衡,DAC EQ隻有一段,基本沒什麼效果,在輸入階段的ADC EQ可以做到2段均衡,這個寄存器的配置順芯有專門的的工具可以生成相對應的代碼,譬如:

/************************Parameter Setting************************//
//----------EVEREST EQ Mode Setting : ES8311 EQ
//----------LRCK Frequency : 16000
//----------EQ1 Mode : EQ1_BP
//----------EQ1 Frequency : 3.000000e-01~5
void ES8311_EQ_ADC(void)
{
es8311_write_reg(0x1C,0x65);//close eq
es8311_write_reg(0x1D,0x02);
es8311_write_reg(0x1E,0x43);
es8311_write_reg(0x1F,0xE5);
es8311_write_reg(0x20,0x5C);
es8311_write_reg(0x21,0x02);
es8311_write_reg(0x22,0x2A);
es8311_write_reg(0x23,0xA3);
es8311_write_reg(0x24,0x4C);
es8311_write_reg(0x25,0x06);
es8311_write_reg(0x26,0x6C);
es8311_write_reg(0x27,0x27);
es8311_write_reg(0x28,0x6D);
es8311_write_reg(0x29,0x1F);
es8311_write_reg(0x2A,0xF7);
es8311_write_reg(0x2B,0xFD);
es8311_write_reg(0x2C,0xFF);
es8311_write_reg(0x2D,0x23);
es8311_write_reg(0x2E,0x4B);
es8311_write_reg(0x2F,0xA7);
es8311_write_reg(0x30,0x4C);
es8311_write_reg(0x1B,0x05);//ADC_HPFS1
es8311_write_reg(0x1C,0x25);//open eq
/****************ALC/DRC配置未開啟******************/
}