當前位置:首頁 » 編程軟體 » dsp編程技巧

dsp編程技巧

發布時間: 2022-09-06 13:47:34

① 什麼叫高級處理器

你這樣的問題我有點難得回答呀,范圍太大了,
總體來說CPU現在算高級的就是雙核的,更高級的就是4核的了,INTEL有賽揚的雙核、有奔騰的雙核、有酷睿的雙核、又有酷睿2的雙核、還有4核,E開頭的、T開頭的、P開頭的等等。AMD的4800+以上的都算高級處理器了,更高的有巴塞羅納等等
再給你加個:
了解高級處理器特點 提高編碼效率
Understanding Advanced Processor Features Promotes Efficient Coding
ADI公司 David Katz,Tomasz Lukasiak與Rick Gentile
如今的數字信號處理器(DSP)在性能、外圍設備集成、功耗和成本方面都具備很多優勢,很多系統設計人員希望在原有系統設計中利用DSP獲得比傳統處理器更好的效益。但其中一個潛在障礙就是為應用開發的大量遺留C/C++語言代碼。顯然,工程師們希望能夠在DSP平台上最大程度地利用原有高級語言代碼,同時充分利用DSP的結構特點,達到原平台無法企及的高性能。此外,設計人員還需要一個熟悉、直觀的程序開發環境和一種簡單的方法,用於有選擇地進行匯編語言的例行程序。本文將介紹在當前的開發環境下為DSP編程的策略與技巧,其中以ADI公司推出的Blackfin 媒體處理器系列作為示例。

高級語言與匯編語言:兩者的結合是最佳辦法
在進行一項基於DSP的項目開發時,必然要面臨的一個問題就是選擇使用何種編程方法。選擇的結果通常都是在匯編語言與高級語言如C或C++之間選擇其中一種。而在選擇過程中往往需要考慮許多其它的因素,因此,在選擇之前了解這兩種語言的長處與不足是十分重要的。
C/C++的好處包括模塊化、可移植性以及可復用性。此外,不僅大多數的嵌入式程序設計員使用過這種高級語言,而且已經存在大量的代碼基礎,可以通過一種相對簡單的方法將這些代碼從原來的微控制器或DSP移植到新的DSP平台中。而匯編語言是針對特定體系結構的,因此代碼重用僅限於同一系列的處理器。此外,一個系統開發項目組通常劃分成不同的開發小組,分別負責不同的系統模塊,採用高級語言可以使這些功能交叉的開發小組不必知道各自的處理器平台。
傳統的匯編語言因為難懂的語法以及奇怪的首字縮寫而長期受到貶低。而現在這些因素在採用稱作"代數語法"的結構中已不成什麼問題。圖1中所給出的示例就是將典型的DSP指令分別以傳統的格式和代數格式表示時的對比。從圖中可以清楚地看出後者的結構要比前者更加直觀。
使用匯編語言編程困難的原因之一,就是它專注於DSP寄存器組、運算單元與存儲器之間的數據交流。而在C/C++高級語言中,這一過程通常是通過調用變數、函數以及子程序的方法在一個更加抽象的層面來完成的,因此使得編程更為簡單。
如今,C/C++編譯器所包含的內容十分豐富,其中許多功能可以完成將高級語言代碼編譯為嚴密的匯編語言代碼。事實上,編譯過程中最好的方法就是通過編譯器中的優化程序完成任務。但工具開發人員認為最重要的一系列功能,將影響編譯器的性能。因此,高級語言代碼不可能在所有方面都超過手工的匯編語言代碼。
程序開發人員通常只是在需要優化重要的密集型數據處理代碼程序塊時才會使用匯編語言,以提高程序在DSP上的運行效率。盡管高級語言編譯器在程序優化轉換方面做的很好,但在對DSP數據流與運算進行直接、仔細的控制時仍然存在不足之處。這也是許多程序設計員經常將C/C++ 等高級語言與匯編語言結合使用的原因。高級語言在程序控制以及基本的數據處理方面有著不錯的表現,而匯編語言則在高效的數學運算與速度最為關鍵的中斷服務常式方面體現出明顯的優勢。
高效編程的結構特點
匯編程序員要使編寫的程序高效運行,就必須要了解DSP與未針對超高速數據處理進行優化的普通處理器的區別。這些結構特點包括:
特殊的定址方式
硬體循環結構
可緩沖的存儲器
單循環執行多個操作
互鎖流水線
靈活的數據寄存器文件
這些結構特點可以在提高計算效率方面起到十分大的作用。下面逐個討論這些特點。
特殊的定址方式
如果要求處理器在一個單循環中訪問多個數據字,那麼就需要處理器在地址生成方面具有完全的靈活性。除了在16位與 32位范圍內的以DSP為主的訪問大小之外,需要使用位元組編址的方式才能達到最高效率的數據處理。這一點十分重要,因為在一些通常的應用中,包括許多以視頻為基礎的系統,都是以8位數據方式工作的。當存儲器的訪問被局限在單一的范圍內時,處理器就需要額外的循環用於屏蔽相關的位。
定址方式的另一個好處就是採用了"循環緩沖"功能。這一功能必須是由DSP在不藉助任何專門軟體管理而直接支持的。程序設計員可以利用循環緩沖功能在存儲器中定義緩沖區,程序執行時會自動跳過這一段。當緩沖區建立後,也無需專門的軟體管理這段數據。地址生成器不僅會處理不一致的跳躍,而且更重要的是它能夠如圖2中所示具備"環繞式處理程序"功能。如果沒有這種自動生成地址的功能,程序員將不得不人工跟蹤緩沖區,這樣就會浪費大量寶貴的處理周期。
一種基本的、用於高效率信號處理操作(如快速傅立葉變換與離散餘弦變換)的定址方式是位反轉技術。單從字面上理解,"位反轉"就是要按照二進制地址將位反轉。即把最不重要的位與最重要的位進行位置交換。基2蝶形運算所需的數據排序是按照"位反轉"的順序,因此在進行快速傅立葉變換階段需要用到位反轉索引。利用軟體可以計算出這些位反轉索引,但這種做法的效率十分低。圖3中給出的是位反轉地址流程示例圖。
硬體循環構造
在通信處理演算法中,循環是十分關鍵的功能。對於大多數演算法而言,有兩種與循環相關的功能可以提高演算法的性能。第一種被稱之?quot;零開銷硬體循環"。利用定址功能,循環構造通過硬體來實現。當然,這一功能也可以通過軟體來實現,此時相關的開銷則會影響到實時處理的性能。程序設計員通過"零開銷循環"對循環進行初始化,其方法就是建立一個計數值並定義循環范圍。處理器將不斷地執行這一循環直至達到這一計數值。
大多數DSP都支持"零開銷循環",但"硬體循環緩存"能夠真正提高循環結構的性能。它們用作存放循環中所執行指令的一個高速緩沖存儲器。例如,在循環執行了第一次之後,指令可以暫時存放在循環緩沖器中以備下次使用,從而在整個循環過程中就無需每次重取相同的指令。將循環中的指令存放在一個整個循環過程都能訪問到的緩存器中,這樣就能極大地節省循環次數。雖然這一功能無需程序設計員另外進行設定,但程序員必須了解緩存器的大小,這樣才能正確地選擇相應的循環大小。
可緩沖的存儲器
標準的數字信號處理器通常都有少量片上高速存儲器。微控制器通常能夠訪問較大的外部存儲器。分層式存儲器結構則匯集了這兩種方法的優點,提供了幾種具有不同性能層次的存儲器。對於最需要決定的應用,片內的SRAM可以在每個核心時鍾周期內完成一次訪問。而對於那些代碼量更大的系統,則可使用容量更大、等待時間稍長、片上或片外的存儲器。
就其本身而言,這種分層式結構的作用只是相對的,因為當今的高速處理器只是以較慢的速度有效地運行,因為大型的應用只配備有速度相對較慢的外部存儲器。此外,程序設計員也不得不手工地將重要代碼從內置式SRAM中移進移出。然而,如果在結構中增加了用於存放數據與指令的高速緩沖存儲器,外存儲器就變得更加易於管理了。高速緩存可以減少用手工方式移動指令與數據進出處理器內核的次數。這樣程序設計員就無需考慮進入處理器內核數據與指令流程的管理,從而極大地簡化了編程模式。
圖4是一個標準的存儲器配置,其中的指令可以根據需要從外存儲器中調入。指令高速緩存通常與一些最近最少使用(LRU)演算法一起使用,這樣就能夠確保那些經常使用的指令取代那些較少使用的指令。從圖中可以看出:通過配置象高速緩存這樣的片上存儲器以及SRAM等存儲器,還可以優化處理器的性能。DSP控制器能夠直接向內核寫入內容,而來自表中的數據則可以根據需要被調入數據高速緩存。
每個循環執行多個操作
處理器的衡量標准通常是每秒所能執行的百萬條指令數(MIPS)。然而,對於現在的處理器而言,這一標准則會由於組成每條指令含混的內涵而引起誤解。例如,過去因用於高端並行處理器而保留的多事件指令現在仍然用於低成本的定點處理器。在每個核心處理器周期內,除了執行多ALU/MAC操作之外,多餘數據的載入與存儲操作也可以在同一周期內完成。存儲器通常被分成幾個子存儲空間,這樣它就能夠被內核或DMA控制器進行雙重訪問了。正如前面所述的基於硬體的定址計算中進行的分析那樣,在一個單周期內完成多項操作是顯而易見的。
圖5中描述的是多操作指令示例。如圖中所示,在同一個處理器時鍾周期內,除了進行兩個 MAC 操作之外,還完成了一次取數據和存數據的操作。
互鎖流水線
隨著處理器的速度不斷提高,處理器的處理流水線也應該隨著整體性能的提高而不斷加深。理解這點十分重要,因為在需要使用匯編語言時,流水線可能會使編程更加具有挑戰性。而現在一些處理器已經使用了互鎖流水線。這就意味著,在使用匯編語言編程中,程序設計員無需人工安排或跟蹤數據與指令的流向,因為這些工作將全部由處理器進行自動處理。
靈活的數據寄存器組
最後,數字信號處理器的另一項功能就是通用數據寄存器組。對於傳統的數字信號處理器而言,字長通常是固定的。而如果數據寄存器既能被看作是一個32位字(如R0),也能被看作是兩個16位字(R0.L 與 R0.H,分別用於高和低的一半),其優點十分明顯。在雙MAC系統中,這樣就允許在一個時鍾周期內進行四個16位數據操作。
編程代碼對比與分析
上述介紹的結構框架是DSP高效編程的基礎。如果程序設計員能夠充分利用處理器的所有功能,許多常見的數學演算法可以極為快速的完成。下面挑選出一些常用的演算法,並介紹它們在DSP中的用法。需要注意的是,當程序員需要在匯編水平上檢查代碼的高效性時,如今經優化的DSP編譯器同樣採用了很多匯編程序設計員使用的規則。下面的示例使用的是Blackfin處理器匯編語言。
標量積
標量積是在測定兩個矢量正交性時的一種十分有用的操作。大多數的C語言程序設計員都會對下列這個標量積運用十分熟悉:
short dot(short a[], short b[], int size) {
int i;
int output = 0;
for(i=0; i<size; i++) {
output += (a[i] * b[i]);
}
return output;
下面是匯編語言代碼的主體部分:
//P0=loop count, I0 & P1 are address registers
A1 =A0 =0; //A0 & A1 are accumulators
LSETUP(loop1,loop1)LC0 =P0;
//Set up hardware loop starting at label loop1:
loop1: A1 += R1.H * R0.H , A0 += R1.L * R0.L || R1 = [ P1++ ] || R0 = [ I0 ++ ] ;

利用下面介紹的幾項數字信號處理器結構功能,將有助於編程。
通過使用硬體循環緩沖器與循環計數器,則無需在每次反復操作結尾時執行跳轉指令。 由於標量積是一個累加的和,它是通過一個循環來實現的。為了執行循環中的下一次反復操作,許多RISC微控制器都是在每次反復操作結尾使用一條跳轉指令。匯編程序中為LSETUP 指令,這是執行一個循環所需的唯一指令。
多事件指令允許在一個時鍾周期內執行指令和兩次數據訪問。在每次反復操作中,值 a[i] 與 b[i] 都一定會被讀取,然後相乘,並最後重新寫回到變數輸出的運行總和中。在大多數的微控制器平台中,這一過程需要使用四條指令。從匯編語言代碼中的最後一行可以看出,這些操作可以在一個時鍾周期內完成。
並行ALU操作允許兩個16位指令可以同時執行。匯編語言代碼表明兩個累加單元(A0 與 A1)在每次反復操作中都會被用到。這樣就能夠將反復操作的次數減少50%,從而有效地將執行時間縮短了一半。
FIR
有限脈沖響應濾波器(FIR)是一個與卷積操作一樣常用的濾波器程序結構。簡單的C 語言命令與標量積十分相似:
// sample the signal into a circular buffer
x[cur] = sampling_function();
cur = (cur+1)%TAPS; // advance the cur pointer in a circular fashion
// perform the multiply-addition
y = 0;
for (k=0; k<TAPS; k++) {
y += h[k] * x[(cur+k)%TAPS];
}
FIR的核心部分用匯編代碼表示出來之後與標量積的格式十分相似。事實上,DSP相同的功能也被用於實現執行演算法的最高性能。在本例中,信號采樣存貯在寄存器R0中,系數則存貯在寄存器R1中。
// P0 holds # of filter taps
R0=[I0++]||R1=[I1++]; // set initial values for R0 and R1
A1=A0=0; // zero the accumulators
LSETUP(loop1,loop1)LC0 =P0; // configure inner loop
loop1: A1+=R0.L*R1.L, A0+=R0.H*R1.H || R0 = [I0++] ||
R1 = [I1++]; // compute
除了具有上述標量積的功能之外,上例中的FIR演算法還使用了循環緩存器。
通過循環緩存器則無需使用明顯的模運算。在C語言代碼片斷中, % (模數)運算符提供了一種用於循環緩沖的機制。如匯編核心程序所示,該模運算符在循環內部並沒有轉換為一條另外的指令。取而代之的是,數據地址生成寄存器I0 與 I1 在循環外進行了設置,並且自動返回系數緩存器邊界的開始位置。
FFT(快速傅立葉變換)
快速傅立葉變換是許多信號處理演算法的核心部分。它的特點之一就是輸入矢量按照時間順序排序,而輸出矢量則是按照"位反轉"的順序。大多數傳統的通用型處理器都要求程序設計員執行一個單獨的程序,用於將經位反轉的輸出矢量復原。在數字信號處理器平台中,位反轉已經被設計在定址部分中了。
在執行快速傅立葉變換過程中,通過位反轉定址則無需使用單獨的位反轉程序。允許硬體對快速傅立葉變換演算法中的輸出矢量自動進行位反轉,這樣程序設計員就不用另外編寫應用程序,從而提高了處理器的性能。
除了上述介紹的指令結構之外,象 Blackfin這樣的處理器 還另外包括一些專用的指令集用於支持大范圍的應用。這些指令的作用是將處理器的處理能力進一步擴展到其它一些演算法,如Viterbi, Huffman編碼以及許多其它的位處理程序。
至此,可以清楚地認識到:在確定一個基於DSP應用的編程方案時,有許多需要考慮的內容。使用C 或C++ 這類帶強大編譯器與優化程序功能的高級語言可以快速地開發出各種產品,但使用手工編程的匯編語言則是在處理器以外獲取額外性能的最佳方法。當然,採用匯編語言的前提是選擇一種在結構上基本支持高效編碼的處理器。

② 什麼是DSP技術

數字信號處理(Digital Signal
Processing——DSP)強調的是通過專用集成電路晶元,利用數字信號處理理論,在晶元上運行目標程序,實現對信號的某種處理.

數位訊號處理(Digital Signal Processing)是二十一世紀形成科學和工程最具威力的技術之一。在各領域內廣泛的范圍中已經發生革命性的改變:通訊、醫療影像、雷達和聲納、高保真度(fidelity)音樂重製,和原油探勘,只有這些有被命名。每一個領域的DSP技術都已發展到一定的深度,有它們自個兒的演演算法、數學和特定的技巧。結合廣度與深度使得任何人都不能精通所有已被發展的DSP技術。DSP教育包含二項工作:學習一般可套用於整體的概念,以及對你感興趣的特定領域學習專業的技巧。本章藉由描述DSP已在數個不同領域中造成的戲劇般效應來開啟我們進入數位訊號處理(Digital Signal Processing)世界的旅程。革命已經開始了。

DSP的起源(The Roots of DSP)

數位訊號處理不同於其它電腦科學中的領域是由於它使用的資料型別的唯一性:訊號(signals)。在大多情況下,這些訊號起源於現實世界中知覺的(sensory)資料:地震的擺動(seismic vibrations)、視覺影像、聲波等……。在訊號已經被轉換為數位型式後,DSP是數學、演演算法和用來處理這些訊號的技術。這包含廣泛、多變化的目標,例如:強化視覺影像,辨識和產生對話(語音),為了儲存和傳送的資料壓縮,等……。假設我們加一個「對比到數位的轉換器」給電腦,並用它來擷取一部份真實世界的資料。DSP回答了問題:下一步是什麼?

DSP的起源是在1960和1970年代,當數位電腦首度變成可用時。電腦在這個時代是很昂貴的,而DSP受限於只有一些關鍵性的應用。先鋒們主要努力於四個關鍵領域:冒著國際的安全性危險的雷達和聲納,可以賺大把鈔票的原油探勘,資料有不可取代性的太空探索和可以救命的醫學影像。1980和1990時個人電腦的革命使得DSP新的應用突然遽增。動機並非是由於軍事和政府的需求,DSP突然被商業市場驅動了。任何認為他們可以在快速擴大的領域中賺錢的人全都突然變成是DSP的廠商。DSP在這樣的產品中變成眾所皆知的了:行動電話,CD(compact disc players),和電子語音郵件。圖1-1列舉了這些應用中的一部份。

此技術革命由上而下發生。在1980早期,DSP在電子電機領域中是在研究所課程中教授的課程。十年後,DSP已經變成大學標准課程的一部份。今日,DSP變成在許多領域中被科學家和工程師需要的基本技巧。以此類推,DSP可以被和之前技術革命中的「電子學(electronics)」相比。雖然仍是電子電機領域,幾乎每個科學家和工程師都有些基礎電路設計的背景。沒有的話,他們可能會迷失在技術的世界中。DSP也有相同的未來。

圖1-1
DSP已經在科學與工程的許多領域中發動革命。一些多樣化的應用列於此。

近來的歷史更是超令人好奇的;它對你學習和使用DSP的能力上有極大的影響。假設你遇到了一個DSP問題,並且轉向教科書或其它出版品以尋求答案。你通常找到的是一頁又一頁的方程式,難解的(obscure)數學符號和不熟悉的術語。這真是場惡夢!即使對那些在此領域中有經驗的人而言,許多DSP文獻仍令人困惑(baffling)。這並不是在文獻上有錯,它只是預期要給非常特定的讀者群。目前發展中之科技的研究者需要這種復雜(詳細)的數學以了解工作的理論的意涵(theoretical implications)。

本書基本的假設是大部份實用的DSP技術可以在沒有傳統復雜的數學和理論的藩籬下被學習和使用。《科學家和工程師的數位訊號處理指引手冊》(《The Scientist and Engineer』s Guide to Digital Signal Processing》)是為了那些想要使用DSP作為工具、而非新的職業的人寫的。
本章剩餘的部份列舉了一些DSP已經產生革命性變革的領域。當你看過每個應用,注意到DSP是非常介於各學科間的(interdisciplinary),依賴於許多相鄰領域中的技術性工作。如圖1-2所建議的,介於DSP和其它技術學科間的邊界並不明顯也沒有完善的定義,而是模糊和重疊的。如果你想要專攻DSP,你也需要去研讀一些相關的領域。

圖1-2
數位訊號處理在很多科學、工程和數學領域上有模糊和重疊的邊界。

電信(Telecommunications)

電信是關於從一個位置傳送資訊給另一個。這包含許多資訊的型式:電話交談、電視訊號、電腦檔案和其它類型的資料。要傳送資訊,你需要一個介於二個位置間的通道(channel)。這可能是一對導線(wire pair),無線電廣播訊號,光纖,等……。電信公司接收傳送他們的客戶的資訊的付費款項,然而他們必須付費來建立和維護通道(channel)。財務上的帳本盈虧結算線(bottom line)很簡單:他們可以經由單一通道來傳遞愈多的資訊,他們可以賺愈多的錢。DSP已經在許多領域中的電信產業發動革命:聲調(tone)訊號的產生及偵測,頻帶(frequency band)平移,為了移除電力線的嗡嗡聲(power line hum)的濾波動作(filtering),等等……。從電話網路中有三個特殊的例子在此會被討論:多路傳輸(multiplexing)、壓縮和回聲控制(echo control)。

多路傳輸(Multiplexing)

世界上大約有十億的電話。按下幾個鍵,交換網路允許在任何地方的任何人只要幾秒鍾就可以被連結起來。此項無限大(immensity)的任務讓人猶豫。直到1960時,介於二支電話間的連結需要經由機械的交換器和擴大器(amplifiers)來傳送類比聲音訊號。一個連結需要一對導線。比較起來,DSP將音訊轉換成序列數位資料串流。因為位元可以被輕易地編結(interwinded)並且稍後被分開,許多電話談話可以被在單一通道(channel)上傳送。例如,電話的標准已知為T-carier system,它可以同時傳送24個聲音訊號。每個聲音訊號使用8 bit companded(對數壓縮,logarithmic compressed)類比對數位的轉換來每秒抽樣8000次。每個聲音訊號中的結果被表成64,000 bits/sec,且所有的24個channel都包含在1.544 megabits/sec內。使用傳統的22 gauge銅制電話線,訊號可被傳送約6000英呎,典型的互相連接的距離。數位傳輸在財務上的優點很多。電線和類比交換器很貴,數位邏輯閘(digital logic gates)很便宜。

壓縮(Compression)

當聲音訊號以8000 samples/sec被數位化,大部份的數位資訊會是多餘的(rendant)。也就是說,由任何一個樣本承載的資訊會被鄰近的樣本大量地復制。數以打計的DSP演演算法已經被發展來轉換數位化的聲音訊號成需要較少bits/sec的資料串流。這些被稱作資料壓縮(data compression)演演算法。相對應的解壓縮(uncompression)演演算法則被用來回復訊號到它原本的型式。這些演演算法在進行壓縮的數目和結果的聲音品質上變化。一般而言,可將資料速率從64 kilobits/sec減少到32 kilobits/sec,而不損失聲音的品質。當壓縮成資料速率8 kilobits/sec時,聲音會明顯地被影響,不過仍然對長距離電話網路很有用。最長的可達到的壓縮約是2 kilobits/sec,導致高度扭曲的聲音,不過可用於一些應用,例如軍隊和海底通訊。

回聲控制(Echo control)

回聲在長距離電話連結中是一個嚴重的問題。當你對電話說話時,一個代表你的聲音的訊號傳導(travel)到連接的接收器上,其中部份的訊號會回傳,即為回聲(echo)。如果連結在數百英哩之內,用來接收回聲所花費的時間僅有幾毫秒(milliseconds)。人耳習慣於聽這些小的時間延遲的回聲,而連結似乎相當正常。當距離變得較長,回聲變得越來越顯著且惱人(irritating)。對於州際間的通訊,延遲可以是數百微秒,而且特別令人不愉快(objectionable)。數位訊號處理藉由量測傳回的訊號並產生適當的反訊號(antisignal)以消除煩擾的回聲,來著手處理此類的問題。同樣的技術讓喇叭擴音器使用者可以同時聽和說而沒有抗爭的(fighting)音訊回饋(長而尖的聲音, squealing)。它也可藉由數位產生的反噪音(anitnoise)來抵消它,以減少環境噪音。

音訊處理(Audio Processing)

人類的二大主要感官是視覺和聽覺。相對應地,許多DSP與影像及音訊處理相關。人們聽音樂和語言(語音)。DSP已經在這二大領域上有革命性的變化。

音樂(Music)

從音樂家的麥克風到愛玩高級音響的人的揚聲器的路徑是相當長的。數位資料表示法很重要,因為它會防止「一般和類比式儲存和處理相關」的降級。這對任何比較過卡帶和CD的音樂品質的人來講會很熟悉。在一般的情境(scenario)中音樂片段在錄音室(sound studio)中被錄起來在數個頻道或音軌(track)上。在某些情況下,這甚至包含各別錄制單獨的樂器和歌手。這麼做是為了給予聲音工程師在製作最後的成品時較大的彈性。組合各別的音軌到最後的成品的復雜過程被稱作mix down。DSP可以在mix down時,提供數種重要的功能,包括了:濾聲(filtering),訊號加和減,訊號編輯,等……。

譯註:把 X 聲道的 audio 混成 Y 聲道,其中 X 是大於 Y 的數字,例如說你的 DVD 上面是 5.1 聲道,但是你只有耳機,耳機只有雙聲道,所以就需要 mix down 成 2 channel,感謝Jedi提供解釋。

最有趣的DSP在音樂准備上的應用之一是人工余韻(artificial reverberation)。如果各別的頻道被簡單地加在一起,結果的片段聽起來渺茫無力(frail and diluted),很像是音樂家在戶外演奏。這是因為聽者被音樂的迴音或余韻的內容大大地影響了,而通常在錄音室內這些都被最小化了。DSP允許人造回聲和余韻在mix down時被加總以模擬各種理想的聆聽環境。有數百微秒延遲的回聲給予人像教堂般地點的印象。增加10-20微秒延遲的回聲讓人感覺在更適當大小的聆聽空間。

語音的產生(Speech generation)

語音的產生和辨識被用來作為人與機器間的溝通。並不是用你的手和眼,而是用你的嘴和耳。當你的手和眼應該做些別的事,例如:開車,開刀,或(不幸地)用武器對敵人開火時,這非常方便。對於電腦所產生的語音,會使用二個方法:數位錄音和聲道模擬(vocal tract simulation)。在數位錄音中,人聲被數位化並儲存,通常在一種壓縮表格(compressed form)里。在錄放時,儲存的資料被解壓縮並且被轉回到類比訊號。整整一小時錄下來的語音只需要大約3 megabytes來儲存,甚至在小電腦系統里也能。這是今日使用的、最常見的數位語音產生的方法。

聲道模擬(vocal tract simulation)更復雜,藉由人類建立語音的方法來試著模仿身體的(physical)機制。人類聲道模擬是由室內(chamber)的尺寸和形狀決定的具共鳴頻率(resonant frequency)的聲腔(acoustic cavity)。在比較上,摩擦音源於在狹窄的壓縮下嘈雜的空氣雜訊,就好像牙齒和嘴唇。聲道模擬藉由產生模仿這二種刺激(excitation)的數位訊號來運作。共鳴室(resonate chamber)的特性是經由具相似共振的數位濾波器來傳送刺激訊號來模擬。此方法被用於非常早期的DSP成功故事的其中一個,Speak & Spell是賣得很好的、給兒童的電子輔助學習器。

語音辨識(Speech recognition)

自動地人類語音辨識比產生語音更加地困難。語音辨識是人腦做的好,但數位電腦做的很差的經典範例。數位電腦可以儲存並且記得非常大量的資料,以極快的速度執行數學計算,並且做重覆的工作而不會厭煩或沒有效率。不幸地,當面對未加工的感知資料(raw sensory data)時,今日的電腦執行地非常差。教導電腦每月寄給你帳單很容易。教導同一台電腦去了解你的聲音是件大工程。

數位訊號處理一般在二個步驟中處理語音辨識問題:在特色配對(feature matching)之後做特色擷取(feature extraction)。

進入的音訊訊號中的每個字要先被隔離,然後分析以辨識刺激和共振頻率的類型。然後這些參數與之前說話的字的範例做比較以辨識出最接近的配對。常常,這些系統受限於只有幾百字,只能接受字與字間有可分辨的中斷的語音;且每個說話者需被個別再訓練。雖然這對許多商業應用是適當的,當與人類的聽力比較時,這些限制是簡陋的(humbling)。在此領域有很多工作要被完成,成功的商業性產品的那些人會有巨大的金錢上的獎賞。

回聲位置(Echo Location)

獲得關於遠端物件資訊的常見方法是彈出一個離開它的波(bounce a wave off of it)。例如,雷達藉由傳送無線電波的脈沖波,並且對每個從飛機回聲檢查接收到的訊號來運作。在聲納上,聲波經由水傳送以偵測潛水艇和其它水面下的物體。地球物理學家已經藉由設定長期爆破並聽取從岩石的深埋層(deeply buried layers of rock)的回聲來針測地球。雖然這些應用有共同的思路(thread),它們每個都有自個兒特定的問題和需求。數位訊號處理已經在三個領域中都已產生了革命性的變化。

雷達(Radar)

雷達(Radar)是 RAdio Detection And Ranging的首字縮寫。在最簡單的雷達系統里,無線電傳送器產生一個好幾微秒長的無線電頻率能量脈沖。此脈沖被餵進高度的指向天線(directional antenna),在那裡導致無線電波傳播(propagate)並以光速離開。在此波路徑上的飛機會反射回來一小部份的能量到位於傳送站附近的接收天線。到物體的距離由介於被傳送的脈沖和接收的回聲間花費的時間來計算。物體的方向更容易發現,當回聲被接收時,你知道你在哪裡指到指向天線(directional antenna)。

雷達系統的運作范圍由二個參數決定:初始脈沖內有多少能量,及無線電接收器的噪音水準。不幸地,要在脈沖波里增加能量通常需要更長的脈沖波。接著,較長的脈沖波減少正確性和消耗時間測度的精度。這導致了二個重要參數間的沖突:偵測遠距離物體的能力,和正確地決定物體的距離的能力。

DSP在三個領域有革命性的雷達,它們全都與基本問題相關。第一個,DSP可以在脈沖波被接收後壓縮它,提供較佳距離測定而不需減小其作業范圍。第二個,DSP可以過濾掉所接收的訊號來減少雜訊。這增加了范圍,而不用將距離測定降級。第三,DSP能夠快速選取並產生不同脈沖波形和長度。除了其它的(問題)外,這讓脈沖波對特定的偵測問題被最佳化。現在是令人印象深刻的部份:這裡面很多是由和所使用的無線電頻率差不多的抽樣率(sampling rate),約是數百megahertz!當它涉及雷達這方面時,DSP與高速硬體設計高度相關就和它與演演算法的關系一樣。

聲納(Sonar)

聲納是SOund NAvigation and Ranging的首字縮寫。它被分成二大類,主動式(active)和被動式(passive)。在主動式聲納中,介於2 kHz 和40 kHz 間的聲音脈沖波被傳送到水裡,而結果的回聲被偵測和分析。使用主動式聲納包含:偵測和定位水面下的物體、航海、通訊和映射(mapping)到海底(sea floor)。一般最大操作范圍是10到100公里。與其相比,被動式聲納只聆聽海面下的聲音,包含:自然的亂流(turbulence)、海洋生物和從潛艇和表面船艦發出的機械聲。因為被動式聲納沒有消除能量,它對於轉換作業而言很理想。你想要偵測其它人(the other guy),而不要他偵測你。被動式聲納最重要的應用是軍事監視(surveillance)系統,它偵測並追蹤潛水艇。被動式聲納一般使用比主動式聲納較低的頻率,因為它們經由水以較少的吸收作用被傳播(propagate)。偵測范圍可達到數千公里。

DSP在聲納方面已經與雷達方面有許多相同的領域都有革命性的發展:脈沖波的產生、脈沖波壓縮和過濾偵測到的訊號。有個聲納比雷達簡單的觀點:因為包含了較低的頻率。另一個觀點是,聲納比雷達更難,因為環境較不一致也較不穩定。聲納系統通常使用昂貴的陣列來傳送和接收元素,而不是只有單一個頻道。藉由適當地控制和混合這許多元素的訊號,聲納系統可以指引被消除的脈沖波到想要的位置並且決定迴音被接收的方向。要處理這許多的頻道,聲納系統需要與雷達同樣大規模的DSP運算能力。

反射地震學(Reflection seismology )

大約是1920年代早期,地球物理學家發現地球外殼的結構可以用聲音來探測。探勘者可以引爆並從在表面下超過十公里的邊界層(boundary layer)紀錄回聲。這些回聲震動圖(seismograms)由肉眼解讀來對應到次表面(subsurface)的結構。反射地震法(reflection seismic method)很快地變成主要確定石油和礦藏位置的方法,且直到今日仍是。

在理想的情況下,傳送到地面的聲音脈沖波從每個脈沖波經過的邊界層產生一個回聲。不幸地,情況通常不會這麼簡單。每一個傳回到地表的回聲必須經過所有其它上面(它源自的)邊界層。這會導致回聲在層與層之間跳躍,產生回聲的回聲在表面被偵測到。這些次要的回聲可以使被偵測的訊號非常地復雜和難以解讀。自從1960年代,數位訊號處理已經被廣泛地運用來從反射震動圖(reflection seismograms)中的次要回聲隔離主要的回聲。早期的地球物理學家如何在沒有DSP的情況下處理?答案很簡單:他們看簡單的地方,在那裡多重反射被最小化。DSP允許原油在困難的位置被發現,例如在海的下方。

影像處理(Image Processing)

影像是具有特性的訊號。首先,它們是空間(距離)上參數的測度,雖然大部份訊號是時間參數的測度。第二,它們包含很多資訊。例如,可能需要超過10 megabytes來儲存二分之一的電視錄影。這比一個相似長度的聲音訊號大了超過1000倍。第三,最終品質的判斷通當會受限於人類的評估,而非客觀存在的評斷標准。這些特性已經使得影像處理變成DSP內不同的子群組。

醫療的(Medical)

在1895年,Wilhelm Conrad R?ntgen發現了X光可穿透相當數量的實際物體。醫學藉由可以看到活生生的人體內而有了革命性的進步。醫療用X光系統只在幾年內便散布全球。盡管它明顯的成功,直到DSP及相關技術在1970年出現之前,醫療用X光影像一直受限於四個問題。笫一,人體內重疊的結構可以藏在另一個之後。例如,在肋骨後方的部份心藏可能無法被看見第二,並不總是能區分相似的組織(tissue)。例如,可能可以從軟組織分開骨頭,不過不能從肝藏分辨腫瘤。第三,X光影像顯示解剖結構(anatomy),身體的結構,而不是生理學,身體的運作。活人的X光影像看起來就像是死人的X光影像!第四,曝露在X光下會引起癌症,需要謹慎地(sparingly)且只能在有適當的理由時才能使用它。

重疊結構的問題在1971年引入第一台計算式斷層攝影法(computed tomography)掃描器被解決了(正式地名稱是computed axial tomography或CAT 掃描器)。計算式斷層攝影法(CT)是一經典的數位訊號處理的例子。從許多方向的X光會穿透病人被檢查時的身體各部份(section)。並非簡單地以偵測到的X光形成影像,而是訊號被轉成數位資料並儲存在電腦中。然後此資訊被用於計算要顯示為身體各切片(slice)的影像。這些影像比傳統的技術顯示更多的細節,允許值得注目地更好的檢測和治療。CT的影響幾乎和原本引入X光影像本身一樣大。在幾年之內,世界上的每家大醫院都已經使用CT掃描器了。在1979年時, CT原理的貢獻者中其中的二位,Godfrey N. Hounsfield 和 Allan M. Cormack,共享了諾貝爾醫學獎(Nobel Prize in Medicine)。那是好DSP!

最後的三個X光問題已經藉由使用不是X光的穿透性能源(penetrating energy)被解決了,例如無線電和聲波。DSP在所有這些技術中扮演一個關鍵的角色。例如,核磁共振影像(Magnetic Resonance Imaging,MRI)使用磁場連結無線電波來探測人體的內部。適當地調整磁場強度和頻率讓在身體區域范圍內的原子核可以介於量子能源狀態間共振。此共振導致次要的無線電波放射,由放在靠近身體的天線偵測。這個偵測到的訊號的強度和其它特性提供了關於共振局部區域的資訊。磁場的調整讓被經此身體掃描的共振區域對應到內部的結構。此資訊通常被表示成影像,就像是計算式斷層攝影般。除了提供介於不同類型軟組織間傑出的辨識外,MRI可以提供關於生理學(physiology)的資訊,例如經由動脈的血液流。MRI完全依賴數位訊號處理技術,沒有它們無法被實作。

外太空(Space)

有時候,你只是必須把一張爛相片弄到最好。這情況屢次都是因為影像從無人管理的衛星和太空探索火箭拍的。沒有人會送一個修理工到火星只是去扭轉像機的旋鈕!DSP可以用數種方法來增進在非常不適宜的情況下所拍的影像的品質,它們是:亮度和對比調整,邊界偵測,雜訊減少,焦點調整,動作模糊減少,等……。有空間扭曲的影像,例如拍攝球面星球的平面影像所遇到的,可以被變形(warped)成一種正確的表示法。許多各別的影像可以被結合成單一的資料庫,讓資訊以唯一的方式被顯示。例如,一個電視影像序列模擬飛機在不同星球的表面飛行。

商業化的影像產品(Commercial Imaging Procts)

對於在大量出售給大眾的系統而言,在影像內大量的資訊內容是個問題。商業化的系統必須要便宜,且這不是大量記憶體和高度資料傳輸速率配合的結果。一個對此定理的解答是影像壓縮(image compression)。就好像聲音訊號,影像包含極大數目的多餘資訊,且可經由減少「需要用來表示的bits數目」的演演算法來回傳。電視和其它動作片尤其適合壓縮,因為大部份的影像從一個frame到另一個frame仍舊是一樣的。商業化的影像處理軟體利用此技術,包含了:視訊電話、顯示移動中圖片的電腦程式和數位電視。

③ DSP的 學習 要那些 基礎 知識

信號與系統, 復變函數, 線性代數,數字信號處理。 還有一些編程技巧。如果學會matlab,在dsp的應用模擬中是很有用的!!
加油!!

④ 請問在編寫DSP程序時,數學函數如:sprt這種開方的,需要定義什麼頭文件嗎

如何使用STM32F4的DSP庫

我們平常所使用的CPU為定點CPU,意思是進行整點數值運算的CPU。當遇到形如1.1+1.1的浮點數運算時,定點CPU就遇到大難題了。對於32位單片機,利用Q化處理能發揮他本身的性能,但是精度和速度仍然不會提高很多。

現在設計出了一個新的CPU,叫做FPU,這個晶元專門處理浮點數的運算,這樣處理器就將整點數和浮點數分開來處理,整點數交由定點CPU處理而浮點數交由FPU處理。我們見到過TI的DSP,還有STM32F4系列的帶有DSP功能的微控制器。前者筆者沒有用過,不作評論,而後者如果需要用到FPU的浮點運算功能,必須要進行一些必要的設置。

首先,由於浮點運算在FPU中進行,所以首先應該使能FPU運行。在system_init()中,定義__FPU_PRESENT和__FPU_USED

/* FPU settings------------------------------------------------------------*/

#if (__FPU_PRESENT == 1)&& (__FPU_USED == 1)

SCB->CPACR |= ((3UL<< 10*2)|(3UL << 11*2)); /*set CP10 and CP11 Full Access */

#endif

這樣就使能了FPU。

對於上述改變,當程序中出現這種簡單的加減乘除運算FPU就起作用了。但是對於復雜的如三角運算、開方運算等,我們就需要加入math.h頭文件。但是如果單純的加入他,那麼Keil會自動調用內部的math.h,該頭文件是針對ARM處理器的,專門用於定點CPU和標准演算法(IEEE-754)。對於使用了FPU的STM32F4是沒有任何作用的。所以,需要將math.h換成ST的庫,即arm_math.h。在該頭文件中,涉及到另一個文件core_cmx.h(x=0、3、4),當然了,如同STM32F1系列一樣,在工程中加入core_cm4.h即可。

到這里,算是全部設置完畢,之差最後一步,調用!但是別小看了這一步,因為如果調用的不正確,全面的設置就白費了。在使用三角函數如sin()、cos()時不要直接寫如上形式,因為他們函數的名字來自於math.h,所以你調用的仍舊是Keil庫中的標准math.h。要使用arm_math.h中的arm_sin_f32()函數(見Line.5780,原函數見DSP_Lib\Source\FastMathFunctions),可以看到他利用的是三次樣條插值法快速求值(見Line.263 /* Cubic interpolation process */)。

注意一下例外函數,sqrt(),在arm_math.h中為arm_sqrt_f32()。使用他的時候需要同時開啟#if(__FPU_USED == 1) && defined ( __CC_ARM )才行,切記!還可以發現開方函數還有q15和q31之分,我想他們的區別就是精度的問題,但是他們沒有應用FPU來計算,說白了就是利用0x5f3759df這個數進行快速開方

⑤ 如何在VDSP下生成和調用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的調度策略就十分合理.
RTOS要說的內容太多,我只能講一下自己的一點體會吧
DSP與正(余)弦波
在DSP的應用中,我們經常要用到三角函數,或者合成一個正(余)弦波.這是因為我們喜歡把信號通過傅立葉變換映射到三角函數空間來理解信號的頻率特性.信號處理的一些計算技巧都需要在DSP軟體中進行三角函數計算.然而三角函數計算是非線性的計算,DSP並沒有專門的指令來求一個數的正弦或餘弦.於是我們需要用線性方法來近似求解.
一個直接的想法是用多項式擬合,這也正是大多數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程序中,我們可以通過用乘加(MAC)指令計算這個多項式來近似求得sin(x)

當然如果用定點DSP還要把P這個多項式系數表用一定的Q值來改寫成定點數.
這樣的三角函數計算一般都需要幾十個cycle 的開銷.這對於某些場合是不能容忍的
另一種更快的方法是藉助於查表,比如,我們將[0,pi/2]分成32個區間,每個區間長度就為pi/64,在每個區間上我們使用直線段擬合sin曲線,每個區間線段起點的正弦值和線段斜率事先算好,存在RAM里,這樣就需要在在RAM里存儲64個
常數:
32個起點的精確的正弦值(事先算好): s[32]={0,sin(pi/64),sin(pi/32),sin(pi/16)....}
32個線段的斜率: f[32]={0.049,.....}
對於輸入的每一個x,先根據其大小找到所在區間i,通常x用定點表示,一般取其高幾位就是系數i了,然 後通過下式即可求出sin(x):
sin(x)= s*f
這樣一般只需幾個CYCLE就可以算出正弦值,如果需要更高的精度,可以將區間分得更細,當然,也就需 要更多的RAM去存儲常數表.
事實上,不僅三角函數,其他的各種非線性函數都是這樣近似計算的.
1. 接觸DSP
在參加過一次社會上多的盡乎到了泛濫地步的"DSPxxx"培訓班之後,我"自信"已經具備DSP工師資格,便欣喜若狂跑道書店買了一本名為"DSP xxx應用"的書,作者叫xxx,並且是這個領域的牛人,這本書確實是很出色的書籍.但是當時,對於我這個對DSP一竅不通、剛剛入門的人來說卻建立了一個錯誤的概念--DSP是個很容易的領域,只要培訓一下,再稍微看看書,就可以成為專家.所以,現在看來,這些都是誤導,我認為學習DSP技術應該分為兩個階段,第一階段學習DSP技術基礎概念;第二階段學習DSP技術的行業應用.那本"DSP xxx應用"的書,它更適合書名應叫做"DSP中的數學或物理運用"...什麼的.

2. 購買DSP學習套件
有了興趣,就要去學習,於是我攛掇領導批准購買了DSP學習入門套件(DSK),許多公司均有銷售,如TI等,大概是需要3000-4000人民幣.買後不久,我就發現,這種套件對於我來說一點用處都沒有.因為我的基礎知識實在是太差了.這些套件對於我來說,只是另一種涵義的PC機及一些外圍設備,想要懂的這些東西,我就需要去讀更多的相關書籍,這時,很難沒有想要放棄的念頭,我開始有點畏懼DSP這種技術,門檻太高了.可是,我不能放棄,我已經投入了許多的金錢和時間,我不想丟掉這4000元錢,也不能對領導沒有交待.事實上,我沒有想到,我將付出更多的錢和時間去學習.
3. 再次參加培訓班,再次購買DSP書籍
在我就感到了無助,困惑之際.我又想到了放棄.雖然我的數學還算不錯,但其中遇到的一些問題在我思考後,還是無法解決,我越來越畏懼DSP了.於是,我開始在"google"上搜索DSP培訓相關的信息,終於發現聞亭公司"DSP培訓中心"的教程和內容正是我一直尋找的東西.也許是DSP技術對我的有著巨大的誘惑力,也許是我的之直著,我又一次勇敢的報名參加了培訓.32個課時之後,解決了我半年多來積累的很多粗淺的問題.再翻開培訓教材剛剛復讀了第一章時,我想如果這本教材是我讀到的第一本書,並且我沒有花4000元買那個可*的學習套件,我會毫不猶豫的投降,放棄學習DSP,但.......那個可*的xxx作者,他的書怎麼可以用作教學呀.他的書雖然讓我對DSP產生了濃厚的興趣,卻把我引到了一條艱難的路上,而且花了那麼多的冤枉錢....既然事已如此,我只有慢慢的去讀這些書籍,在我讀到教材的後面章節以後,我開始明白前面章節的內容,所以當你讀書遇到不明白的時候,千萬不要氣餒.有時,一個內容,可能需要讀上幾遍,才能明白,這比一開始的感覺要好的多了.
4. 實驗--至關重要的一步
現在,從你的架子上取下那套DSK,去嘗試做一些小實驗,我的第一個實驗是"正弦發生器",這個實驗比較簡單,但是它也花費了我幾周的時間去讀大量的關於串口、編碼、寄存器等的書並且進行大量的實驗.這個執行半小時的"正弦發生器",讓我查閱了恨不得夠組建一個圖書館的書籍,而且這個東西沒有任何用途.我是用匯編語言在54x中執行,這個實驗讓我很好的理解了什麼是DSP,什麼是McBSP, DMA, 等.當然問題也同步產生了,我就又不得不做了許多的實驗去驗證.我建議,在系統未定型之前,使用mathlab/simulink進行模擬,並且可以多實驗幾種晶元,這樣可以讓你明白更多的內容.我覺得我就要成為一個真正的DSP工程師了,我度過了最困難的時期.我覺得自己是個英雄,嘿嘿.
5. 去尋找一份與DSP相關的工作,去當個DSP工程師
我希望困難已經過去,但這種願望為時過早了.在DSP的研究中,我還遇到了很多的困難,由於篇幅有限,我就不在進行描述了.反正,如果想成為真正的DSP專家,就不要期望事情會變得容易.有些DSP開發人員並不知道什麼是真正的0和1,他們只會查閱各種參考書籍和參數表,我們並不提倡這種做法.因為這些人選擇了一種簡單的做法,但是他們並不是真正的DSP開發人員.他們只是編寫一些他們不理解的代碼,他們似乎在擔當著一台"編碼器"的角色.
6. 總結
這篇文章只是我的一點感慨,可能並不是很適用現在的DSP開發工程師,因為,市面上已經有了供你學習的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的調度策略就十分合理。
RTOS要說的內容太多,我只能講一下自己的一點體會吧

DSP與正(余)弦波

在DSP的應用中,我們經常要用到三角函數,或者合成一個正(余)弦波。這是因為我們喜歡把信號通過傅立葉變換映射到三角函數空間來理解信號的頻率特性。信號處理的一些計算技巧都需要在DSP軟體中進行三角函數計算。然而三角函數計算是非線性的計算,DSP並沒有專門的指令來求一個數的正弦或餘弦。於是我們需要用線性方法來近似求解。
一個直接的想法是用多項式擬合,這也正是大多數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程序中,我們可以通過用乘加(MAC)指令計算這個多項式來近似求得sin(x)
當然如果用定點DSP還要把P這個多項式系數表用一定的Q值來改寫成定點數。
這樣的三角函數計算一般都需要幾十個cycle 的開銷。這對於某些場合是不能容忍的。
另一種更快的方法是藉助於查表,比如,我們將[0,pi/2]分成32個區間,每個區間長度就為pi/64,在每個區間上我們使用直線段擬合sin曲線,每個區間線段起點的正弦值和線段斜率事先算好,存在RAM里,這樣就需要在在RAM里存儲64個
常數:
32個起點的精確的正弦值(事先算好): s[32]={0,sin(pi/64),sin(pi/32),sin(pi/16)....}
32個線段的斜率: f[32]={0.049,.....}
對於輸入的每一個x,先根據其大小找到所在區間i,通常x用定點表示,一般取其高幾位就是系數i了,然 後通過下式即可求出sin(x):
sin(x)= s[i]*f[i]
這樣一般只需幾個CYCLE就可以算出正弦值,如果需要更高的精度,可以將區間分得更細,當然,也就需 要更多的RAM去存儲常數表。
事實上,不僅三角函數,其他的各種非線性函數都是這樣近似計算的。

⑦ 如何學好DSP及DSP基本知識普及

信號與系統, 復變函數, 線性代數,數字信號處理。 還有一些編程技巧。如果學會matlab,在dsp的應用模擬中是很有用的!!
加油!!

⑧ 學dsp是不是需要一定的數電和模電基礎

學DSP最好有單片機基礎,是在沒做過也無所謂,DSP晶元就相當於一片大的單片機,將部分外設集成到一塊晶元上而已,若是想從事晶元開發必須掌握數電模電,如果只是平時的學習,重點學習晶元埠\時序\外設部分即可.編程最好要有C語言基礎,所以學習DSP之前熟練掌握單片機原理和C編程技巧的話你會得心應手,無需模電數電。個人意見即供參考

熱點內容
風險防控平台伺服器地址是什麼 發布:2025-03-20 11:59:04 瀏覽:231
什麼為有效wifi密碼 發布:2025-03-20 11:57:22 瀏覽:704
聯發科安卓哪個好 發布:2025-03-20 11:56:26 瀏覽:356
看門狗ce腳本 發布:2025-03-20 11:53:41 瀏覽:476
linuxcrypto 發布:2025-03-20 11:44:35 瀏覽:516
win7縮略圖緩存 發布:2025-03-20 11:31:30 瀏覽:69
c2c是什麼文件夾 發布:2025-03-20 11:30:45 瀏覽:687
交管12123的登錄密碼哪裡找 發布:2025-03-20 11:25:50 瀏覽:379
編程技術大牛 發布:2025-03-20 11:21:21 瀏覽:588
315演算法 發布:2025-03-20 11:15:35 瀏覽:213