『壹』 DSP學習入門
DSP學習入門:
DSP的特點 :
對於沒有使用過DSP的初學者來說,第一個困惑就是DSP其他的嵌入式處理器究竟有什麼不同,它和單片機,ARM有什麼區別.事實上,DSP也是一種嵌入式處理器,它完全可以完成單片機的功能.。
唯一的重要的區別在於DSP支持單時鍾周期的"乘-加"運算.這幾乎是所有廠家的DSP晶元的一個共有特徵.幾乎所有的DSP處理器的指令集中都會有一條MAC指令,這條指令可以把兩個操作數從RAM中取出相乘,然後加到一個累加器中,所有這些操作都在一個時鍾周期內完成.擁有這樣一條指令的處理器就具備了
DSP功能:
具有這條指令就稱之為數字信號處理器的原因在於,所有的數字信號處理演算法中最為常見的算術操作就是"乘-加".這是因為數字信號處理中大量使用了內積,或稱"點積"的運算.無論是FIR濾波,FFT,信號相關,數字混頻,下變頻.所有這些數字信號處理的運算經常是將輸入信號與一個系數表或者與一個本地參考信號相乘然後積分(累加),這就表現為將兩個向量(或稱序列)進行點積,在編程上就變成將輸入的采樣放在一個循環buffer里,本地的系數表或參考信號也放在一個buffer里,然後使用兩個指針指向這兩個buffer.這樣就可以在一個loop裡面使用一個MAC指令將二者進行點積運算.這樣的點積運算對與處理器來說是最快的,因為僅需一個始終周期就可以完成一次乘加.
了解DSP的這一特點後,當我們設計一個嵌入式系統時,首先要考慮處理器所實現的演算法中是否有點積運算,即是否要經常進行兩個數組的乘加,(記住數字濾波,相關等都表現為兩個數組的點積)如果有的話,每秒要做多少次,這樣就能夠決定是否採用DSP,採用多高性能的DSP了.
浮點與定點 :
浮點與定點也是經常是初學者困惑的問題,在選擇DSP器件的時候,是採用浮點還是採用定點,如果用定點是16位還是32位?其實這個問題和你的演算法所要求的信號的動態范圍有關.
定點的計算不過是把一個數據當作整數來處理,通常AD采樣來的都是整數,這個數相對於真實的模擬信號有一個刻度因子,大家都知道用一個16位的AD去采樣一個0到5V的信號,那麼AD輸出的整數除以2^16再乘以5V就是對應的電壓.在定點DSP中是直接對這個16位的采樣進行處理,並不將它轉換成以小數表示的電壓,因為定點DSP無法以足夠的精度表示一個小數,它只能對整數進行計算.
而浮點DSP的優勢在於它可以把這個采樣得到的整數轉換成小數表示的電壓,並不損失精度(這個小數用科學記數法來表示),原因在於科學記數法可以表示很大的動態范圍的一個信號,以IEEE754浮點數為例,
單精度浮點格式: [31] 1位符號 [30-23]8位指數 [22-00]23位小數
這樣的能表示的最小的數是+-2^-149,最大的數是+-(2-2^23)*2^127.動態范圍為20*log(最大的數/最小的數)=1667.6dB 這樣大的動態范圍使得我們在編程的時候幾乎不必考慮乘法和累加的溢出,而如果使用定點處理器編程,對計算結果進行舍入和移位則是家常便飯,這在一定程度上會損失是精度.原因在於定點處理處理的信號的動態范圍有限,比如16位定點DSP,可以表示整數范圍為1-65536,其動態范圍為20*log(65536/1)=96dB.對於32定點DSP,動態范圍為20*log(2^32/1)=192dB,遠小於32位ieee浮點數的1667.6dB,但是,實際上192dB對絕大多數應用所處理的信號已經足夠了。
由於AD轉換器的位數限制,一般輸入信號的動態范圍都比較小,但在DSP的信號處理中,由於點積運算會使中間節點信號的動態范圍增加,所以主要考慮信號處理流程中中間結果的動態范圍,以及演算法對中間結果的精度要求,來選擇相應的DSP.另外就是浮點的DSP更易於編程,定點DSP編程中程序員要不斷調整中間結果的P,Q值,實際就是不斷對中間結果進行移位調整和舍入.。
DSP與RTOS:
TI的CCS提供BIOS,ADI的VDSP提供VDK,都是基於各自DSP的嵌入式多任務內核.DSP編程可以用單用C,也可以用匯編,或者二者結合,一般軟體編譯工具都提供了很好的支持.我不想在這里多說BIOS,VDK怎麼用這在相應的文檔里說的很詳細.我想給初學者說說DSP的RTOS原理.用短短幾段話說這個復雜的東西也是挑戰!
其實DSP的RTOS和基於其他處理器的通用RTOS沒什麼大的區別,現在幾乎人人皆知的uCOSii也很容易移植到DSP上來,只要把寄存器保存與恢復部分和堆棧部分改改就可以.一般在用BIOS和VDK之前,先看看操作系統原理的書比較好.uCOS那本書也不錯.
BIOS和VDK其實是一個RTOS內核函數集,DSP的應用程序會和這些函數連接成一個可執行文件.其實實現一個簡單的多任務內核並不復雜,首先定義好內核的各種數據結構,然後寫一個scheler函數,功能是從所有就緒任務中(通過查找就緒任務隊列或就緒任務表)找出優先順序最高的任務,並恢復其執行.然後在此基礎上寫幾個用於任務間通信的函數就可以了,比如event,message box,等等.
RTOS一般採用搶先式的任務調度方式,舉例說當任務A等待的資源available的時候,DSP會執行一個任務調度函數scheler,這個函數會檢查當前任務是否比任務A優先順序低,如果是的話,就會把它當前掛起,然後把任務A保存在堆棧里寄存器值全部pop到DSP處理器中(這就是所謂的任務現場恢復).接著scheler還會把從堆棧中取出任務A掛起時的程序執行的地址,pop到PC,使任務A繼續執行.這樣當前任務就被任務A搶先了.
使用RTOS之後,每個任務都會有一個主函數,這個函數的起始地址就是該任務的入口.一般每個任務的主函數里有一個死循環,這個循環使該任務周期地執行,完成一部分演算法模塊的功能,其實這個函數跟普通函數沒任何區別,類似於C語言中的main函數.一個任務創建的時候,RTOS會把這個函數入口地址壓入任務的堆棧中,好象這個函數(任務)剛發生過一次中斷一樣.一旦這個新創建任務的優先順序在就緒隊列中是最高的,RTOS就會從其堆棧中彈出其入口地址開始執行.
有一個疑問是,不使用RTOS,而是簡單使用一個主循環在程序中調用各個函數模塊,一樣可以實現軟體的調度執行.那麼,這種常用的方法與使用RTOS相比有什麼區別呢?其實,使用主循環的方法不過是一種沒有優先順序的順序執行的調度策略而已.這種方法的缺點在於,主循環中調用的各個函數是順序執行的,那麼,即使是一個無關緊要的函數(比如閃爍一個LED),只要他不主動返回,也會一直執行直到結束,這時,如果發生一個重要的事件(比如DMA buffer full 中斷),就會得不到及時的響應和處理,只能等到那個閃爍LED的函數執行完畢.這樣就使整個DSP處理的優先次序十分不合理.而在使用了RTOS之後,當一個重要的事件發生時,中斷處理會進入RTOS,並調用scheler,這時scheler 會讓處理這一事件的任務搶佔DSP處理器(因為它的優先順序高).而哪個閃爍LED任務即使晚執行幾毫秒都沒任何影響.這樣整個DSP的調度策略就十分合理。
『貳』 DSP的演算法移植問題
移植:
1)如果你的演算法是基本opencv這樣的基本上開發的,你需要脫離opencv的環境。
2)如果你的演算法是C++語言,請你改成標準的C語言。雖然DSP的開發環境是支持C++的,但是不建議你這么做。
3)修改你演算法的內存分配,盡量內存一次分配好,DSP在演算法不斷的申請和釋放時會有隱患。優先使用靜態數組,會減輕很多工作量。
4)在CCS下建立工程,來調試你的演算法,內存分配函數需要使用TI提供的函數。如果你的演算法能夠長期穩定的運行,那麼恭喜你,你的演算法移植就完成了。
優化:
演算法優化,需要你能懂演算法,也懂DSP。如果你只會寫DSP程序,而不會演算法,這對整個產品來說,是不能達到最優的。有些公司怕演算法泄密,給優化人員一段或幾段程序讓其優化。我覺得這樣做是很不合理的。除非你自己能控制大局,精通優化,這樣才可行。
1)你需要對演算法原理做一個深刻苦的理解,閱讀相關的文章。
2)對你拿到的演算法做全方位的熟悉。
3)做好上面的准備工作後,你要對演算法的結構做重新的整理。依據DSP的特點,比如內存的分布。演算法結構調整完成後,你的演算法在DSP上速度應該有一個明顯的提高了。
4)結構調整完成後,找到演算法中比較費時的部分。確定我們需要優化的重點,這部分內容多是每張圖像都要處理一次或多次的部分。對於演算法啟動時初始化部分的內容,一般不需要優化。
5)確定優化內容後,你首先考慮從語言結構上去做優化,這個時候應該還是C語言的。我不建議大家用TI提供的在C語言中使用優化嵌入的C庫函數。
6)你把需要優化的函數改寫為線性匯編或匯編函數。不斷的調整軟體流水,提高速率。
『叄』 DSP實驗 讓我用C語言編寫程序完成計算sin(2.3π)+cos(1.7π)的值
sin(2.3*pi)+cos(1.7*pi)
娘的,樓下的你當我白痴啊,你不會用快速傅里葉變換啊,計算點數越大就越省時間,1024點計算,比你得到的那個時間起碼要縮短一半以上,還有很多改進型的FFT,更省時間
『肆』 DSP庫函數cfft32_SCALE、cifft32_NOSCALE、cbrev32分別是干什麼的,最好能給出C或C++語言實現
以上DSP的函數雖然是匯編的,但在庫函數的目錄中有相關文檔,其中詳細解釋了C語言的調用規則,還有演算法原理,大部分會有相應C代碼。你可以去目錄中查一下。
匯編是針對DSP進行過優化的,目的是為了實現效率最大化。
『伍』 請問DSP編程軟體是什麼,,應該用什麼編程語言
DSP的編程軟體是CCS開發平台,編程語言一般是C語言。
CCS有兩種工作模式:
1、軟體模擬器模式:可與DSP晶元分離,並在PC上模擬DSP指令集和工作機制,主要用於早期演算法的實現和調試。
2、硬體在線編程模式:可以在DSP晶元上實時運行,結合硬體開發板的在線編程和調試應用程序。
CCS的開發系統主要由以下組件構成:
1、TMS320C54x集成代碼生成工具。
2、CCS集成開發環境。
3、DSP / BIOS實時內核插件及其應用程序介面API。
4、RTDX插件,用於實時數據交換和相應的程序介面API。
5、TI以外的第三方提供的各種應用程序模塊插件。
(5)dsp演算法大全c語言版本擴展閱讀:
dsp編程中雙重循環、多重循環的優化:
1、將多個循環分成單層循環以減少循環數;
例如,在雙循環中,一個周期僅使用一個乘法器。 分成單層環路後,兩個乘法器可以使用一個周期,充分利用DSP乘法器資源,運算速度也將提高。
2、循環次數少的放在外層循環,循環次數多的放在內存循環;
3、二維數組的雙循環:二維數組的行循環置於外循環,列循環置於內循環;
4、避免在循環內進行乘法和除法運算:將循環內的乘法和除法運算盡可能移至循環外,並用加法代替。