




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、基于DSP技術的QAM調制器設計方案01071099劉樵1、 QAM概述正交幅度調制(QAM,Quadrature Amplitude Modulation)是一種在兩個正交載波上進行幅度調制的調制方式。這兩個載波通常是相位差為90度(/2)的正弦波,因此被稱作正交載波。這種調制方式因此而得名。同其它調制方式類似,QAM通過載波某些參數的變化傳輸信息。在QAM中,數據信號由相互正交的兩個載波的幅度變化表示。模擬信號的相位調制和數字信號的PSK可以被認為是幅度不變、僅有相位變化的特殊的正交幅度調制。由此,模擬信號頻率調制和數字信號FSK也可以被認為是QAM的特例,因為它們本質
2、上就是相位調制。這里主要討論數字信號的QAM,雖然模擬信號QAM也有很多應用,例如NTSC和PAL制式的電視系統就利用正交的載波傳輸不同的顏色分量。類似于其他數字調制方式,QAM發射信號集可以用星座圖方便地表示。星座圖上每一個星座點對應發射信號集中的一個信號。設正交幅度調制的發射信號集大小為N,稱之為N-QAM。星座點經常采用水平和垂直方向等間距的正方網格配置,當然也有其他的配置方式。數字通信中數據常采用二進制表示,這種情況下星座點的個數一般是2的冪。常見的QAM形式有16-QAM、64-QAM、256-QAM等。星座點數越多,每個符號能傳輸的信息量就越大。但是,如果在星座圖的平均能量保持不變
3、的情況下增加星座點,會使星座點之間的距離變小,進而導致誤碼率上升。因此高階星座圖的可靠性比低階要差。當對數據傳輸速率的要求高過8-PSK能提供的上限時,一般采用QAM的調制方式。因為QAM的星座點比PSK的星座點更分散,星座點之間的距離因之更大,所以能提供更好的傳輸性能。但是QAM星座點的幅度不是完全相同的,所以它的解調器需要能同時正確檢測相位和幅度,不像PSK解調只需要檢測相位,這增加了QAM解調器的復雜性。M-QAM信號波形的表達式為:其中g(t)為碼元信號脈沖。因此QAM可以分解為分別在兩個正交的載波cos2fct與sin2fct上的M1-PAM與M2-PAM的疊加,其中M1M2
4、0;= M。將上面sm(t)變形得到其中,m = arctan(Ams / Amc)。因此,M-QAM還可以看作是M1-PAM與M2-PSK的疊加,其中M1M2 = M。2、DSP技術 2.1 DSP實現QAM調制的方案設計 用數字方法實現QAM調制器不同于用模擬方法實現,特別是在本課題中,所有模塊功能都是集中在一個芯片(DSP芯片)上實現的,因此不再進行明確的分工,而是通過星座圖直接分析各種模式的調制器的結果,使調制器能夠按照輸入數據產生相應的調制輸出結果。為了使QAM調制器的速率盡可能高,必須使調制的處理過程盡量短,因此讓大量的處
5、理工作都在調制處理前完成,即進行大量的初始化。用DSP實現QAM調制的設計思路如下: 一、產生各種模式QAM調制所需的各種幅值的數字正、余弦波形,即抑制載波的雙邊帶調制后得到的各種幅值的數字正、余弦波形。二、根據輸入數據,選擇相應幅值的正、余弦數字波形進行疊加,從而得到QAM調制的數字輸出結果。 第一步即為初始化過程,它是一個不影響調制器波特率的處理過程,可分為三個步驟完成:1、在DSP上產生數字正弦波。2、對數字正弦波均勻采樣,通過選擇合適的采樣點數M,從而產生頻率可變的數字正、余弦波。3、對采樣后的頻率可變的數字正、余弦波進行處理,產生QAM調制所需的各種幅值的正、余弦波。其設計流圖如圖1
6、.1: 在DSP上產生數字正弦波 根據輸入數據,進行QAM調制對數字正弦波進行均勻采樣產生調制所需的各種幅值的正、余弦波形 圖1.1 DSP實現QAM調制的設計流圖 2.2 各模塊的實現方法 (1) 在DSP上產生數字的正弦波 在模擬設計中,正弦波是通過振蕩器產生,而數字方法中正弦波是由軟件編程實現的。因為處理器能夠處理的信息都是數字的,因此只能通過數字計算的方法產生正弦波。模擬在DSP上產生數字正弦波對數字正弦波進行均勻采樣產生調制所需的各種幅值的正、余弦波形根據輸入數據,進行QAM調制正弦波采樣即得到了數字正弦波,根據這種思路,可以得到數字正弦波的產生方法:通過數字計算方法計算出一個正弦周
7、期內的若干個正弦值,將這些值作為一個集合,只要循環讀取這個離散值的集合即可產生數字正弦波,其實質就是對模擬正弦波進行采樣。為了便于讀取正弦波,通常對正弦波進行均勻采樣,即使集合中的數據為一個正弦周期內均勻取點的數值的正弦值。 根據泰勒公式: f(x)=f(x。)+f'(x。)(x-x。)+f''(x。)/2!*(x-x。)2,+f'''(x。)/3!*(x-x。)3+f(n)(x。)/n!*(x-x。)n+Rn(x) (1.1) 其中在a與x之間,可以得到: sinx=x-x3/3!+x5/5!-x7/7!+x9/9!(1.2) cosx=1-x
8、2/2!+x4/4!-x6/6!+x8/8!(1.3) 通過(1.2)、(1.3)兩個公式,我們可以用數字計算的方法求出任意數值的正、余弦值,應當注意公式中的x是一個弧度值。為了便于產生頻率可變的正、余弦波,對正弦波的采樣點數應盡量多些,即用(1.3)、(1.4)計算時,x間的差值盡量小些。以0.5o為間隔求0o45o間的90個點的sin(x)、cos(x)值,根據sin(2x)=2sinxcosx,從而得到以1o為間隔的0o90o間的90個點的sin(x)值,再經過數據復制和求反即可產生0o360o間的360點的sin(x)值,通過循環讀取這360個數據,即可產生數字正弦波。 (2) 頻率可
9、變的數字正弦波的產生 由于產生的正弦波是360點的,若將其作為載波,則需要讀取360次才能產生一個周期的正弦波,相對調制而言,這將需要非常長的時間。而實際上,讀取360點是完全沒有必要的,對于一個正弦波只要適當地讀取兩個以上的點就能夠準確地體現它的特性,這在處理時間上將縮短幾十倍甚至上百倍,因而還需對360點的數字正弦波均勻采樣,通過控制采樣點數M,即可產生頻率可變的數字正、余弦波。為了使等間隔均勻采樣產生的正弦波是一個整波形,必須保證M是360的一個因子。采樣點數為M,則采樣間隔為360/M。對于正弦波產生而言,直接對360點數字正弦波進行等間隔均勻采樣,即能產生M點的數字正弦波;而對于余弦
10、波的產生而言,必須先對正弦波的90o360o進行等間隔均勻采樣,再對0o90o進行等間隔采樣,從而產生M點的數字余弦波。 (3) 產生QAM調制所需的各種幅值的正、余弦波 為了使QAM調制的波特率盡可能高,必須使QAM調制處理時的工作量盡可能少,因此必須把所有調制要輸出的各種幅值都事先準備好,使調制處理只需完成由輸入數據到輸出數據的一個對應過程。對于不同進制數的QAM調制,從其星座圖可以看出,所需的正、余弦波的幅值是各不相同。把從星座圖得到的各種模式的QAM調制的幅值變化,轉化為DSP中的數據表示形式如下:(因為正、余弦值的取值范圍為-11之間,在DSP中用Q15格式表示數據形式。) 4QAM
11、:幅值只有一個,為1。 16QAM:有兩個幅值,為1、1/3。 1/3*32768=2AAAh 64QAM:有四個幅值,為1、5/7、3/7、1/7。 5/7*32768=5B6Dh 3/7*32768=36DBh 1/7*32768=1249h 256QAM:有八個幅值,為1、13/15、11/15、9/15、7/15、5/15、3/15、1/15。 13/15*32768=6EEEh 11/15*32768=5DDDh 9/15*32768=4CCCh 7/15*32768=3BBBh 5/15*32768=2AAAh 3/15*32768=1999h 1/15*32768=0888h 將
12、M點數字正、余弦波形的所有數據乘以以上的各幅值的數據表示值,即得到相應幅值的正、余弦波形的數據。為了便于尋址讀取和仿真,將同一模式QAM的各幅值數據存放于一個連續的存儲區。 (4) 根據輸入數據,選擇相應幅值的正、余弦數字波形進行QAM調制 先對輸入口進行判斷,根據輸入口數據選用不同的QAM調制。各模式的QAM調制,其實現方法基本相同,進行QAM調制時按以下條件設計: 用AR1指向正弦載波路中經過處理的應當輸出的正弦波數據,AR2指向余弦載波路中經過處理的應當輸出的余弦波數據,則QAM輸出為它們指向數據之和。 用AR5指向與輸入數據相對應的某一幅值的
13、正弦波數據,AR6指向與輸入數據相對應的某一幅值的余弦波數據,便于讀取波形數據。 AR1、AR2指向的數據即為AR5、AR6經過處理后的數據。 將時鐘信號接到BIO引腳,用時鐘信號來控制讀取輸入數據,該時鐘也是采樣時鐘。當引腳輸入為高電平時讀入數據,并進行處理,而引腳輸入為低電平時繼續檢測引腳輸入。為了保證不出錯,應當使每一次的處理時間在1/2時鐘周期和1個時鐘周期之間。 每次讀入數據后,和前一次讀入數據相比,若不同則表明新數據到來,此時應根據輸入數據判斷其相應的幅值,修改地址指針AR5和AR6,使其指向正確的幅值。若相同則表明
14、新數據尚未到或到來的新數據和上次輸入數據相同,應在原來幅值的數據塊中循環尋址。 如何根據輸入新數據,修改地址指針AR5和AR6,使其指向正確幅值的數據呢?先通過映射表,把具體的星座圖編碼轉變成一種具有簡單規律的、易實現的星座圖編碼,這種星座圖的規律為:符號位0表示+,1表示-,數據位按從大到小分別對應從大到小的各種幅值。完成映射后,根據映射后的數據修改地址指針AR5、AR6。按照QAM調制的進制數M的不同,可以有兩種修改地址的方法。編程時先判斷對應的幅值修改地址,再判斷符號位,且按幅值修改地址的操作只在新數據到來時進行,而判斷符號位的操作卻在每次處理時都進行,這樣可以使無
15、論新數據到來與否,處理過程在時間上都相差不大,同時不影響處理所需的最長時間。 其中提到的兩種修改地址的方法如下:當QAM進制數較小時,對映射后數據進行逐比特判斷,然后修改AR5、AR6。當然如果不考慮程序的普遍適用性,可以不用映射表,直接對輸入數據進行逐比特判斷,再修改地址指針。 以16QAM映射后數據1001為例:(編程時讓低位送正弦載波路,高位送余弦載波路) 正弦載波路:01,符號位為0表示正幅值,數據位為1表示幅值為1,若數據位為0則幅值為1/3,此時應修改地址AR5,使其指向幅值為1的正弦波數據的起始位置。 余弦載波路:10,符號位為1表示負幅值,數據位為0表示幅值為1/3,若數據位為
16、1則幅值為1,此時應修改地址AR6,使其指向幅值為1/3的余弦波數據的起始位置。 當QAM進制數較大時,根據映射后數據與地址修改量的以下規律可以簡化地址修改的過程。 (假設采用8點采樣,每個基帶數據對應兩個整波形,既每個碼元對應16個點的波形,這里只研究數據位以判斷相應的幅值) 16QAM:1(幅值為1) bx(bx+16*0=bx+16*(1-1) 0(幅值為1/3) bx+16(bx+16*1=bx+16*(1-0) (數據位最大值為1) 64QAM:11(幅值為1) cx(cx+16*0=cx+16*(3-3) 10(幅值為5/7) cx+16(cx+16*1=cx+16*(3-2) 0
17、1(幅值為3/7) cx+32(cx+16*2=cx+16*(3-1) 00(幅值為1/7) cx+48(cx+16*3=cx+16*(3-0) (數據位最大值為3) 256QAM:111(幅值為1) dx(dx+16*0=dx+16*(7-7) 110(幅值為13/15) dx+16(dx+16*1=dx+16*(7-6) 101(幅值為11/15) dx+32(dx+16*2=dx+16*(7-5) 100(幅值為9/15) dx+48(dx+16*3=dx+16*(7-4) 011(幅值為7/15) dx+64(dx+16*4=dx+16*(7-3) 010(幅值為5/15) dx+80
18、(dx+16*5=dx+16*(7-2) 001(幅值為3/15) dx+96(dx+16*6=dx+16*(7-1) 000(幅值為1/15) dx+112(dx+16*7=dx+16*(7-0) (數據位最大值為7) 從上面的分析結果能夠看出,地址修改量和映射后數據有一種線性關系,且正、余弦載波路都符合這種規律,因此可以根據輸入新數據的數據位的值控制地址指針的修改。具體實現方法為:將數據位最大值減去輸入新數據映射后的數據位值,計算出重復修改地址的次數,而每次修改地址都是地址指針加一個固定值,該固定值為一個輸入碼元對應的波形的采樣點數。64QAM中重復修改地址的次數為數據位最大值3減去輸入數
19、據映射后的數據位值,修改地址程序如下:(B為3-輸入新數據映射后的數據位值,AR0存放了地址修改的固定值) a: STM #cx,AR5 ;指向初始地址后修改 STL B,*AR7 ;置循環次數 RPT *AR7 ;輸入數據控制循環次數 MAR *AR5+0 ;修改指針 MAR *AR5-0 ;循環了B+1次,宜循環B次 b: 程序中,當輸入為新數據時執行a段程序,而輸入數據不變時,跳過a段程序。為了使不同情況下執行時間相差不大,a段程序指令不宜太多。 雖然進制數小的QAM也具有上述規律,但用上述方法實現進制數較小的QAM時,在指令上,并沒有比逐比特判斷修改地址方法少,所以進制數較小的QAM仍
20、用逐比特判斷來修改地址指針AR5、AR6。 2.3 技術難點分析 (1)數據如何輸入的問題 數據輸入有串行和并行輸入方式,本程序中將使用并行輸入。盡管在調制器框圖中是串行輸入,然后經過串/并轉換的,但是在程序中實現串/并轉換無疑將占用一定的時間。為了使調制器速率盡可能快,同時考慮到DSP擁有并行接口,我們將用硬件來換取速率,將串/并轉換功能由外部硬件實現,而程序中只考慮并行輸入數據。而并行輸入數據中哪幾位送正弦載波路,哪幾位送余弦載波路,由每種具體的調制進行具體的判斷。 (2)新數據的判斷問題 判斷新輸入的到來,最簡單的方法是用計數器,設每位輸入數據對應M個點,則計數器記到M時表示新數據到來,
21、雖然能準確判斷新數據的到來,但程序實現計數功能畢竟也需占用一定的時間。考慮到選用并行輸入,串/并轉換器將輸出的并行數據鎖存在鎖存器中,即QAM調制的輸入數據并不是時刻變化的,而只在新碼元到來時才發生變化。因此我們采用保存上次輸入數據的方法,將輸入新數據和上次保存數據相比,看是否相同來確定是否為新數據的方法,不同則表示輸入數據為新數據,反之不是新數據。但是用這種方法判斷,在輸入新數據和上次數據相同時,并不判斷為新數據到來,為了不讓尋址出錯,必須采用循環尋址的方法。 (3)輸入新數據和上次輸入數據相同時的循環尋址問題8無論上述哪一種修改地址的方法,在輸入新數據和上次輸入數據相同時,程序不根據此數據
22、進行幅值的地址修改,宜在原來幅值的存儲單元的內循環尋址,以免出錯。但是進行循環尋址要求緩沖區地址始于最低N位為零的地址,且緩沖區的大小R值滿足R<2N,當地址的低N位值大于R時,低N位自動清0,從而實現循環尋址。程序中R=16,N必須為5(占個存儲單元),這樣各種幅值的數據就不能連在一起存放。因此為了循環尋址,必須使同種QAM的各種幅值數據間間隔32,而不是16。若將各幅值數據連續存儲,即間隔為16,則不能用循環尋址,此時只能判斷緩沖區地址的低4位,當低4位為0時,將地址減16,使地址重新指向原來幅值的起始位置(如程序中所用)。 3225= (4)循環次數的置數問題 循環次數不設置為B-
23、1,使其直接循環B次,而將循環次數設置為B,循環B+1次,然后再做一次與循環操作相反的操作。這是因為當B為0時,在DSP中循環次數置數為FFFFH,程序執行時,雖然最后地址也修改正確了,但通過測試程序執行時間,發現執行完該段程序后指令周期數突然增加到一個很大的值,原因是要循環的指令執行了FFFF+1次,而不是0次。為了使B為0時,執行時間不出現異常,讓程序先多做一次循環,循環完后再做一次反循環,從而達到循環B次的目的。 (5)映射表問題 為了使QAM調制器有更強的適應性,使其能適應不同星座圖編碼的調制,而不是對不同星座圖編碼用不同的程序實現,程序中增加了映射表。這樣針對不同編碼方式的星座圖,只
24、需修改映射表,就可以用該調制器實現具體的調制。更重要的是用映射表后可以使數據更有規律性,使QAM調制更容易實現,尤其是對一些進制數較大的QAM調制。 應當考慮的是,使用映射表并不會影響調制器的性能。實際上即使不用映射表,由于信道噪聲引起誤碼時,通過星座圖譯碼后誤碼仍然存在,而使用映射表時,通過映射表和星座圖譯碼,誤碼也存在,不同的只是譯出的誤碼結果不一樣而已。那么為什么要用不同星座圖編碼呢?目的是減小根據星座圖譯碼時發生錯誤譯碼的可能性,同時還有一定的保密作用。以格雷碼編碼星座圖為例,當傳輸數據相鄰時,它們的編碼只差一位,這樣在干擾嚴重而引起誤碼時,雖然譯出的結果是錯誤的,但可以在前一個譯出的
25、星座點周圍尋找這個含干擾的星座點進行譯碼,從而減小譯碼錯誤的概率。若加上映射表,在干擾嚴重而引起誤碼時,譯碼出來的結果也是錯誤的,但同樣可以在前一個譯碼出來的星座點周圍尋找著這個含干擾的星座點進行譯碼,同樣能減小錯誤概率,因而不影響性能。 由于加入映射表,因此判斷輸入數據是否為新數據有兩種方法。一、直接對輸入數據進行判斷,看本次輸入數據是否和上次輸入數據是否相同,此時保留的上次數據為輸入數據。二、對映射后的數據進行判斷,因為如果輸入數據相同,那它們的映射后數據也相同,看映射后數據與上次的映射后數據是否相同,因此此時保留的是上次輸入數據的映射后數據。程序中用第二種方法,因為后面程序也是對映射后數
26、據進行處理的,可以從指令上和資源上減少消耗。3. QAM調制器的DSP匯編語言實現 3.1 DSP匯編語言編程技術 用計算機語言編寫程序,一般分為三種,即機器語言、匯編語言、高級語言。 機器語言是一種用二進制表示指令和數據,能被機器直接識別的計算機語言。它不直觀,不易理解和記憶,因此編寫、閱讀和修改都比較繁瑣,但機器語言程序是計算機惟一能夠直接理解和執行的程序,具有執行速度快、占用內存少等特點。 高級語言(如BASIC、C)是一種容易為人識別記憶的面向過程的語言,程序員可以完全不考慮機器的結構特點,不必了解和熟記機器的指令系統,僅使用一些接近人們書寫習慣的英語和數學表達式形式的語句來編制程序。
27、高級語言編寫的程序與問題本身的數學模型之間有著良好的對應關系,可以在各種機器上通用,但不能在機器上直接執行,需要通過編譯(或解釋)程序翻譯成對應的目標程序(即機器語言程序),才能被機器運行。高級語言程序是在未考慮機器的結構特點的條件下編寫的,不能充分利用CPU所具有的特性,通過編譯程序生成的目標程序往往比較冗長、占有較多的內存空間,執行時間也較長,因而實時性要求高的場合限制了它的運用。 匯編語言是一種用助記符表示的程序設計語言,即用助記符來表示指令的操作碼和操作數,用標號或符號來代表地址、常量或變量。助記符一般都是英文字的縮寫,以便人們書寫、閱讀和檢查。實際上,匯編語言編寫的匯編語言源程序就是
28、機器語言程序的符號表示,源程序與經過匯編產生的目標程序代碼之間有明顯的對于關系,因此也稱匯編語言為符號語言。用匯編語言編寫的源程序也需要翻譯成目標程序才能被機器執行,這個翻譯過程稱為匯編。用匯編語言編寫程序能夠直接利用硬件系統的特性(如寄存器、標志、中斷系統等)直接對位、字節、字寄存器或存儲單元、I/O端口進行處理,同時也能直接使用CPU指令系統和指令系統提供的各種尋址方式,因而能編制出高質量的程序,這樣的程序不但占用內存空間少、而且執行速度快。由于源程序和所要解決的問題的數學模型之間的關系不夠直觀,使得匯編語言程序設計需要較多的軟件開發時間,也增加了程序設計過程中出錯的可能性。 在C54xD
29、SP中,軟件設計的方法通常有三種。 第一種,用C語言開發。TI公司提供了用于C語言開發的CCS(Code Composer Studio)平臺,該平臺包括了優化ANSI C編譯器,從而可以在C源程序級進行開發調試。這種方式可以增強軟件的可讀性,提高了軟件的開發速度,方便軟件的修改和移植,然而,C編譯器無法實現在任何情況下都能合理的利用DSP芯片的各種資源,且對DSP芯片的某些硬件控制,C語言不如匯編語言方便。 第二種,用匯編語言開發。此種方式代碼效率高,程序執行速度快,可以充分合理地利用芯片提供的硬件資源。然而,用匯編語言編寫程序比較煩瑣,可讀性較差,開發產品周期長,不同類別或不同公司的芯片匯
30、編語言往往不同,因此可移植性較差。 第三種,C和匯編語言混合編程開發。采用混合編程的方法能更好地達到設計要求,完成設計任務。 鑒于提高QAM調制器的數據傳輸率的要求和匯編語言開發具有的代碼效率高,程序執行速度快,并能充分合理地利用芯片提供的硬件資源的優點,我們將用匯編語言來開發QAM調制器。 C54xDSP中的匯編源程序由源說明語句組成,包含匯編語言指令、匯編偽指令、宏偽指令和注釋等,一般一句程序占據編輯器的一行。由于匯編器每行最多只能讀200個字符,因此源語句的字符數不能超過200個,一旦長度超過200個字符,匯編器將自行截去行尾的多余的字符并給出警告信息。如果截去了語句的執行部分,則程序會
31、編譯出錯或錯誤執行。匯編語言格式可以包含4個部分:標號域、指令域、操作數域和注釋域,匯編語言語句格式如下:標號: 指令 操作數列表 ;注釋其中 內的部分是可選項。C54xDSP的匯編指令按功能可分為:數據傳送指令、算術運算指令、邏輯運算指令、程序控制指令。其中數據傳送指令包括裝載指令、存儲指令、條件存儲指令、并行裝載和存儲指令、并行裝載和乘法指令、并行存儲和加/減指令等。算術運算指令包括加法指令、乘法指令、乘法-累加指令、乘法-減法指令、雙字運算指令及特殊應用指令。邏輯運算指令包括與、或、異或、移位、及測試指令。程序控制指令包括分支轉移指令、子程序調用指令、中斷指令、返回指令、重復指令、堆棧處
32、理指令及混合程序控制指令。 3.2 用匯編語言實現QAM調制器的關鍵模塊 3.2.1 數字正弦波的產生 DSP中產生的正、余弦波形為數字波形,即用數字方法求出若干個點的正弦值,將這些值作為一個整體一一存儲,通過循環讀取即可產生數字正、余弦波形,其實質就是對模擬正弦波形進行采樣。由sinx=x-x3/3!+x5/5!-x7/7!+x9/9! cosx=1-x2/2!+x4/4!-x6/6!+x8/8! 計算出以0.5o為間隔的0o45o的sin(x)、cos(x)值,再根據sin(2x)=2sinxcosx,求出以1o為間隔的0o90o的sin(x),經過復制和求反即產生0o360o間的360點
33、的sin(x)。程序如下:.title "sin.asm" ;文件名 .mmregs .def _c_int00 .ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosx ;引用其他地方定義的變量 sin_x .usect "sin_x",360 ;定義360個存儲空間 STACK .usect "STACK",10 ;定義堆棧段 k_theta .set 286 ;0.5/360*PI*32768 PA0 .set 0 ;定義兩個端口 PA1 .set 1 .text *產生360點的正弦波* _c_int00:
34、 STM #STACK+10,SP ;SPSTACK+10 STM k_theta,AR0 ;AR0-k_theta STM 0,AR1 ;AR1=0(rad) STM #sin_x,AR6 ;AR6-sin_x STM #90,BRC ;from sin0-sin90 RPTB loop1-1 LDM AR1,A ;A=AR1 LD #d_xs,DP STL A,d_xs ;弧度值送給sin函數的輸入 STL A,d_xc ;d_xc-x(rad) CALL sinx ;d_sinx=sinx CALL cosx ;d_cosx=cosx LD #d_sinx,DP LD d_sinx,16
35、,A ;AH=sinx MPYA d_cosx ;B=sinx*cosx STH B,1,*AR6+ ;AR6-2sinx*cosx MAR *AR1+0 ;AR1=AR1+0.5(弧度) loop1: STM #sin_x+89,AR7 ;sin91-sin179 STM #88,BRC ;循環次數為89次 RPTB loop2-1 LD *AR7-,A ;A=(AR7) STL A,*AR6+ ;(AR6)=A loop2: STM #179,BRC ;sin180-sin359 STM #sin_x,AR7 ;AR7=sin_x RPTB loop3-1 LD *AR7+,A NEG A
36、 STL A,*AR6+ ;sinx=-sin_x loop3: NOP loop: B loop *求正弦函數sinx=x-x3/3!+x5/5!-x7/7!+x9/9!* sinx: .def d_xs,d_sinx ;定義變量以便其他地方使用 .data table_s: .word 01c7h ;1/72*32768 .word 030bh ;1/42*32768 .word 0666h ;1/20*32768 .word 1556h ;1/6*32768 d_coef_s .usect "coef_s",4 ;定義系數空間 d_xs .usect "si
37、n_vars",1 ;sin函數的輸入 d_squr_xs .usect "sin_vars",1 ;存放x的平方值 d_temp_s .usect "sin_vars",1 d_sinx .usect "sin_vars",1 ;sin函數的輸出 d_l_s .usect "sin_vars",1 .text SSBX FRCT STM #d_coef_s,AR5 ;搬移系數 RPT #3 MVPD #table_s,*AR5+ STM #d_coef_s,AR3 STM #d_xs,AR2 ;AR2-
38、x STM #d_l_s,AR4 ST #7FFFh,d_l_s ;AR4-d_l_s=1 SQUR *AR2+,A ;A=x2 ST A,*AR2 ;(AR2)=x2 |LD *AR4,B ;B=1 MASR *AR2+,*AR3+,B,A ;A=1-x2/72 T=x2 MPYA A ;A=x2(1-x2/72) STH A,*AR2 ;(AR2)=x2(1-x2/72) MASR *AR2-,*AR3+,B,A ;A=1-x2/42(1-x2/72) MPYA *AR2+ ;B=x2(1-x2/42(1-x2/72) ;(AR2)=x2 ST B,*AR2 ;(AR2)=x2(1-x2/
39、42(1-x2/72) |LD *AR4,B ;B=1 MASR *AR2-,*AR3+,B,A ;A=1-x2/20(1-x2/42(1-x2/72) MPYA *AR2+ ;B=x2(1-x2/20(1-x2/42(1-x2/72) ST B,*AR2 |LD *AR4,B MASR *AR2-,*AR3+,B,A ;A=1-x2/6(1-x2/20(1-x2/42(1-x2/72) MPYA d_xs ;B=A*x STH B,d_sinx ;d_sinx=sinx RET *求余弦函數cosx=1-x2/2!+x4/4!-x6/6!+x8/8!* cosx: .def d_xc,d_c
40、osx d_coef_c: .usect "coef_c",4 ;定義系數空間 .data table_c: .word 0249h ;1/56*32768 .word 0444h ;1/30*32768 .word 0aabh ;1/12*32768 .word 4000h ;1/2*32768 d_xc .usect "cos_vars",1 ;cos函數的輸入 d_squr_xc .usect "cos_vars",1 ;存放x的平方值 d_temp_c .usect "cos_vars",1 d_cosx
41、.usect "cos_vars",1 ;cos函數的輸出 d_l_c .usect "cos_vars",1 .text SSBX FRCT LD #8,DP ;指向第8頁,與連接文件有關 STM #d_coef_c,AR5 ;搬移系數 RPT #3 MVPD #table_c,*AR5+ STM #d_coef_c,AR3 STM #d_xc,AR2 STM #d_l_c,AR4 ST #7FFFh,d_l_c SQUR *AR2+,A ;A=x2 ST A,*AR2 ;(AR2)=x2 |LD *AR4,B MASR *AR2+,*AR3+,B,A
42、 ;A=1-x2/56 T=x2 MPYA A ;A=x2(1-x2/56) STH A,*AR2 ;(AR2)=x2(1-x2/56) MASR *AR2-,*AR3+,B,A ;A=1-x2/30(1-x2/56) MPYA *AR2+ ;B=x2(1-x2/30(1-x2/56) ST B,*AR2 |LD *AR4,B ;B=1 MASR *AR2-,*AR3+,B,A ;A=1-x2/12(1-x2/30(1-x2/56) SFTA A,-1,A ;1/2 NEG A ;-1/2 MPYA *AR2+ ;B=-x2/2(1-x2/12(1-x2/30(1-x2/56) MAR *AR
43、2+ RETD ADD *AR4,16,B STH B,d_cosx RET3.2.2 可調頻率正交載波的產生 對360點正弦波直接進行等間隔采樣,通過選擇不同的采樣點數M,即能產生頻率可變的數字正弦波;對于M點正弦波,直接對360點正弦波均勻采樣即可,而對于M點余弦波,先對360點正弦波的90o360o等間隔采樣,再對0o90o等間隔采樣,從而得到M點的數字余弦波。等間隔采樣通過尋址地址每次遞增一個固定的值來實現。程序如下:ax .usect "smp",32 ay .usect "smp",32 S .set 16-1 ;一個數據兩個波形16個點 .
44、text *產生一個幅值的16點的正余弦波* STM #sin_x,AR2 ;AR2-sin_x STM #ax,AR3 ;AR3-ax STM #45,AR0 ;AR0=45 STM #7,BRC ;從sinx取8個點生成sinx RPTB loop4-1 LD *AR2+0,A ;每隔45個點取一個點 STL A,*AR3+loop4: STM #sin_x+90,AR1 STM #ay,AR4 STM #45,AR0 STM #5,BRC RPTB loop5-1 ;每隔45點采樣6次 LD *AR1+0,A ;A=(AR1) STL A,*AR4+ ;(AR4)=A loop5: ST
45、M #sin_x,AR2 STM #1,BRC ;再取余弦所需的兩個點 RPTB loop6-1 LD *AR2+0,A STL A,*AR4+ ;從sinx取8個點生成cosx loop6: STM #7,BRC ;由產生的正、余弦得到兩個周期的波形 STM #ax,AR5 ;AR5-ax STM #ax+8,AR6 ;AR6ax+8 STM #ay,AR3 ;AR3-ay STM #ay+8,AR4 ;AR4ay+8 RPTB loopa-1 LD *AR5+,A ;A=(AR5) STL A,*AR6+ ;(AR6)=A LD *AR3+,A STL A,*AR4+ ;產生16點的兩個波
46、形的sin,cos loopa:3.2.3 QAM已調波形的產生將M點數字正、余弦波形的所有數據乘以一個用DSP中數據表示的幅值,即得到相應幅值的正、余弦波形。16QAM的已調波形產生程序如下: bx .usect "smp",48 by .usect "smp",48 S .set 16-1 ;一個數據兩個波形16個點 .text *產生兩個幅值的16點的正余弦波* STM #S,BRC ;置循環次數 STM #bx,AR2 ;AR2-bx STM #ax,AR1 ;AR1-ax RPTB loop8-1 LD *AR1+,A STL A,*AR2+
47、;產生幅值為1的sin loop8: STM #ax,AR3 STM #S,BRC RPTB loop9-1 MPY *AR3+,#2AAAh,A ;2AAAh為1/3*32768 STH A,*AR2+ ;產生幅值為1/3的sin loop9: STM #by,AR4 ;AR4-by STM #ay,AR1 ;AR1-ay STM #S,BRC RPTB loop10-1 LD *AR1+,A STL A,*AR4+ ;產生幅值為1的cos loop10: STM #ay,AR2 ;AR2-ay STM #S,BRC RPTB loop11-1 MPY *AR2+,#2AAAh,A ;A=(
48、AR2)*1/3 STH A,*AR4+ ;產生幅值為1/3的cos loop11:3.2.4 QAM調制 根據QAM調制的實現方案,可以畫出QAM調制的流程圖(如圖2.1)。圖2.1a為16QAM調制流圖,采用逐比特判斷修改地址的方法進行調制;圖2.1b為64QAM調制流圖,采用根據規律重復修改地址的方法進行調制。由流程圖能夠方便地編寫QAM調制的程序,64QAM的調制程序如下: *64QAM調制,85至103個指令周期* modu64: STM #b64,AR5 RPT #63 MVPD tab64,*AR5+ ;將表送到數據區 STM #cx+64,AR1 STM #cy+64,AR2
49、;AR1,AR2指向預留空間 STM #cx+48,AR5 STM #cy+48,AR6 ;AR5,AR6指向初值為0的波形 STM #out,AR4 ;AR4-out LD #14,DP ;設置頁指針為14,700h-7FFh STM #16,AR0 ;AR0=16 STM #n,AR7 ;AR7-n STM #16,BK ;緩沖區為16個存儲單元 ST #0,in+1 ;(in+1)=0 startc: XC 2,NBIO B startc PORTR PA1,in ;從PA1輸入數據 STM #b64,AR3 ;AR3指向表頭地址 LDM AR3,B ;表頭地址送B ADD in,B ;
50、將讀入數據與表頭相加生成映射地址 STLM B,AR3 ;將生成映射地址送入AR3以便查表 NOP ;解除沖突 LD in+1,A ;輸出上次查表數據LD *AR3,B ;將映射后的數據送入B XOR B,A ;A,B異或,結果放A,判斷是否相同 STL B,in+1 ;保存映射后數據 RSBX TC XC 1,ANEQ ;映射后數據與上次映射后數據不同 SSBX TC ;則將測試位置為1,表示新數據到來 AND #011B,B,A ;A=(in+1)011測試低3bit SUB #3,A NEG A ;A=3-A,A為循環次數 BC a,TC ;新數據到來宜修改指針 B b a: STM #
51、cx,AR5 ;指向數據塊初始地址后修改 STL A,*AR7 ;置循環次數 RPT *AR7 ;映射后數據控制循環次數 MAR *AR5+0 ;修改指針 MAR *AR5-0 ;循環了B+1次,宜循環B次 b: AND #4,B,A ;(in+1)與100相與判斷符號 LD *AR5+,B NOP XC 1,AGT ;符號位為1時取反 NEG B STL B,*AR1 ;處理后的數據放(bx+32) LDM AR5,A ;A=AR5 AND #000Fh,A ;測試AR5的低4位 LD *AR3,B AND #011000B,B ;B=(AR3)011000測試高3bit XC 1,AEQ
52、;AR5低4位為0,即地址加了16次后 MAR *AR5-0 ;使地址回到該存儲塊起始位循環尋址 SFTA B,-3,A ;A=B>>3 SUB #3,A NEG A ;A=3-A,A為循環次數 XC 2,TC ;新數據到來時修改指針 B c B d c: STM #cy,AR6 ;AR6指向初始地址 STL A,*AR7 ;置循環次數 RPT *AR7 ;映射后數據控制循環次數 MAR *AR6+0 ;修改指針 MAR *AR6-0 ;循環了A+1次,宜循環A次 d: LD #32,A AND *AR3,A ;(AR3)與100000相與判斷符號 LD *AR6+,B NOP X
53、C 1,AGT ;符號位為1取反 NEG B STL B,*AR2 LDM AR6,A ;A=AR6 AND #000Fh,A ;測試AR6的低4位 LD *AR1+%,B ADD *AR2+%,B STL B,*AR4 ;疊加后輸出 XC 1,AEQ ;AR6低4位為0,即地址加了16次后 MAR *AR6-0 ;使地址回到該存儲塊起始位循環尋址 BD startc PORTW *AR4,PA24. QAM調制器的仿真與分析 4.1 QAM調制器的仿真 程序調通后,執行程序到調制處理前(即已調波形產生后),用波形顯示已調波形。選擇View/Graph/Time/Frequency,修改其中的
54、某些參數,起始地址為要顯示數據的數據存放地址(0x0D40),獲取緩沖區大小為需要顯示數據塊的大小(288),顯示數據大小為用波形顯示出的數據點數(288),DSP數據類型為16- bit signed integer, Q-value為15,點擊OK顯示波形。256QAM已調波形的仿真波形如圖3.1,從仿真波形可以看出,程序產生了8個幅值的正、余弦波形,每個幅值含兩個整周期。圖3.1 256QAM已調波形的仿真波形在CCS中用星座圖顯示QAM調制器的星座圖,選擇View/Graph/ constellation,與波形顯示相似,修改其中的某些參數,得到64QAM的星座圖結果如圖3.2。從星座
55、圖可以看出,已調波形的幅值是正確的。圖3.2 64QAM的星座圖仿真為了在CCS中對調制結果進行軟件仿真,需對程序進行一些修改。由于程序中都采用了間接尋址,使得所有輔助寄存器都分配給了程序,為了空出一個寄存器專門用于讀入仿真輸入數據,將指向循環次數的AR7寄存器空出,程序中所有*AR7改成絕對尋址*(n)或直接尋址n。將從端口讀入數據的指令PORTR PA1,in改成從存儲區讀入數據LD *AR7+,B STL B,in,當然必須先把輸入數據倒入存儲區(在程序中某處設置探針,選擇File/File I/0,打開File Input選項,點擊Add File,選擇數據文件后,點擊Add Prob
56、e Point連接探針,在Probe Point中選擇探針位置和在Connect中連接文件后,點擊Replace,確定后回到File I/0對話框,Probe顯示Connected,再輸入與數據文件中一致的起始地址和長度,連接完成,執行程序到探針處時即會將數據倒入到存儲區),使AR7指向倒入的數據。為了用波形顯示調制結果,必須分配一塊存儲區保留調制處理的結果,對輸出數據的地址進行修改,將指令中PORTW *AR4,PA2改成PORTW *AR4+,PA2。 運行程序后,用波形顯示調制結果。選擇View/Graph/Time/Frequency,修改其中的某些參數,起始地址為0x076C,獲取緩
57、沖區大小為64(因為輸入數據中只有四個數據),顯示數據大小為64,DSP數據類型為16- bit signed integer,Q-value為15,點擊OK顯示波形。 64QAM輸入為1,2,3,4時仿真如圖3.3。通過數字電視的映射表映射后1,2,3,4分別對應001000B,000001B,001001B,011000B。1是幅值為1/7的正弦波與幅值為3/7的余弦波疊加,第一個點為0+3/7=3/7,2是幅值為3/7的正弦波與幅值為1/7的余弦波疊加,第一個點為0+1/7=1/7,3是幅值為3/7的正、余弦波疊加,第一個點為0+3/7=3/7,4是幅值為1/7的正弦波與幅值為1的余弦波疊加,第一個點為0+1=1。通過對第一個點和其他點的分析可以看出仿真結果是符合理論結果的,是正確的。圖3.3 64QAM輸入為1,2,3,4時的仿真圖圖3.4 64QAM輸入為4,5,6,7時的仿真圖輸入為4,5,6,7時仿真如圖3.4。通過數字電視的映射表映射后4,5,6,7分別對應011000B,010000B,011001B,010001B。4是幅值為1/7的正弦波與幅值為1的余弦波疊加,第一個點為0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論