第7章應(yīng)用程序設(shè)計(jì)PPT課件_第1頁(yè)
第7章應(yīng)用程序設(shè)計(jì)PPT課件_第2頁(yè)
第7章應(yīng)用程序設(shè)計(jì)PPT課件_第3頁(yè)
第7章應(yīng)用程序設(shè)計(jì)PPT課件_第4頁(yè)
第7章應(yīng)用程序設(shè)計(jì)PPT課件_第5頁(yè)
已閱讀5頁(yè),還剩104頁(yè)未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、DSPDSP原理與應(yīng)用原理與應(yīng)用第第7章章 應(yīng)用程序設(shè)計(jì)應(yīng)用程序設(shè)計(jì)1n任課教師:n網(wǎng)站: http:/ http:/nTMS320C55x Assembly Language Tools Users Guide (SPRU280H, 2002年年)nTMS320C55x DSP Mnemonic Instruction Set Reference Guide (SPRU374G, 2002年年)2第第7章章 應(yīng)用程序設(shè)計(jì)應(yīng)用程序設(shè)計(jì)內(nèi)容提要:內(nèi)容提要:n7.1 定標(biāo)與溢出處理定標(biāo)與溢出處理n7.2 基礎(chǔ)算術(shù)運(yùn)算基礎(chǔ)算術(shù)運(yùn)算n7.3 FIR濾波器濾波器n7.4 IIR濾波器濾波器n7.5 快速

2、傅里葉變換快速傅里葉變換(FFT)n7.6 DSPLIB的使用的使用37.1定標(biāo)與溢出處理定標(biāo)與溢出處理n7.1.1 數(shù)的定標(biāo)數(shù)的定標(biāo)n7.1.2 溢出的處理方法溢出的處理方法n7.1.3 常用信號(hào)處理算法中的定標(biāo)方法常用信號(hào)處理算法中的定標(biāo)方法47.1.1 數(shù)的定標(biāo)數(shù)的定標(biāo)l小數(shù)定標(biāo)的概念小數(shù)定標(biāo)的概念u設(shè)定一個(gè)設(shè)定一個(gè)16位數(shù)的小數(shù)點(diǎn)處于該數(shù)中的哪一位位數(shù)的小數(shù)點(diǎn)處于該數(shù)中的哪一位;u可以表示不同大小和不同精度的小數(shù)可以表示不同大小和不同精度的小數(shù);lQ表示法表示法u表表7-1列出了一個(gè)列出了一個(gè)16位數(shù)的位數(shù)的16種種Q表示及它們表示及它們所能表示的十進(jìn)制數(shù)值范圍。所能表示的十進(jìn)制數(shù)值范

3、圍。5計(jì)算機(jī)有兩種數(shù)據(jù)表示方法:計(jì)算機(jī)有兩種數(shù)據(jù)表示方法: 定點(diǎn)數(shù)定點(diǎn)數(shù)表示法表示法 浮點(diǎn)數(shù)浮點(diǎn)數(shù)表示法表示法定點(diǎn)數(shù)定點(diǎn)數(shù)就是小數(shù)點(diǎn)位置固定的數(shù)。數(shù)據(jù)的表示形式是:就是小數(shù)點(diǎn)位置固定的數(shù)。數(shù)據(jù)的表示形式是:67.1.1 數(shù)的定標(biāo)數(shù)的定標(biāo) 符號(hào)位符號(hào)位 整數(shù)部分整數(shù)部分. .小數(shù)部分小數(shù)部分C55x DSPC55x DSP是定點(diǎn)芯片是定點(diǎn)芯片,采用補(bǔ)碼形式來表示無符號(hào),采用補(bǔ)碼形式來表示無符號(hào)數(shù)和有符號(hào)數(shù)。數(shù)和有符號(hào)數(shù)。 CPU在執(zhí)行指令時(shí),并不知道處理的數(shù)據(jù)是整數(shù)在執(zhí)行指令時(shí),并不知道處理的數(shù)據(jù)是整數(shù)還是小數(shù),也不能指出小數(shù)點(diǎn)的位置。在編程時(shí)必還是小數(shù),也不能指出小數(shù)點(diǎn)的位置。在編程時(shí)必須由程

4、序員須由程序員指出一個(gè)數(shù)的小數(shù)點(diǎn)處于哪一位指出一個(gè)數(shù)的小數(shù)點(diǎn)處于哪一位,這就,這就是是定標(biāo)定標(biāo)(scale)的概念。的概念。 常用的定標(biāo)方法是常用的定標(biāo)方法是Q表示法表示法, Q表示法用表示法用Q0, Q1, Qi, , Q15 分別表示小數(shù)點(diǎn)在分別表示小數(shù)點(diǎn)在D0位之后位之后、D1位之位之后、后、Di位之后、位之后、D15位之后位之后。 74.5 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)嚴(yán)格地嚴(yán)格地, 是是Qm.n 格式格式: n位小數(shù)位小數(shù), m位整數(shù)位整數(shù), 1位位符符號(hào)位號(hào)位, 共共m+n+1位二進(jìn)制數(shù)。位二進(jìn)制數(shù)。表7-1 Q表示及數(shù)值范圍Q表示表示 小數(shù)點(diǎn)位置小數(shù)點(diǎn)位置整數(shù)位整數(shù)位 小數(shù)位

5、小數(shù)位十進(jìn)制表示范圍十進(jìn)制表示范圍精度精度-冪冪Q15在在D15之后之后015-10.99996952 -158Q13在在D13之后之后213-43.99987792 -13Q12在在D12之后之后312-87.99975592 -12Q11在在D11之后之后411-1615.99951172 -11Q10在在D10之后之后510-3231.99902342 -10Q9在在D9之后之后69-6463.998043752 -9Q8在在D8之后之后78-128127.99609382 -8Q7在在D7之后之后87-256255.99218752 -7Q6在在D6之后之后96-512511.9804

6、3752 -6Q5在在D5之后之后105-10241023.968752 -5Q4在在D4之后之后114-20482047.93752 -4Q3在在D3之后之后123-40964095.8752 -3Q2在在D2之后之后132-81928191.752 -2Q1在在D1之后之后141-1638416383.52 -1Q0在在D0之后之后150-32768367672 0Q14在在D14之后之后114-21.99993902 -14表表7-1 Q表示及數(shù)值范圍表示及數(shù)值范圍Q表示十進(jìn)制數(shù)X表示范圍Q15-1X0.9999695Q14-2X1.9999390Q13-4X3.9998779Q12-8

7、X7.9997559Q11-16X15.9995117Q10-32X31.9990234Q9-64X63.9980469Q8-128X127.9960938Q7-256X255.9921875Q6-512X511.9804375Q5-1024X1023.96875Q4-2048X2047.9375Q3-4096X4095.875Q2-8192X8191.75Q1-16384X16383.5Q0-32768X327679l不同的不同的Q所表示的數(shù)不僅范圍不同所表示的數(shù)不僅范圍不同, 而且精度也不相同而且精度也不相同:uQ越大越大, 數(shù)值范圍越小數(shù)值范圍越小, 但精度越高但精度越高;uQ越小越小,

8、 數(shù)值范圍越大數(shù)值范圍越大,但精度就越低但精度就越低;例如例如: Q0數(shù)值范圍是數(shù)值范圍是-32768到到+32767,其精度為其精度為1; Q15的數(shù)值范圍為的數(shù)值范圍為-1到到0.9999695, 精度為精度為 1/32768 = 0.00003051對(duì)定點(diǎn)數(shù)而對(duì)定點(diǎn)數(shù)而言言, , 數(shù)數(shù)值范圍與精度是一對(duì)矛盾。一個(gè)變量值范圍與精度是一對(duì)矛盾。一個(gè)變量要想能夠表示比較大的數(shù)值范要想能夠表示比較大的數(shù)值范圍圍, , 必必須以犧牲精度為代須以犧牲精度為代價(jià)價(jià); ; 而而想提高精想提高精度度, , 則則數(shù)的表示范圍就相應(yīng)地減小數(shù)的表示范圍就相應(yīng)地減小。在在實(shí)際的定點(diǎn)算法中,應(yīng)該根據(jù)具體問題進(jìn)行折衷

9、處實(shí)際的定點(diǎn)算法中,應(yīng)該根據(jù)具體問題進(jìn)行折衷處理理, , 以達(dá)到最佳效果。以達(dá)到最佳效果。10l在在C55x中中, 16位整數(shù)采用補(bǔ)碼形式表示。每個(gè)采用位整數(shù)采用補(bǔ)碼形式表示。每個(gè)采用Qi定標(biāo)定標(biāo)的的16位數(shù)用位數(shù)用1個(gè)符號(hào)位、個(gè)符號(hào)位、i個(gè)小數(shù)位和個(gè)小數(shù)位和15-i個(gè)整數(shù)位來表示個(gè)整數(shù)位來表示。11.表表7-2 同樣的數(shù)在不同定標(biāo)方式下所表示的具體數(shù)值同樣的數(shù)在不同定標(biāo)方式下所表示的具體數(shù)值l同樣一個(gè)同樣一個(gè)16位數(shù),位數(shù),若小數(shù)點(diǎn)設(shè)定的位置不同若小數(shù)點(diǎn)設(shè)定的位置不同,它,它所表示的數(shù)也就不同。所表示的數(shù)也就不同。Q格式 十六進(jìn)制數(shù)二進(jìn)制數(shù)十進(jìn)制數(shù)Q02000H0010 0000 0000

10、0000b8192Q142000H0010 0000 0000 0000b0.5Q152000H0010 0000 0000 0000b0.25Q0E000H1110 0000 0000 0000b-8192Q14E000H1110 0000 0000 0000b-0.5Q15E000H1110 0000 0000 0000b-0.2512定標(biāo)不同定標(biāo)不同.7.1.2 溢出的處理方法溢出的處理方法l如果算術(shù)運(yùn)算結(jié)果超出寄存器所能表示的最大如果算術(shù)運(yùn)算結(jié)果超出寄存器所能表示的最大數(shù)就會(huì)出現(xiàn)溢出數(shù)就會(huì)出現(xiàn)溢出;u因?yàn)橐驗(yàn)?6位定點(diǎn)位定點(diǎn)DSP的動(dòng)態(tài)范圍有限,所以在使的動(dòng)態(tài)范圍有限,所以在使用時(shí)必須

11、注意動(dòng)態(tài)范圍以防溢出用時(shí)必須注意動(dòng)態(tài)范圍以防溢出;l溢出還與輸入信號(hào)的特性和運(yùn)算法則有關(guān)溢出還與輸入信號(hào)的特性和運(yùn)算法則有關(guān) 。1. 溢出溢出13 C55x有以下幾種硬件特性可以處理溢出:有以下幾種硬件特性可以處理溢出:l保護(hù)位保護(hù)位 C55x的每個(gè)的每個(gè)累加器都有累加器都有8個(gè)保護(hù)位個(gè)保護(hù)位(3932位位),允許連續(xù)允許連續(xù)256次乘加操作而累加器不溢出次乘加操作而累加器不溢出;l溢出標(biāo)志位溢出標(biāo)志位 C55x的每個(gè)的每個(gè)累加器都有相關(guān)的溢出標(biāo)志位累加器都有相關(guān)的溢出標(biāo)志位, 當(dāng)累當(dāng)累加器操作結(jié)果出現(xiàn)溢出時(shí)加器操作結(jié)果出現(xiàn)溢出時(shí),這個(gè)標(biāo)志位就會(huì)置位。這個(gè)標(biāo)志位就會(huì)置位。2. C55x的溢出處

12、理機(jī)制的溢出處理機(jī)制14l飽和方式位飽和方式位SATD和和SATAuSATD控制控制D單元的操作單元的操作, SATA控制控制A單元的操作。單元的操作。u若若SATD=1, 當(dāng)當(dāng)D單元發(fā)生溢出時(shí)單元發(fā)生溢出時(shí), 對(duì)對(duì)D單元結(jié)果進(jìn)單元結(jié)果進(jìn)行飽和處理。不管飽和方式位值是什么行飽和處理。不管飽和方式位值是什么, 當(dāng)累加器發(fā)當(dāng)累加器發(fā)生溢出時(shí)生溢出時(shí), 相應(yīng)溢出標(biāo)志位相應(yīng)溢出標(biāo)志位(ACOVx)都會(huì)被置位都會(huì)被置位;uA單元沒有溢出標(biāo)志位單元沒有溢出標(biāo)志位, 但如果但如果SATA=1, 發(fā)生溢出發(fā)生溢出時(shí)時(shí), 結(jié)果也會(huì)結(jié)果也會(huì)進(jìn)行飽和處理進(jìn)行飽和處理。 飽和處理是用最近的邊界值代替溢出結(jié)果。飽和處理

13、是用最近的邊界值代替溢出結(jié)果。例例, 16, 16位寄存位寄存器范器范圍是圍是8000h(8000h(最最小負(fù)小負(fù)數(shù)數(shù)) )7FFFh(7FFFh(最最大正大正數(shù)數(shù)), ), 飽飽和處理就和處理就是是: : 用用7FFFh7FFFh代替比代替比7FFFh7FFFh大的結(jié)大的結(jié)果果; ; 用用8000h8000h代替比代替比8000h8000h小的結(jié)果。小的結(jié)果。15l飽和飽和。飽和是一種處理溢出的方法,但是飽和會(huì)剪掉。飽和是一種處理溢出的方法,但是飽和會(huì)剪掉部分輸出信號(hào),可能會(huì)引起信號(hào)失真和引起系統(tǒng)非線部分輸出信號(hào),可能會(huì)引起信號(hào)失真和引起系統(tǒng)非線性。性。l輸入定標(biāo)輸入定標(biāo)scaling。分析

14、所要使用的系統(tǒng),假定最壞。分析所要使用的系統(tǒng),假定最壞的情況,然后對(duì)輸入信號(hào)定標(biāo),以防止溢出。但是這的情況,然后對(duì)輸入信號(hào)定標(biāo),以防止溢出。但是這種方法會(huì)極大地降低輸出信號(hào)的精確度。種方法會(huì)極大地降低輸出信號(hào)的精確度。l固定定標(biāo)固定定標(biāo)scaling。假定最壞情況。假定最壞情況,對(duì)中間結(jié)果定標(biāo)。對(duì)中間結(jié)果定標(biāo)。這種方法可防止溢出這種方法可防止溢出, 同時(shí)增加了系統(tǒng)的信噪比。同時(shí)增加了系統(tǒng)的信噪比。l動(dòng)態(tài)定標(biāo)動(dòng)態(tài)定標(biāo)scaling。可以監(jiān)測(cè)中間結(jié)果的范圍,只在。可以監(jiān)測(cè)中間結(jié)果的范圍,只在需要的時(shí)候?qū)χ虚g結(jié)果定標(biāo)。這種方法可以防止溢出需要的時(shí)候?qū)χ虚g結(jié)果定標(biāo)。這種方法可以防止溢出但會(huì)增加計(jì)算量。

15、但會(huì)增加計(jì)算量。3. 溢出的處理方法溢出的處理方法167.1.3 常用信號(hào)處理算法中的定標(biāo)方法常用信號(hào)處理算法中的定標(biāo)方法lFIR濾波器的定標(biāo)濾波器的定標(biāo)scaling方法方法u在在FIR濾波器中處理溢出的最好方法是設(shè)計(jì)時(shí)使濾濾波器中處理溢出的最好方法是設(shè)計(jì)時(shí)使濾波器的增益小于波器的增益小于1,這樣就不需要對(duì)輸入信號(hào)定標(biāo)。,這樣就不需要對(duì)輸入信號(hào)定標(biāo)。這種方法和累加器的保護(hù)位結(jié)合起來,可以有效這種方法和累加器的保護(hù)位結(jié)合起來,可以有效地防止溢出。地防止溢出。u由于對(duì)信號(hào)處理的負(fù)面影響,在由于對(duì)信號(hào)處理的負(fù)面影響,在FIR濾波器中不使濾波器中不使用固定定標(biāo)和輸入定標(biāo)。如果不考慮計(jì)算量,在用固定定

16、標(biāo)和輸入定標(biāo)。如果不考慮計(jì)算量,在FIR濾波器中可以使用動(dòng)態(tài)定標(biāo)。對(duì)一些類型的音濾波器中可以使用動(dòng)態(tài)定標(biāo)。對(duì)一些類型的音頻信號(hào),飽和處理也是一種常用的方法。頻信號(hào),飽和處理也是一種常用的方法。17lIIR濾波器的定標(biāo)濾波器的定標(biāo)scaling方法方法uIIR濾波器的定點(diǎn)實(shí)現(xiàn)推薦使用多個(gè)二階基本節(jié)濾波器的定點(diǎn)實(shí)現(xiàn)推薦使用多個(gè)二階基本節(jié)級(jí)聯(lián)組成,這樣可以減小高階濾波器頻率響應(yīng)靈級(jí)聯(lián)組成,這樣可以減小高階濾波器頻率響應(yīng)靈敏度。由于濾波器系數(shù)的量化引入誤差,因此避敏度。由于濾波器系數(shù)的量化引入誤差,因此避免溢出對(duì)免溢出對(duì)IIR濾波器非常重要。濾波器非常重要。u可以通過把中間結(jié)果保存在處理器累加器來避免

17、可以通過把中間結(jié)果保存在處理器累加器來避免節(jié)間數(shù)據(jù)溢出。為防止在第節(jié)間數(shù)據(jù)溢出。為防止在第k階內(nèi)部發(fā)生數(shù)據(jù)溢出,階內(nèi)部發(fā)生數(shù)據(jù)溢出,需要用增益系數(shù)對(duì)濾波器的單位脈沖響應(yīng)需要用增益系數(shù)對(duì)濾波器的單位脈沖響應(yīng)(前饋通前饋通道道)定標(biāo)。定標(biāo)。u動(dòng)態(tài)定標(biāo)動(dòng)態(tài)定標(biāo)scaling方法方法。在每個(gè)階段若檢測(cè)到溢出。在每個(gè)階段若檢測(cè)到溢出, 濾波器內(nèi)部狀態(tài)濾波器內(nèi)部狀態(tài),定標(biāo)定標(biāo)都被減半都被減半, 以提高指令周期以提高指令周期換取為代價(jià)提高了結(jié)果的精度。換取為代價(jià)提高了結(jié)果的精度。knGabs(f(n) ,2 1/2knG(abs(f(n) )18l FFT的定標(biāo)方法的定標(biāo)方法u在在FFT操作里,每次蝶形運(yùn)算

18、后數(shù)據(jù)平均增加一位。操作里,每次蝶形運(yùn)算后數(shù)據(jù)平均增加一位。輸入定標(biāo)輸入定標(biāo)需要移位需要移位 (FFT長(zhǎng)度為長(zhǎng)度為N),這會(huì)導(dǎo)致),這會(huì)導(dǎo)致在計(jì)算在計(jì)算FFT之前就衰減之前就衰減 6 dB。u在在固定定標(biāo)固定定標(biāo)中中, 每級(jí)蝶形運(yùn)算輸出除以每級(jí)蝶形運(yùn)算輸出除以2, 這是最常用這是最常用的的FFT定標(biāo)方法定標(biāo)方法, 因?yàn)樗?jiǎn)單而且有比較好的信噪比。因?yàn)樗?jiǎn)單而且有比較好的信噪比。但是但是, 對(duì)于大的對(duì)于大的FFT, 這種定標(biāo)可能會(huì)使信息丟失。這種定標(biāo)可能會(huì)使信息丟失。u另一種方法是另一種方法是動(dòng)態(tài)定標(biāo)動(dòng)態(tài)定標(biāo), 即在輸出溢出時(shí)再除以即在輸出溢出時(shí)再除以2。在。在這種情況下這種情況下, 會(huì)在這個(gè)過

19、程中指定一個(gè)變量會(huì)在這個(gè)過程中指定一個(gè)變量, 每定標(biāo)一每定標(biāo)一次變量的值加次變量的值加1, 計(jì)算結(jié)束后根據(jù)變量的值把結(jié)果乘以計(jì)算結(jié)束后根據(jù)變量的值把結(jié)果乘以一個(gè)系數(shù)。動(dòng)態(tài)定標(biāo)的信噪比最好一個(gè)系數(shù)。動(dòng)態(tài)定標(biāo)的信噪比最好, 但會(huì)增加但會(huì)增加FFT循環(huán)循環(huán)次數(shù)。次數(shù)。N2logN2log197.2 基礎(chǔ)算術(shù)運(yùn)算基礎(chǔ)算術(shù)運(yùn)算n7.2.1 加減運(yùn)算加減運(yùn)算n7.2.2 乘法運(yùn)算乘法運(yùn)算n7.2.3 除法運(yùn)算除法運(yùn)算n7.2.4 小數(shù)乘法小數(shù)乘法207.2.1 加減運(yùn)算加減運(yùn)算l在數(shù)字信號(hào)處理中,加減運(yùn)算是常見的算術(shù)運(yùn)算。在數(shù)字信號(hào)處理中,加減運(yùn)算是常見的算術(shù)運(yùn)算。一般使用一般使用16位或位或32位加減運(yùn)

20、算位加減運(yùn)算,數(shù)值分析、浮,數(shù)值分析、浮點(diǎn)運(yùn)算和其它操作點(diǎn)運(yùn)算和其它操作可能需要可能需要32位以上的運(yùn)算位以上的運(yùn)算。lC55x有直接完成有直接完成16位或位或32位加減運(yùn)算的指令,位加減運(yùn)算的指令,但沒有能直接完成多字加減運(yùn)算的指令但沒有能直接完成多字加減運(yùn)算的指令。要進(jìn)行。要進(jìn)行多字加減運(yùn)算,需要通過編程方法實(shí)現(xiàn)。多字加減運(yùn)算,需要通過編程方法實(shí)現(xiàn)。21l 以下指令可在單周期內(nèi)完成以下指令可在單周期內(nèi)完成32位加法運(yùn)算:位加法運(yùn)算: MOV40 dbl(Lmem),ACx ADD dbl(Lmem),ACxl 64位的高位的高32位加法要考慮低位加法要考慮低32位加法產(chǎn)生的進(jìn)位位加法產(chǎn)生的

21、進(jìn)位,高高32位位使使用以下指用以下指令:令:ADD uns(Smem), CARRY, ACxl 以下指令可在單周期內(nèi)完成以下指令可在單周期內(nèi)完成32位減法運(yùn)算:位減法運(yùn)算:MOV40 dbl(Lmem), ACxSUB dbl(Lmem), ACxl 64位的位的高高32位減位減法要考慮低法要考慮低32位減法產(chǎn)生的借位,位減法產(chǎn)生的借位,使用以下指令:使用以下指令: SUB uns(Smem), BORROW,ACx 可進(jìn)行單獨(dú)可進(jìn)行單獨(dú)32位或位或64位的低位的低32位加位加可進(jìn)行單獨(dú)可進(jìn)行單獨(dú)32位或位或64位的低位的低32位加位加22例例7-1,64位加法運(yùn)算。文件名為:位加法運(yùn)算。

22、文件名為:add64.asm。 .mmregs .model call=c55_std .model mem=large;*; 64位加法; X3 X2 X1 X0 ; + Y3 Y2 Y1 Y0 ; - ; W3 W2 W1 W0 23The .mmregs directives are supported by the C1x/C2x/C2xx/C5x assembler. 指針分配AR1 - X3(偶地址) X2 X1 X0AR2 - Y3(偶地址) Y2 Y1 Y0 AR3 - W3(偶地址) W2 W1 W0 1000h地址值依次增加1004h1008h.sect .text.ali

23、gn 4.globalstart;.sym start,start, 36, 2, 0 start:MOV #0100h,AR1 MOV #0104h,AR2 MOV #0108h,AR3 L1: MOV40 dbl(*AR1(#2), AC0 ;AC0 = X1 X0 ADD dbl(*AR2(#2), AC0 ;AC0 = X1 X0 + Y1 Y0 MOV AC0,dbl(*AR3(#2) ;保存W1 W0. MOV40 dbl(*AR1), AC0 ;AC0 = X3 X2 ADD uns(*AR2(#1),CARRY,AC0;AC0=X3 X2 + 00 Y2 + CARRY ADD

24、 *AR2 #16, AC0 ;AC0= X3 X2 +Y3 Y2 + CARRY MOV AC0, dbl(*AR3) ;保存 W3 W2. B L124.sym- COFF Symbolic Debugging Directives已廢棄已廢棄The .sym directive defines a global variable, a local variable, or a function. Several parameters allow you to associate various debugging information with the variable or func

25、tion.格式:.sym name, value, type, storage class, size, tag, dims參考文獻(xiàn)參考文獻(xiàn): TMS320C28X系列DSP指令和編程指南-附錄B 符號(hào)調(diào)試偽指令.sym(需看附錄A:難懂)茶苑老吳的博客:”關(guān)于TMS320C55x的匯編語(yǔ)言中的.sym偽指令 “(此文獻(xiàn)非常詳細(xì)明了)標(biāo)號(hào),地址,表示函數(shù),外部外部,不占存儲(chǔ)用數(shù)表示對(duì)應(yīng)C變量變量類型,占存儲(chǔ)單元位數(shù).sect .text.align 4.globalstart;.sym start,start, 36, 2, 0 start:MOV #0100h,AR1 MOV #0104h,

26、AR2 MOV #0108h,AR3 L1: MOV40 dbl(*AR1(#2), AC0 ;AC0 = X1 X0 ADD dbl(*AR2(#2), AC0 ;AC0 = X1 X0 + Y1 Y0 MOV AC0,dbl(*AR3(#2) ;保存W1 W0. MOV40 dbl(*AR1), AC0 ;AC0 = X3 X2 ADD uns(*AR2(#1),CARRY,AC0 ;AC0=X3X2+00Y2 +CARRY ADD *AR2 X3(偶地址) X2 X1 X0AR2 - Y3(偶地址) Y2 Y1 Y0 AR3 - W3(偶地址) W2 W1 W0 1000h地址值依次增加

27、1004h1008h指針分配無帶進(jìn)位的32位加指令此指令不是帶進(jìn)位加, 也不需要, X2加Y2的進(jìn)位就在AC0(16)中.1002h1006h100Ah1005h加法AC0=AC0+Y300.sect .text.align 4.globalstart;.sym start,start,36,2,0 start:MOV #0100h,AR1 MOV #0104h,AR2 MOV #0108h,AR3 L1: MOV40 dbl(*AR1(#2), AC0 ;AC0 = X1 X0 ADD dbl(*AR2(#2), AC0 ;AC0 = X1 X0 + Y1 Y0 MOV AC0,dbl(*A

28、R3(#2) ;保存W1 W0. MOV40 dbl(*AR1), AC0 ;AC0 = X3 X2 ADD uns(*AR2(#1),CARRY,AC0 ;AC0=X3X2+00Y2 +CARRY ADD *AR2 X3(偶地址) X2 X1 X0AR2 - Y3(偶地址) Y2 Y1 Y0 AR3 - W3(偶地址) W2 W1 W0 1000h地址值依次增加1004h1008h.sect .text.align 4.global start;.sym start, start,36,2,0 start:MOV #0100h,AR1 MOV #0104h,AR2 MOV #0108h,AR

29、3 L1: MOV40 dbl(*AR1(#2),AC0 ;AC0=X1X0 SUB dbl(*AR2(#2),AC0 ;AC0=X1X0-Y1Y0 MOV AC0,dbl(*AR3(#2) ;保存保存W1W0. MOV40 dbl(*AR1),AC0 ;AC0=X3X2 SUB uns(*AR2(#1),BORROW,AC0 ;AC0=X3X2-00Y2-BORROW SUB *AR2 X3(偶地址) X2 X1 X0AR2 - Y3(偶地址) Y2 Y1 Y0 AR3 - W3(偶地址) W2 W1 W0 1000h地址值依次增加1004h1008h指針分配除加法換成減法, CARRY換成

30、BORROW外, 步驟相同.7.2.2乘法運(yùn)算乘法運(yùn)算lC55x提供了硬件乘法器,提供了硬件乘法器,16位乘法可在一個(gè)位乘法可在一個(gè)指令周期內(nèi)完成指令周期內(nèi)完成。l高于高于16位的乘法運(yùn)算可以采用下述方法實(shí)現(xiàn)位的乘法運(yùn)算可以采用下述方法實(shí)現(xiàn)(以(以32位乘法為例)。位乘法為例)。29例例7-3, 32位整數(shù)乘法運(yùn)算。文件名位整數(shù)乘法運(yùn)算。文件名:mpy32.asm.mmregs.model call=c55_std.model mem=large30;*; 本子程序是兩個(gè)32位整數(shù)乘法, 得到一個(gè)64位結(jié)果。; 操作數(shù)取自數(shù)據(jù)存儲(chǔ)器, 運(yùn)算結(jié)果送回?cái)?shù)據(jù)存儲(chǔ)器。; 數(shù)數(shù)據(jù)存儲(chǔ)據(jù)存儲(chǔ): 指指針分配

31、針分配:; X1 X0 32位操作數(shù) AR0 - X1; Y1 Y0 32位操作數(shù) X0; W3 W2 W1 W0 64位結(jié)果 AR1 - Y1; Y0; 入口條件入口條件: AR2 - W0; SXMD = 1 (允許符號(hào)擴(kuò)展) W1; SATD = 0 (不做飽和處理) W2; FRCT = 0 (關(guān)小數(shù)模式) W3;限制條件: 延遲鏈和輸入序列必須指定為長(zhǎng)字類型。;*.sect .text.align 4.global start;.symstart,start,36,2,0 start:MOV #0100h, AR0 MOV #0102h, AR1 MOV #0104h, AR2 BS

32、ET SXMD BCLR SATD BCLR FRCT31例例7-3, 32位整數(shù)乘法運(yùn)算。位整數(shù)乘法運(yùn)算。 指指針分配針分配: AR0 - X1 X0 AR1 - Y1 Y0 AR2 - W0 W1 W2 W3有符有符號(hào)數(shù)的號(hào)數(shù)的數(shù)數(shù)據(jù)存儲(chǔ)據(jù)存儲(chǔ): X1 X0 32位 Y1 Y0 32位 無符號(hào)乘 X0 Y0 有符號(hào)與無符號(hào)乘 X1Y0有符號(hào)與無符號(hào)乘 X0Y1 有符號(hào)乘 X1Y1 結(jié)果累加 W3 W2 W1 W0 64位0100h地址值依次增加0102h0104h32位32位32位 L1: AMAR *AR0+ ;AR0指向X0 |AMAR *AR1+ ;AR1指向Y0MPYM uns(*

33、AR0-),uns(*AR1),AC0 ;ACO=X0*Y0MOV AC0,*AR2+ ;保存W0 (是AC0的低16位)MACM *AR0+,uns(*AR1-),AC0#16,AC0 ;AC0=X0*Y016+X1*Y0MACM uns(*AR0-),*AR1,AC0 ;AC0=X0*Y016+X1*Y0+X0*Y1MOV AC0,*AR2+ ;保存W1MACM *AR0,*AR1,AC0#16,AC0 ;AC0=AC016+X1*Y1MOV AC0,*AR2+ ;保存W2MOV HI(AC0),*AR2 ;保存W3 B L132例例7-3, 32位整數(shù)乘法運(yùn)算。位整數(shù)乘法運(yùn)算。AR0-X

34、1 X0AR1-Y1 Y00100h0102h指針分配AR2-W0 W1 W2 W30104h X1 X0 32位 Y1 Y0 32位 X0 Y0 X1Y0 X0Y1 X1Y1 累加W3 W2 W1 W064位;即累加前AC0的高16位1001h1003h1005h7.2.3 除法運(yùn)算除法運(yùn)算lC55x沒有提供硬件除法器,也沒有提供專門的除沒有提供硬件除法器,也沒有提供專門的除法指令,要實(shí)現(xiàn)除法運(yùn)算需借助于條件減法指令法指令,要實(shí)現(xiàn)除法運(yùn)算需借助于條件減法指令SUBC和重復(fù)指令和重復(fù)指令RPT。l根據(jù)被除數(shù)絕對(duì)值與除數(shù)絕對(duì)值的大小關(guān)系,除法根據(jù)被除數(shù)絕對(duì)值與除數(shù)絕對(duì)值的大小關(guān)系,除法的實(shí)現(xiàn)過程

35、略有不同:的實(shí)現(xiàn)過程略有不同:u當(dāng)當(dāng)|被除數(shù)被除數(shù)|被除數(shù); AR1-除數(shù); AR2-商; AR3-余數(shù); 注:; 無符號(hào)除法,被除數(shù)、除數(shù)均為16位; 關(guān)閉符號(hào)擴(kuò)展,被除數(shù)、除數(shù)均為正數(shù); 運(yùn)算完成后AC0(15-0)為商, AC0(31-16)為余數(shù)。;* 34.sect .text.align 4.globalstart;.symstart,start,36,2,0 start:MOV #0100h,AR0 MOV #0101h,AR1 MOV #0102h,AR2 MOV #0103h,AR3 L1:BCLR SXMD ; 清零SXMD(關(guān)閉符號(hào)擴(kuò)展)MOV *AR0,AC0 ; 把被

36、除數(shù)放入AC0RPT #(16-1) ; 執(zhí)行subc 16次SUBC *AR1,AC0,AC0 ; AR1指向除數(shù)MOV AC0,*AR2 ; 保存商MOV HI(AC0),*AR3 ; 保存余數(shù) B L135指針分配AR0-被除數(shù)AR1-除數(shù)AR2-商AR3-余數(shù)0100h0102h0101h0103h例例7-4, 無符號(hào)無符號(hào)16位除位除16位整數(shù)除法。位整數(shù)除法。例例7-5,無符號(hào),無符號(hào)32位除位除16位整數(shù)除法。位整數(shù)除法。文件名為:文件名為:udiv32o16.asm。.mmregs.model call=c55_std.model mem=large36;*; 指針分配; AR

37、0-被除數(shù)高位; 被除數(shù)低位; AR1-除數(shù); AR2-商高位; 商低位; AR3-余數(shù);注:;無符號(hào)除法,被除數(shù)為32位,除數(shù)為16位;關(guān)閉符號(hào)擴(kuò)展,被除數(shù)、除數(shù)均為正數(shù);第一次除法之前,把被除數(shù)高位存入AC0;第一次除法之后,把商的高位存入AC0(15-0);第二次除法之前,把被除數(shù)低位存入AC0; 第二次除法之后, AC0(15-0)為商的低位, AC0(31-16)為余數(shù);*.sect.text.align 4.global startstart: MOV #0100h,AR0 MOV #0102h,AR1 MOV #0104h,AR2 MOV #0106h,AR3L1:BCLR SX

38、MD ;清零SXMD(關(guān)閉符號(hào)擴(kuò)展)MOV *AR0+,AC0 ;把被除數(shù)高位存入AC0 | RPT #(15-1) ;執(zhí)行subc 15次SUBC *AR1,AC0,AC0;AR1指向除數(shù)SUBC *AR1,AC0,AC0 ;執(zhí)行subc最后一次 | MOV #8,AR4 ;把AC0_L 存儲(chǔ)地址(08h)裝入AR4MOV AC0,*AR2+ ;保存商的高位MOV *AR0+,*AR4 ;把被除數(shù)低位裝入AC0_L(08h)RPT #(16-1) SUBC *AR1,AC0,AC0 ;執(zhí)行subc 16次MOV AC0,*AR2+ ;保存商的低位MOV HI(AC0),*AR3 ;保存余數(shù)B

39、SET SXMD ;置位SXMD (打開符號(hào)擴(kuò)展) B L137指針分配AR0-被除數(shù)高位 被除數(shù)低位AR1-除數(shù)AR2-商高位 商低位AR3-余數(shù)0100h0104h0102h0106h;不能用MOV *AR0+,AC0(高16位清0)例例7-6,帶符號(hào),帶符號(hào)16位除位除16位整數(shù)除法。位整數(shù)除法。文件名為:文件名為:sdiv16o16.asm。.mmregs.model call=c55_std.model mem=large .sect .text.align 4;*; 指針分配; AR0-被除數(shù); AR1-除數(shù);AR2-商;AR3-余數(shù); 注:; 帶符號(hào)除法,被除數(shù)為16位,除數(shù)為1

40、6位;打開符號(hào)擴(kuò)展,被除數(shù)、除數(shù)可為負(fù)數(shù);除法運(yùn)算之前,商的符號(hào)存入AC0;除法運(yùn)算之后,商存入AC1(15-0),余數(shù)存入AC1(31-16);*38.globalstartstart: MOV #0100h,AR0 MOV #0101h,AR1 MOV #0102h,AR2 MOV #0103h,AR3 L1: BSET SXMD ; 置位號(hào)SXMD (打開符擴(kuò)展) MPYM *AR0,*AR1,AC0 ; 計(jì)算期望得到的商的符號(hào)MOV *AR1,AC1 ; 把除數(shù)存入AC1ABS AC1,AC1 ; 求絕對(duì)值,|除數(shù)|MOV AC1,*AR2 ; 暫時(shí)保存 |除數(shù)|MOV *AR0,AC

41、1 ; 把被除數(shù)存入 AC1ABS AC1,AC1 ; 求絕對(duì)值,|被除數(shù)|RPT #(16-1) ; 執(zhí)行subc 16次39SUBC *AR2,AC1,AC1 ;AR2 - |除數(shù)|MOV HI(AC1),*AR3 ; 保存余數(shù)MOV AC1,*AR2 ; 保存商(AC1的低16位,是正數(shù))SFTS AC1,#16 ; 對(duì)商移位: 把符號(hào)位放在最高位NEG AC1,AC1 ; 對(duì)商求反2補(bǔ)碼(商變成負(fù)數(shù))XCCPART label, AC0被除數(shù)AR1-除數(shù)AR2-商AR3-余數(shù)0100h0102h0101h0103h把除數(shù)取絕對(duì)值把被除數(shù)取絕對(duì)值無符號(hào)數(shù)除法例例7-7,帶符號(hào),帶符號(hào)32

42、位除位除16位整數(shù)除法。位整數(shù)除法。文件名為:文件名為:sdiv32o16.asm.mmregs.model call=c55_std.model mem=large;*; 指針分配:(被除數(shù)和商都被指定為長(zhǎng)字); AR0-被除數(shù)高半部分(NumH)(偶地址);被除數(shù)高半部分(NumL); AR1-除數(shù)(Den);AR2-商的高半部分(QuotH)(偶地址);商的低半部分(QuotL);AR3-余數(shù)(Rem); 注:; 帶符號(hào)除法,被除數(shù)為32位,除數(shù)為16位;打開符號(hào)擴(kuò)展,被除數(shù)、除數(shù)可為負(fù)數(shù);除法運(yùn)算之前,期望的商的符號(hào)存入AC0;第一次除法運(yùn)算之前,把被除數(shù)的高半部分存入AC1;第一次除

43、法運(yùn)算之后,把商的高半部分存入AC1(15-0);第二次除法運(yùn)算之前,把被除數(shù)的低半部分存入AC1;第二次除法運(yùn)算之后,把商的低半部分存入AC1(15-0),余數(shù)存入AC1(31-16);*40.sect.text.align 4.global start.symstart,start,36,2,0start:MOV #0100h,AR0 MOV #0102h,AR1 MOV #0104h,AR2 MOV #0106h,AR3 MOV #0108h,AR4L1:BSET SXMD ; 置位SXMD (打開符號(hào)擴(kuò)展)MPYM *AR0,*AR1,AC0 ; 除法結(jié)果的符號(hào)位( NumH x De

44、n )MOV *AR1,AC1; AC1 = DenABS AC1,AC1 ; AC1 = abs(Den)MOV AC1,*AR3 ; Rem = abs(Den) MOV40 dbl(*AR0),AC1 ; AC1 = NumH NumLABS AC1,AC1 ; AC1 = abs(Num)MOV AC1,dbl(*AR2) ; QuotH = abs(NumH) ; QuotL = abs(NumL) 41MOV *AR2,AC1 ; AC1 = QuotHRPT #(15-1) ; 執(zhí)行subc 15次SUBC *AR3,AC1,AC1SUBC *AR3,AC1,AC1 ; 最后一次

45、執(zhí)行subc| MOV #11,AR4 ; 把AC1_L存儲(chǔ)地址裝入AR4MOV AC1,*AR2+ ; 保存 QuotHMOV *AR2,*AR4 ; AC1_L = QuotHRPT #(16-1) ; 執(zhí)行subc 16次SUBC *AR3,AC1,AC1MOV AC1,*AR2- ; 保存 QuotLMOV HI(AC1),*AR3 ; 保存 RemBCC skip,AC0= #0 ; 如果實(shí)際結(jié)果應(yīng)該為正數(shù),跳到skip.MOV40 dbl(*AR2),AC1 ; 否則,對(duì)商取反.NEG AC1,AC1MOV AC1,dbl(*AR2)skip: B L1427.2.4 小數(shù)乘法小數(shù)

46、乘法l在定點(diǎn)在定點(diǎn)DSP的某些應(yīng)用中,的某些應(yīng)用中,整數(shù)運(yùn)算整數(shù)運(yùn)算很難滿足要很難滿足要求。這是因?yàn)樗蟆_@是因?yàn)樗陨泶嬖谌毕葑陨泶嬖谌毕荩簎兩個(gè)兩個(gè)16位整數(shù)相乘位整數(shù)相乘, 乘積乘積總是總是“向左增長(zhǎng)向左增長(zhǎng)” (即小即小數(shù)點(diǎn)左側(cè)的位數(shù)增加數(shù)點(diǎn)左側(cè)的位數(shù)增加), 這意味著這意味著多次相乘后多次相乘后, 乘乘積將很快超出定點(diǎn)器件的數(shù)據(jù)范圍積將很快超出定點(diǎn)器件的數(shù)據(jù)范圍。u保存保存32位乘積到存儲(chǔ)器位乘積到存儲(chǔ)器, 要占用要占用2個(gè)個(gè)CPU周期和周期和2個(gè)字的存儲(chǔ)器空間。個(gè)字的存儲(chǔ)器空間。u由于由于乘法器都是乘法器都是16位相乘位相乘, 因此將因此將32位乘積再位乘積再作為乘法器的輸入時(shí)就顯

47、得較繁瑣作為乘法器的輸入時(shí)就顯得較繁瑣, 不能勝任遞不能勝任遞歸運(yùn)算歸運(yùn)算。43l為了克服這些缺陷,在實(shí)際應(yīng)用中更多采用的是為了克服這些缺陷,在實(shí)際應(yīng)用中更多采用的是小數(shù)運(yùn)算。小數(shù)運(yùn)算。小數(shù)運(yùn)算具有如下優(yōu)點(diǎn)小數(shù)運(yùn)算具有如下優(yōu)點(diǎn): u乘積乘積總是總是“向右增長(zhǎng)向右增長(zhǎng)”。這就意味著。這就意味著超出定點(diǎn)器超出定點(diǎn)器件數(shù)據(jù)范圍的將是不太感興趣的部分件數(shù)據(jù)范圍的將是不太感興趣的部分。u既可以存儲(chǔ)既可以存儲(chǔ)32位乘積,位乘積,也可以近存儲(chǔ)高也可以近存儲(chǔ)高16位乘積位乘積,這就允許用較少的資源保存結(jié)果。這就允許用較少的資源保存結(jié)果。u可以用于遞歸運(yùn)算可以用于遞歸運(yùn)算。 447.2.4 小數(shù)乘法小數(shù)乘法小數(shù)

48、部分越靠近小數(shù)點(diǎn)小數(shù)部分越靠近小數(shù)點(diǎn), 其權(quán)值越大。其權(quán)值越大。例例7-8, 兩個(gè)兩個(gè)Q31格式有符號(hào)小數(shù)相乘格式有符號(hào)小數(shù)相乘, 得到一個(gè)得到一個(gè)Q31格式結(jié)果。格式結(jié)果。文件名為文件名為: mpyQ31.asm。 需要注意的是:需要注意的是:u兩個(gè)帶符號(hào)小數(shù)相乘兩個(gè)帶符號(hào)小數(shù)相乘, 所得乘積帶有所得乘積帶有2個(gè)符號(hào)位個(gè)符號(hào)位。u為解決冗余符號(hào)位的問題為解決冗余符號(hào)位的問題, 需在程序中設(shè)定狀態(tài)寄需在程序中設(shè)定狀態(tài)寄存器存器ST1中的中的FRCT(小數(shù)方式小數(shù)方式)為為1, 這樣當(dāng)乘法器這樣當(dāng)乘法器將結(jié)果傳送至累加器時(shí)就會(huì)將結(jié)果傳送至累加器時(shí)就會(huì)自動(dòng)左移自動(dòng)左移1位位。45.mmregs.m

49、odel call=c55_std.model mem=large;*;操作數(shù)取自數(shù)據(jù)存儲(chǔ)器,運(yùn)算結(jié)果送回?cái)?shù)據(jù)存儲(chǔ)器。; 數(shù)據(jù)存儲(chǔ)數(shù)據(jù)存儲(chǔ): 指指針分配針分配:; X1 X0 Q31操作數(shù) AR0 - X1; Y1 Y0 Q31操作數(shù) X0; W1 W0 Q31結(jié)果 AR1 - Y1; Y0; 入口條件入口條件: AR2 -W0(偶地址); SXMD = 1 (允許符號(hào)擴(kuò)展) W1; SATD = 0 (不做飽和處理) ; FRCT = 1 (運(yùn)算結(jié)果左移一位) ;限制條件:W1被指定為偶地址;*46例例7-8, 兩個(gè)兩個(gè)Q31格式有格式有符號(hào)小數(shù)相乘。符號(hào)小數(shù)相乘。 X1 X0 Q31 Y1

50、 Y0 Q31 X0 Y0 X1Y0 X0Y1 X1Y1 累加W1 W0 w1 w0(忽略) .sect .text .align 4 .global start .sym start,start,36,2,0 start:MOV #0100h,AR0 MOV #0102h,AR1 MOV #0104h,AR2 BSET SXMD BCLR SATD BSET FRCT L1: AMAR *AR0+ ;AR0指向X0 MPYM uns(*AR0-),*AR1+,AC0 ;AC0=X0*Y1 MACM *AR0,uns(*AR1-),AC0 ;AC0=X0*Y1+X1*Y0 MACM *AR0,

51、*AR1,AC0#16,AC0;AC0=AC016+X1*Y1 MOV AC0,dbl(*AR2) ;保存W1W0 B L147AR0-X1 Q31乘操作數(shù) X0 Q31乘操作數(shù)AR1-Y1 Q31乘操作數(shù) Y0 Q31乘操作數(shù)AR2-W1 Q31乘結(jié)果 W0 Q31乘結(jié)果0100h0104h0102h Y1 Y0 Q31 X1 X0 Q31 X0 Y0(忽略) X0Y1 X1Y0 X1Y1 累加W1 W0 w1 w0(忽略) 1001h7.3 FIR濾波器濾波器l數(shù)字濾波器是數(shù)字濾波器是DSP的基本應(yīng)用,有的基本應(yīng)用,有2種基本類型:種基本類型:u有限沖激響應(yīng)濾波器有限沖激響應(yīng)濾波器FIRu

52、無限沖激濾波器無限沖激濾波器IIRl一般來說,如果需要線性相位則選擇用一般來說,如果需要線性相位則選擇用FIR濾波器,濾波器,對(duì)于相位要求不敏感的場(chǎng)合可以選用對(duì)于相位要求不敏感的場(chǎng)合可以選用IIR濾波器。濾波器。l本節(jié)主要討論本節(jié)主要討論FIR濾波器的濾波器的DSP實(shí)現(xiàn)方法,有關(guān)實(shí)現(xiàn)方法,有關(guān)IIR濾波器的實(shí)現(xiàn)將在下一節(jié)中介紹。濾波器的實(shí)現(xiàn)將在下一節(jié)中介紹。487.3.1 FIR濾波器的基本結(jié)構(gòu)濾波器的基本結(jié)構(gòu)l一個(gè)一個(gè)FIR濾波器的輸出序列和輸入序列之間的關(guān)系,濾波器的輸出序列和輸入序列之間的關(guān)系,滿足差分方程:滿足差分方程:l傳遞函數(shù)為傳遞函數(shù)為 10Niiy nb x ni 10Niii

53、Y zH zb zX z49l FIR濾波器的結(jié)構(gòu):)1()()(12/0iNnxinxbnyNii50lFIR濾波器的單位沖激響應(yīng)是一個(gè)有限長(zhǎng)序列。若為實(shí)數(shù),且滿足偶對(duì)稱或奇對(duì)稱的條件,則FIR濾波器具有線性相位特性。 偶對(duì)稱線性相位FIR濾波器的差分方程為:7.3.2 FIR濾波器的濾波器的C語(yǔ)言編程實(shí)現(xiàn)語(yǔ)言編程實(shí)現(xiàn)例例7-9,直接型,直接型FIR濾波器的濾波器的C語(yǔ)言編程實(shí)現(xiàn)。語(yǔ)言編程實(shí)現(xiàn)。/* fir.c 該程序用于實(shí)現(xiàn)FIR濾波器* L濾波器的階數(shù)* bi濾波器的系數(shù),i=0,1,L-1* xi輸入信號(hào)向量,i=0,1,L-1;x0對(duì)應(yīng)于當(dāng)前值,x1對(duì)應(yīng)于上一采樣值* x_in 輸入

54、信號(hào)的當(dāng)前值* y_out 輸出信號(hào)的當(dāng)前值*/51float fir(float x_in, float *x,float *b,int L)float y_out;int i;/* - */* 把上一個(gè)采樣時(shí)間的輸入信號(hào)向量延遲一個(gè)單元把上一個(gè)采樣時(shí)間的輸入信號(hào)向量延遲一個(gè)單元,得到當(dāng)前得到當(dāng)前采樣時(shí)間的輸入信號(hào)向量采樣時(shí)間的輸入信號(hào)向量 */for(i=L-1;i0;i-) xi = xi-1;x0=x_in;/* - */*完成完成FIR濾波濾波 */y_out = 0.0;for(i=0;iL;i+) y_out = y_out + bi*xi;return y_out;52u 直接

55、型直接型FIRFIR濾波器的實(shí)現(xiàn)涉及到兩個(gè)基本操作,一個(gè)是濾波器的實(shí)現(xiàn)涉及到兩個(gè)基本操作,一個(gè)是輸入信號(hào)向量與濾波器系數(shù)向量的內(nèi)積計(jì)算,另一個(gè)是輸入信號(hào)向量與濾波器系數(shù)向量的內(nèi)積計(jì)算,另一個(gè)是輸入信號(hào)向量的更新處理。輸入信號(hào)向量的更新處理。u在在每個(gè)采樣周期信號(hào)緩沖器都要更新一次,最老的采每個(gè)采樣周期信號(hào)緩沖器都要更新一次,最老的采樣被拋棄,而其他的信號(hào)則向緩沖器的右方移動(dòng)一個(gè)樣被拋棄,而其他的信號(hào)則向緩沖器的右方移動(dòng)一個(gè)單元,一個(gè)新的采樣被插入存儲(chǔ)單元,并被標(biāo)記單元,一個(gè)新的采樣被插入存儲(chǔ)單元,并被標(biāo)記。 若此操若此操作過程不用作過程不用DSPDSP硬件完硬件完成成, , 那那么它么它需很多

56、時(shí)需很多時(shí)間。間。537.3.3 FIR濾波器的匯編語(yǔ)言編程實(shí)現(xiàn)濾波器的匯編語(yǔ)言編程實(shí)現(xiàn)l處理信號(hào)緩沖器的最有效方法,是把信號(hào)采樣加處理信號(hào)緩沖器的最有效方法,是把信號(hào)采樣加載到循環(huán)緩沖器中。載到循環(huán)緩沖器中。l在循環(huán)緩沖器中,采取數(shù)據(jù)保持固定、反時(shí)針方在循環(huán)緩沖器中,采取數(shù)據(jù)保持固定、反時(shí)針方向移動(dòng)地址的方式,代替保持緩沖器地址固定且向移動(dòng)地址的方式,代替保持緩沖器地址固定且正方向移動(dòng)數(shù)據(jù)。正方向移動(dòng)數(shù)據(jù)。l信號(hào)采樣的起點(diǎn)由指針信號(hào)采樣的起點(diǎn)由指針x(n) 指定,其它諸采樣則指定,其它諸采樣則沿著順時(shí)針方向,從起點(diǎn)開始依次順序加載。沿著順時(shí)針方向,從起點(diǎn)開始依次順序加載。54圖圖7-4 FI

57、R濾波器的循環(huán)緩沖區(qū)濾波器的循環(huán)緩沖區(qū)(a)信號(hào)循環(huán)緩沖區(qū)信號(hào)循環(huán)緩沖區(qū) (b)系數(shù)循環(huán)緩沖區(qū)系數(shù)循環(huán)緩沖區(qū)55例例7-10,F(xiàn)IR濾波器的濾波器的C55x匯編語(yǔ)言實(shí)現(xiàn)。匯編語(yǔ)言實(shí)現(xiàn)。(1) 主程序 fir_test.c/* fir_test.c */#includemath.h#define L 64 /* Number of FIR filter coefficients */#define Fs 8000 /* 8000 Hz sampling frequency */#define T 1/Fs #define f1 800 /* 800 Hz frequency */#define

58、f2 1800 /* 1800 Hz frequency */#define f3 3300 /* 3300 Hz frequency */#define PI 3.1415926#define w1 (2*PI*f1*T) /* 2*pi*f1/Fs */#define w2 (2*PI*f2*T) /* 2*pi*f2/Fs */#define w3 (2*PI*f3*T) /* 2*pi*f3/Fs */#define a1 0.333 /* Magnitude for wave 1 */#define a2 0.333 /* Magnitude for wave 2 */#define

59、 a3 0.333 /* Magnitude for wave 3 */56extern int fir(int *,int *,unsigned int,int );/* Low-pass FIR filter coefficients */int coeffL= -26,-13,14,36,31,-8,-58,-71,-15,83,139,76,-90,-231,-194,50,331,383,78,-405, -654,-347,403,1024,863,-228,-1577,-1972,-453,2910,6836,9470,9470,6836, 2910,-453,-1972,-15

60、77,-228,863, 1024,403,-347,-654,-405,78,383,331,50,-194,-231,-90,76,139,83,-15,-71, -58,-8,31,36,14,-13,-26;int inL; /* input buffer */int outL; /* Output buffer */57main() unsigned int i; float signal; unsigned int n=0; int index=0; for(i=0;iL;i+) ini=0; outi=0; while(1) signal = a1*cos(float)w1*n)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論