嵌入式音頻處理基礎(chǔ)(二)
定點(diǎn)運(yùn)算
本文引用地址:http://www.ex-cimer.com/article/88167.htm執(zhí)行定點(diǎn)運(yùn)算的處理器一般對(duì)信號(hào)使用二進(jìn)制補(bǔ)碼表示法。定點(diǎn)格式可以表示有符號(hào)和無符號(hào)的整數(shù)和分?jǐn)?shù)。在定點(diǎn)處理器上使用有符號(hào)的分?jǐn)?shù)格式是在數(shù)字信號(hào)處理中最常見的。整數(shù)與分?jǐn)?shù)格式的差別在于二進(jìn)制小數(shù)點(diǎn)的位置。對(duì)于整數(shù),二進(jìn)制小數(shù)點(diǎn)是在最低位的右邊;而對(duì)于分?jǐn)?shù),通常把它們的小數(shù)點(diǎn)放在符號(hào)位的右邊 。圖4a表示了整數(shù)和分?jǐn)?shù)的格式。
圖4(a)分?jǐn)?shù)和整數(shù)格式 (b)IEEE 754 32位單精度浮點(diǎn)格式
雖然定點(diǎn)的規(guī)則簡化了數(shù)值操作且節(jié)省了存儲(chǔ)器,但同時(shí)也存在動(dòng)態(tài)范圍和精度之間的折衷。在需要保持很高分辨率同時(shí)又要使用很大數(shù)值范圍的應(yīng)用場合,就需要使用一個(gè)可以根據(jù)幅值和指數(shù)而移動(dòng)的小數(shù)點(diǎn)。
浮點(diǎn)運(yùn)算
使用浮點(diǎn)格式就可以在同一系統(tǒng)中表示非常大和非常小的數(shù)。浮點(diǎn)數(shù)與有理數(shù)的科學(xué)記數(shù)法十分相似。浮點(diǎn)數(shù)是用尾數(shù)和指數(shù)描述的。尾數(shù)確定了精度,而指數(shù)控制著動(dòng)態(tài)范圍。
有一個(gè)標(biāo)準(zhǔn)管理著數(shù)字機(jī)的浮點(diǎn)運(yùn)算。這個(gè)標(biāo)準(zhǔn)叫IEEE-754(圖4a);對(duì)于32位浮點(diǎn)數(shù)可以歸納如下。第31位(MSB,最高位)是符號(hào)位,它的0表示符號(hào)為正,它的1表示符號(hào)為負(fù)。從第30位到第23位是表示2的整次冪的指數(shù)字段(exp_field),并以127作為偏移量。最后,第22位到第0位表示分?jǐn)?shù)的尾數(shù)(mantissa)。隱藏位一般是指在小數(shù)點(diǎn)的左邊有一個(gè)1。
32位的IEEE浮點(diǎn)數(shù)的值可以用下面的等式來表示:
(-1)sign_bit × (1.mantissa) * 2(exp _field-127)
依靠8位的指數(shù)和23位的尾數(shù),IEEE-754達(dá)到了動(dòng)態(tài)范圍和精度之間的一個(gè)平衡。而且,IEEE浮點(diǎn)庫還包括了對(duì)于像??、0和NaN(不是一個(gè)數(shù))等附加特性的支持
表3表示了從常用的浮點(diǎn)和定點(diǎn)類型可以達(dá)到的最小數(shù)和最大數(shù)。
表3 各種數(shù)據(jù)格式的動(dòng)態(tài)范圍比較
在16位架構(gòu)上的仿真
正如我們?cè)谇懊娼忉尩模?6位處理并不能為高質(zhì)量音頻提供足夠的SNR,但這并不是說您不應(yīng)該選用16位處理器作為音頻系統(tǒng)。例如,用一個(gè)32位的浮點(diǎn)機(jī)把一個(gè)算法編寫成保持原來32位數(shù)據(jù)風(fēng)格的程序,是比較容易的;但一個(gè)16位處理器也可以通過非常低成本的仿真而保持32位的完整性。圖5示出了為一個(gè)嵌入式算法選擇數(shù)據(jù)類型時(shí)的一些可能性。
圖5 根據(jù)一個(gè)應(yīng)用的目標(biāo),可以有許多滿足系統(tǒng)要求的數(shù)據(jù)類型
在本節(jié)的余下部分,我們將描述如何在一個(gè)16位定點(diǎn)機(jī)上實(shí)現(xiàn)浮點(diǎn)和32位擴(kuò)展精度定點(diǎn)格式的功能。
在定點(diǎn)處理器上的浮點(diǎn)仿真
在大多數(shù)的16位定點(diǎn)處理器上,IEEE-754浮點(diǎn)功能是通過對(duì)C/C++或匯編語言的庫調(diào)用而提供的。這些庫通過使用定點(diǎn)乘法和運(yùn)算邏輯而對(duì)所需的浮點(diǎn)處理進(jìn)行仿真。這種仿真需要額外的處理周期來完成。但是,當(dāng)定點(diǎn)處理器內(nèi)核的時(shí)鐘進(jìn)入到500 MHz - 1 GHz范圍時(shí),在對(duì)符合IEEE-754的浮點(diǎn)運(yùn)算進(jìn)行仿真時(shí)需要的額外周期就不那么重要了。
為了降低計(jì)算的復(fù)雜性,可以使用IEEE-754的“松弛”版。這意味著浮點(diǎn)運(yùn)算并不會(huì)實(shí)現(xiàn)像?和NaN這樣一些標(biāo)準(zhǔn)特性。
進(jìn)一步的優(yōu)化是對(duì)尾數(shù)和指數(shù)使用一個(gè)更為本機(jī)化的類型。舉個(gè)例子,ADI公司的Blackfin定點(diǎn)處理器架構(gòu)具有一個(gè)由十六個(gè)16位寄存器組成的寄存器組,而這個(gè)寄存器組還可以用作8個(gè)32位寄存器。在這種配置下,每個(gè)內(nèi)核時(shí)鐘周期內(nèi),兩個(gè)32位寄存器可以從全部四個(gè)半寄存器中獲取操作數(shù)。為了優(yōu)化Blackfin寄存器組的使用,可以使用一種雙字的格式。這樣,一個(gè)字(16位)被保留為用作指數(shù),而另一個(gè)字(16位)則保留給分?jǐn)?shù)部分使用。
雙精度定點(diǎn)仿真
對(duì)于許多應(yīng)用來說,16位定點(diǎn)數(shù)據(jù)是不夠的,如果使用仿真浮點(diǎn)運(yùn)算,那么計(jì)算量又太大。對(duì)于這些應(yīng)用,擴(kuò)展精度定點(diǎn)仿真也許足以滿足系統(tǒng)的要求。使用一個(gè)高速定點(diǎn)處理器將確保有效降低所需的計(jì)算量。音頻中兩個(gè)常用的擴(kuò)展精度格式是32位和31位定點(diǎn)表示。
32位-精確仿真
32位運(yùn)算是16位定點(diǎn)處理器的自然軟件擴(kuò)展。對(duì)于那些32位寄存器組可以分為16位的兩半而進(jìn)行存取的處理器來說,這些兩半的寄存器可以合起來用于表示一個(gè)32位定點(diǎn)數(shù)。Blackfin處理器的硬件結(jié)構(gòu)允許單周期32位加法和減法。
例如,當(dāng)一個(gè)32位乘法采用累加器迭代操作時(shí)(像我們馬上就要討論的有些算法情況),我們只需用3個(gè)周期內(nèi)的16位乘法就可以實(shí)現(xiàn)32位的精度。兩個(gè)32位操作數(shù)(R0和R1)中的每一個(gè)都可以分為16位的兩半(R0.H / R0.L和R1.H / R1.L)。
從圖6可以容易看出,在使用16位乘法器的指令組合來對(duì)32位乘法R0 x R1進(jìn)行仿真的時(shí)候,我們需要下面的操作:
圖6 用16位操作實(shí)現(xiàn)32位乘法
* 四次16位乘法以產(chǎn)生四個(gè)32位結(jié)果
1. R1.L x R0.L
2. R1.L x R0.H
3. R1.H x R0.L
4. R1.H x R0.H
* 三次操作以保持在最終結(jié)果中數(shù)位的位置(符號(hào)>>表示右移)。由于我們正在做分?jǐn)?shù)運(yùn)算,所以結(jié)果是1.63(1.31 x 1.31 = 2.62,帶有一個(gè)冗余的符號(hào)位)。在大多數(shù)情況下,這個(gè)結(jié)果可以截取到1.31,以便裝入一個(gè)32位數(shù)據(jù)寄存器。因此,乘法的結(jié)果應(yīng)該以符號(hào)位為基準(zhǔn),或者以最大有效位為基準(zhǔn)。這樣,那些最右邊的最小有效位可以在截取操作時(shí)被安全地截取。
1. (R1.L x R0.L) >> 32
2. (R1.L x R0.H) >> 16
3. (R1.H x R0.L) >> 16
一個(gè)32位乘法的最終表達(dá)式
((R1.L x R0.L) >> 32 + (R1.L x R0.H) >> 16) + ((R1.H x R0.L) >> 16 + R1.H x R0.H)
在Blackfin架構(gòu)中,這些指令可以并行執(zhí)行,以實(shí)現(xiàn)在三個(gè)周期內(nèi)完成一次32位乘法的有效速率。
31位-精確仿真
我們可以把最高要求31位精度的定點(diǎn)乘法的計(jì)算時(shí)間減少到2個(gè)周期。這個(gè)技術(shù)對(duì)于音頻系統(tǒng)特別有吸引力,因?yàn)橐纛l系統(tǒng)通常至少需要24位的表示法,而32位的精度也許有些過分。使用“6 dB規(guī)則”,31位的精確仿真仍然保持了大約186 dB的動(dòng)態(tài)范圍,即使考慮了所有的量化效應(yīng)之后,這仍然具有非常充裕的余量。
從圖6中的乘法框圖來看,很明顯的一點(diǎn)是,最小有效位半字的乘法R1.L x R0.L對(duì)最終的結(jié)果沒有太大的貢獻(xiàn)。事實(shí)上,如果把結(jié)果截取為1.31,那么這個(gè)乘法只影響到1.31結(jié)果的最低位。對(duì)于許多應(yīng)用來說,由這一位引起的精度損失是通過減少一次16位乘法、一次移位和一次加法以加速32位乘法而得以平衡的。
31位精確乘法的表達(dá)式為
((R1.L x R0.H) + (R1.H x R0.L) ) >> 16 + (R1.H x R0.H)
在Blackfin架構(gòu)中,這些指令可以并行執(zhí)行,以實(shí)現(xiàn)在2個(gè)周期內(nèi)完成一次32位乘法的有效速率。
所以,這是音頻處理中使用的數(shù)據(jù)格式的“獨(dú)家新聞”。在本文的最后一部分,我們將介紹開發(fā)嵌入式音頻應(yīng)用的一些策略,主要聚焦于常用算法中的數(shù)據(jù)傳輸和構(gòu)建模塊。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論