DSP初學(xué)者入門(mén)

發(fā)布時(shí)間:2010-1-5 10:57    發(fā)布者:李寬
關(guān)鍵詞: dsp , 初學(xué)者 , 入門(mén)
DSP的特點(diǎn)

對于沒(méi)有使用過(guò)DSP的初學(xué)者來(lái)說(shuō),第一個(gè)困惑就是DSP其他的嵌入式處理器究竟有什么不同,它和單片機,ARM有什么區別.事實(shí)上,DSP也是一種嵌入式處理器,它完全可以完成單片機的功能.

唯一的重要的區別在于DSP支持單時(shí)鐘周期的"乘-加"運算.這幾乎是所有廠(chǎng)家的DSP芯片的一個(gè)共有特征.幾乎所有的DSP處理器的指令集中都會(huì )有一條 MAC指令,這條指令可以把兩個(gè)操作數從RAM中取出相乘,然后加到一個(gè)累加器中,所有這些操作都在一個(gè)時(shí)鐘周期內完成.擁有這樣一條指令的處理器就具備了DSP功能.

具有這條指令就稱(chēng)之為數字信號處理器的原因在于,所有的數字信號處理算法中最為常見(jiàn)的算術(shù)操作就是"乘-加".這是因為數字信號處理中大量使用了內積,或稱(chēng)"點(diǎn)積"的運算.無(wú)論是FIR濾波,FFT,信號相關(guān),數字混頻,下變頻.所有這些數字信號處理的運算經(jīng)常是將輸入信號與一個(gè)系數表或者與一個(gè)本地參考信號相乘然后積分(累加),這就表現為將兩個(gè)向量(或稱(chēng)序列)進(jìn)行點(diǎn)積,在編程上就變成將輸入的采樣放在一個(gè)循環(huán)buffer里,本地的系數表或參考信號也放在一個(gè)buffer里,然后使用兩個(gè)指針指向這兩個(gè)buffer.這樣就可以在一個(gè)loop里面使用一個(gè)MAC指令將二者進(jìn)行點(diǎn)積運算.這樣的點(diǎn)積運算對與處理器來(lái)說(shuō)是最快的,因為僅需一個(gè)始終周期就可以完成一次乘加.

了解DSP的這一特點(diǎn)后,當我們設計一個(gè)嵌入式系統時(shí),首先要考慮處理器所實(shí)現的算法中是否有點(diǎn)積運算,即是否要經(jīng)常進(jìn)行兩個(gè)數組的乘加,(記住數字濾波,相關(guān)等都表現為兩個(gè)數組的點(diǎn)積)如果有的話(huà),每秒要做多少次,這樣就能夠決定是否采用DSP,采用多高性能的DSP了.

浮點(diǎn)與定點(diǎn)

浮點(diǎn)與定點(diǎn)也是經(jīng)常是初學(xué)者困惑的問(wèn)題,在選擇DSP器件的時(shí)候,是采用浮點(diǎn)還是采用定點(diǎn),如果用定點(diǎn)是16位還是32位?其實(shí)這個(gè)問(wèn)題和你的算法所要求的信號的動(dòng)態(tài)范圍有關(guān).

定點(diǎn)的計算不過(guò)是把一個(gè)數據當作整數來(lái)處理,通常AD采樣來(lái)的都是整數,這個(gè)數相對于真實(shí)的模擬信號有一個(gè)刻度因子,大家都知道用一個(gè)16位的AD去采樣一個(gè)0到5V的信號,那么AD輸出的整數除以2^16再乘以5V就是對應的電壓.在定點(diǎn)DSP中是直接對這個(gè)16位的采樣進(jìn)行處理,并不將它轉換成以小數表示的電壓,因為定點(diǎn)DSP無(wú)法以足夠的精度表示一個(gè)小數,它只能對整數進(jìn)行計算.

而浮點(diǎn)DSP的優(yōu)勢在于它可以把這個(gè)采樣得到的整數轉換成小數表示的電壓,并不損失精度(這個(gè)小數用科學(xué)記數法來(lái)表示),原因在于科學(xué)記數法可以表示很大的動(dòng)態(tài)范圍的一個(gè)信號,以IEEE754浮點(diǎn)數為例,

單精度浮點(diǎn)格式: [31] 1位符號 [30-23]8位指數 [22-00]23位小數

這樣的能表示的最小的數是+-2^-149,最大的數是+-(2-2^23)*2^127.動(dòng)態(tài)范圍為20*log(最大的數/最小的數)=1667.6dB 這樣大的動(dòng)態(tài)范圍使得我們在編程的時(shí)候幾乎不必考慮乘法和累加的溢出,而如果使用定點(diǎn)處理器編程,對計算結果進(jìn)行舍入和移位則是家常便飯,這在一定程度上會(huì )損失是精度.原因在于定點(diǎn)處理處理的信號的動(dòng)態(tài)范圍有限,比如16位定點(diǎn)DSP,可以表示整數范圍為1-65536,其動(dòng)態(tài)范圍為 20*log(65536/1)=96dB.對于32定點(diǎn)DSP,動(dòng)態(tài)范圍為20*log(2^32/1)=192dB,遠小于32位ieee浮點(diǎn)數的 1667.6dB,但是,實(shí)際上192dB對絕大多數應用所處理的信號已經(jīng)足夠了.

由于A(yíng)D轉換器的位數限制,一般輸入信號的動(dòng)態(tài)范圍都比較小,但在DSP的信號處理中,由于點(diǎn)積運算會(huì )使中間節點(diǎn)信號的動(dòng)態(tài)范圍增加,所以主要考慮信號處理流程中中間結果的動(dòng)態(tài)范圍,以及算法對中間結果的精度要求,來(lái)選擇相應的DSP.另外就是浮點(diǎn)的DSP更易于編程,定點(diǎn)DSP編程中程序員要不斷調整中間結果的P,Q值,實(shí)際就是不斷對中間結果進(jìn)行移位調整和舍入.

DSP與RTOS

TI的CCS提供BIOS,ADI的VDSP提供VDK,都是基于各自DSP的嵌入式多任務(wù)內核.DSP編程可以用單用C,也可以用匯編,或者二者結合, 一般軟件編譯工具都提供了很好的支持.我不想在這里多說(shuō)BIOS,VDK怎么用這在相應的文檔里說(shuō)的很詳細.我想給初學(xué)者說(shuō)說(shuō)DSP的RTOS原理.用短短幾段話(huà)說(shuō)這個(gè)復雜的東西也是挑戰!

其實(shí)DSP的RTOS和基于其他處理器的通用RTOS沒(méi)什么大的區別,現在幾乎人人皆知的uCOSii也很容易移植到DSP上來(lái),只要把寄存器保存與恢復部分和堆棧部分改改就可以.一般在用BIOS和VDK之前,先看看操作系統原理的書(shū)比較好.uCOS那本書(shū)也不錯.

BIOS和VDK其實(shí)是一個(gè)RTOS內核函數集,DSP的應用程序會(huì )和這些函數連接成一個(gè)可執行文件.其實(shí)實(shí)現一個(gè)簡(jiǎn)單的多任務(wù)內核并不復雜,首先定義好內核的各種數據結構,然后寫(xiě)一個(gè)scheduler函數,功能是從所有就緒任務(wù)中(通過(guò)查找就緒任務(wù)隊列或就緒任務(wù)表)找出優(yōu)先級最高的任務(wù),并恢復其執行.然后在此基礎上寫(xiě)幾個(gè)用于任務(wù)間通信的函數就可以了,比如event,message box,等等.

RTOS一般采用搶先式的任務(wù)調度方式,舉例說(shuō)當任務(wù)A等待的資源available的時(shí)候,DSP會(huì )執行一個(gè)任務(wù)調度函數scheduler,這個(gè)函數會(huì )檢查當前任務(wù)是否比任務(wù)A優(yōu)先級低,如果是的話(huà),就會(huì )把它當前掛起,然后把任務(wù)A保存在堆棧里寄存器值全部pop到DSP處理器中(這就是所謂的任務(wù)現場(chǎng)恢復).接著(zhù)scheduler還會(huì )把從堆棧中取出任務(wù)A掛起時(shí)的程序執行的地址,pop到PC,使任務(wù)A繼續執行.這樣當前任務(wù)就被任務(wù)A搶先了.

使用RTOS之后,每個(gè)任務(wù)都會(huì )有一個(gè)主函數,這個(gè)函數的起始地址就是該任務(wù)的入口.一般每個(gè)任務(wù)的主函數里有一個(gè)死循環(huán),這個(gè)循環(huán)使該任務(wù)周期地執行, 完成一部分算法模塊的功能,其實(shí)這個(gè)函數跟普通函數沒(méi)任何區別,類(lèi)似于C語(yǔ)言中的main函數.一個(gè)任務(wù)創(chuàng )建的時(shí)候,RTOS會(huì )把這個(gè)函數入口地址壓入任務(wù)的堆棧中,好象這個(gè)函數(任務(wù))剛發(fā)生過(guò)一次中斷一樣.一旦這個(gè)新創(chuàng )建任務(wù)的優(yōu)先級在就緒隊列中是最高的,RTOS就會(huì )從其堆棧中彈出其入口地址開(kāi)始執行.

有一個(gè)疑問(wèn)是,不使用RTOS,而是簡(jiǎn)單使用一個(gè)主循環(huán)在程序中調用各個(gè)函數模塊,一樣可以實(shí)現軟件的調度執行.那么,這種常用的方法與使用RTOS相比有什么區別呢?其實(shí),使用主循環(huán)的方法不過(guò)是一種沒(méi)有優(yōu)先級的順序執行的調度策略而已.這種方法的缺點(diǎn)在于,主循環(huán)中調用的各個(gè)函數是順序執行的,那么, 即使是一個(gè)無(wú)關(guān)緊要的函數(比如閃爍一個(gè)LED),只要他不主動(dòng)返回,也會(huì )一直執行直到結束,這時(shí),如果發(fā)生一個(gè)重要的事件(比如DMA buffer full 中斷),就會(huì )得不到及時(shí)的響應和處理,只能等到那個(gè)閃爍LED的函數執行完畢.這樣就使整個(gè)DSP處理的優(yōu)先次序十分不合理.而在使用了RTOS之后,當一個(gè)重要的事件發(fā)生時(shí),中斷處理會(huì )進(jìn)入RTOS,并調用scheduler,這時(shí)scheduler 會(huì )讓處理這一事件的任務(wù)搶占DSP處理器(因為它的優(yōu)先級高).而哪個(gè)閃爍LED任務(wù)即使晚執行幾毫秒都沒(méi)任何影響.這樣整個(gè)DSP的調度策略就十分合理.

RTOS要說(shuō)的內容太多,我只能講一下自己的一點(diǎn)體會(huì )吧

DSP與正(余)弦波

在DSP的應用中,我們經(jīng)常要用到三角函數,或者合成一個(gè)正(余)弦波.這是因為我們喜歡把信號通過(guò)傅立葉變換映射到三角函數空間來(lái)理解信號的頻率特性. 信號處理的一些計算技巧都需要在DSP軟件中進(jìn)行三角函數計算.然而三角函數計算是非線(xiàn)性的計算,DSP并沒(méi)有專(zhuān)門(mén)的指令來(lái)求一個(gè)數的正弦或余弦.于是我們需要用線(xiàn)性方法來(lái)近似求解.

一個(gè)直接的想法是用多項式擬合,這也正是大多數DSP C編譯器提供正余弦庫函數所采用的方法.其原理是把三角函數向函數空間{1,x,x^2,x^3....}上投影,從而獲得一系列的系數,用這些系數就可以擬合出三角函數.比如,我們在[0,pi/2]區間上擬合sin,只需在matlab中輸入以下命令:

x=0:0.05:pi/2;
p=polyfit(x,sin(x),5)

就得到5階的多項式系數:

p =
0.00581052047605 0.00580963216172 -0.17193865685360
0.00209002716293 0.99969270087312 0.00000809543448

于是在[0,pi/2]區間上:

sin(x)= 0.00000809543448+0.99969270087312*x+ 0.00209002716293*x^2-0.17193865685360*x^3+
0.00580963216172*x^4+0.00581052047605*x^5

于是在DSP程序中,我們可以通過(guò)用乘加(MAC)指令計算這個(gè)多項式來(lái)近似求得sin(x)

當然如果用定點(diǎn)DSP還要把P這個(gè)多項式系數表用一定的Q值來(lái)改寫(xiě)成定點(diǎn)數.

這樣的三角函數計算一般都需要幾十個(gè)cycle 的開(kāi)銷(xiāo).這對于某些場(chǎng)合是不能容忍的

另一種更快的方法是借助于查表,比如,我們將[0,pi/2]分成32個(gè)區間,每個(gè)區間長(cháng)度就為pi/64,在每個(gè)區間上我們使用直線(xiàn)段擬合sin曲線(xiàn),每個(gè)區間線(xiàn)段起點(diǎn)的正弦值和線(xiàn)段斜率事先算好,存在RAM里,這樣就需要在在RAM里存儲64個(gè)
常數:

32個(gè)起點(diǎn)的精確的正弦值(事先算好):

s[32]={0,sin(pi/64),sin(pi/32),sin(pi/16)....}
32個(gè)線(xiàn)段的斜率: f[32]={0.049,.....}

對于輸入的每一個(gè)x,先根據其大小找到所在區間i,通常x用定點(diǎn)表示,一般取其高幾位就是系數i了,然 后通過(guò)下式即可求出sin(x):

sin(x)= s*f

這樣一般只需幾個(gè)CYCLE就可以算出正弦值,如果需要更高的精度,可以將區間分得更細,當然,也就需 要更多的RAM去存儲常數表.

事實(shí)上,不僅三角函數,其他的各種非線(xiàn)性函數都是這樣近似計算的.

1. 接觸DSP

在參加過(guò)一次社會(huì )上多的盡乎到了泛濫地步的"DSPxxx"培訓班之后,我"自信"已經(jīng)具備DSP工師資格,便欣喜若狂跑道書(shū)店買(mǎi)了一本名為"DSP xxx應用"的書(shū),作者叫xxx,并且是這個(gè)領(lǐng)域的牛人,這本書(shū)確實(shí)是很出色的書(shū)籍.但是當時(shí),對于我這個(gè)對DSP一竅不通、剛剛入門(mén)的人來(lái)說(shuō)卻建立了一個(gè)錯誤的概念——DSP是個(gè)很容易的領(lǐng)域,只要培訓一下,再稍微看看書(shū),就可以成為專(zhuān)家.所以,現在看來(lái),這些都是誤導,我認為學(xué)習DSP技術(shù)應該分為兩個(gè)階段,第一階段學(xué)習DSP技術(shù)基礎概念;第二階段學(xué)習DSP技術(shù)的行業(yè)應用.那本"DSP xxx應用"的書(shū),它更適合書(shū)名應叫做"DSP中的數學(xué)或物理運用"...什么的.

2. 購買(mǎi)DSP學(xué)習套件

有了興趣,就要去學(xué)習,于是我攛掇領(lǐng)導批準購買(mǎi)了DSP學(xué)習入門(mén)套件(DSK),許多公司均有銷(xiāo)售,如TI等,大概是需要3000-4000人民幣.買(mǎi)后不久,我就發(fā)現,這種套件對于我來(lái)說(shuō)一點(diǎn)用處都沒(méi)有.因為我的基礎知識實(shí)在是太差了.這些套件對于我來(lái)說(shuō),只是另一種涵義的PC機及一些外圍設備,想要懂的這些東西,我就需要去讀更多的相關(guān)書(shū)籍,這時(shí),很難沒(méi)有想要放棄的念頭,我開(kāi)始有點(diǎn)畏懼DSP這種技術(shù),門(mén)檻太高了.可是,我不能放棄,我已經(jīng)投入了許多的金錢(qián)和時(shí)間,我不想丟掉這4000元錢(qián),也不能對領(lǐng)導沒(méi)有交待.事實(shí)上,我沒(méi)有想到,我將付出更多的錢(qián)和時(shí)間去學(xué)習.

3. 再次參加培訓班,再次購買(mǎi)DSP書(shū)籍

在我就感到了無(wú)助,困惑之際.我又想到了放棄.雖然我的數學(xué)還算不錯,但其中遇到的一些問(wèn)題在我思考后,還是無(wú)法解決,我越來(lái)越畏懼DSP了.于是,我開(kāi)始在"google"上搜索DSP培訓相關(guān)的信息,終于發(fā)現聞亭公司"DSP培訓中心"的教程和內容正是我一直尋找的東西.也許是DSP技術(shù)對我的有著(zhù)巨大的誘惑力,也許是我的之直著(zhù),我又一次勇敢的報名參加了培訓.32個(gè)課時(shí)之后,解決了我半年多來(lái)積累的很多粗淺的問(wèn)題.再翻開(kāi)培訓教材剛剛復讀了第一章時(shí),我想如果這本教材是我讀到的第一本書(shū),并且我沒(méi)有花4000元買(mǎi)那個(gè)可*的學(xué)習套件,我會(huì )毫不猶豫的投降,放棄學(xué)習DSP,但.......那個(gè)可* 的xxx作者,他的書(shū)怎么可以用作教學(xué)呀.他的書(shū)雖然讓我對DSP產(chǎn)生了濃厚的興趣,卻把我引到了一條艱難的路上,而且花了那么多的冤枉錢(qián)....既然事已如此,我只有慢慢的去讀這些書(shū)籍,在我讀到教材的后面章節以后,我開(kāi)始明白前面章節的內容,所以當你讀書(shū)遇到不明白的時(shí)候,千萬(wàn)不要氣餒.有時(shí),一個(gè)內容,可能需要讀上幾遍,才能明白,這比一開(kāi)始的感覺(jué)要好的多了.

4. 實(shí)驗——至關(guān)重要的一步

現在,從你的架子上取下那套DSK,去嘗試做一些小實(shí)驗,我的第一個(gè)實(shí)驗是"正弦發(fā)生器",這個(gè)實(shí)驗比較簡(jiǎn)單,但是它也花費了我幾周的時(shí)間去讀大量的關(guān)于串口、編碼、寄存器等的書(shū)并且進(jìn)行大量的實(shí)驗.這個(gè)執行半小時(shí)的"正弦發(fā)生器",讓我查閱了恨不得夠組建一個(gè)圖書(shū)館的書(shū)籍,而且這個(gè)東西沒(méi)有任何用途.我是用匯編語(yǔ)言在54x中執行,這個(gè)實(shí)驗讓我很好的理解了什么是DSP,什么是McBSP, DMA, 等.當然問(wèn)題也同步產(chǎn)生了,我就又不得不做了許多的實(shí)驗去驗證.我建議,在系統未定型之前,使用mathlab/simulink進(jìn)行仿真,并且可以多實(shí)驗幾種芯片,這樣可以讓你明白更多的內容.我覺(jué)得我就要成為一個(gè)真正的DSP工程師了,我度過(guò)了最困難的時(shí)期.我覺(jué)得自己是個(gè)英雄.

5. 去尋找一份與DSP相關(guān)的工作,去當個(gè)DSP工程師

我希望困難已經(jīng)過(guò)去,但這種愿望為時(shí)過(guò)早了.在DSP的研究中,我還遇到了很多的困難,由于篇幅有限,我就不在進(jìn)行描述了.反正,如果想成為真正的DSP 專(zhuān)家,就不要期望事情會(huì )變得容易.有些DSP開(kāi)發(fā)人員并不知道什么是真正的0和1,他們只會(huì )查閱各種參考書(shū)籍和參數表,我們并不提倡這種做法.因為這些人選擇了一種簡(jiǎn)單的做法,但是他們并不是真正的DSP開(kāi)發(fā)人員.他們只是編寫(xiě)一些他們不理解的代碼,他們似乎在擔當著(zhù)一臺"編碼器"的角色.

6. 總結

這篇文章只是我的一點(diǎn)感慨,可能并不是很適用現在的DSP開(kāi)發(fā)工程師,因為,市面上已經(jīng)有了供你學(xué)習的DSP教學(xué)套件,搭配了多種實(shí)驗供你參考,輕松入門(mén),如:聞亭公司的"大學(xué)實(shí)驗箱"什么的.這個(gè)實(shí)驗箱提供了一個(gè)很好的實(shí)驗環(huán)境,并且為初學(xué)的你設計了多種實(shí)驗、教材,讓你由淺入深的學(xué)習.不會(huì )向我似的,繞一大圈才走到正確的路上.另外,你也可以向他們的工程師咨詢(xún).
本文地址:http://selenalain.com/thread-7258-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
lelee007 發(fā)表于 2010-1-5 21:36:40
有木有站內收藏的哦?!
admin 發(fā)表于 2010-1-7 10:32:48
站內收藏按鈕已添加
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页