




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第
頁
北京郵電大學(xué)
基于Matlab的MIMO通信系統(tǒng)仿真
班 級(jí):
姓 名:
學(xué) 號(hào):
日 期:
目錄
TOC\o"1-3"\h\u
一、概述 3
(1)課設(shè)目的 3
(2)數(shù)字通信系統(tǒng)概述 3
二、基本原理
3
(1)MIMO系統(tǒng)理論
3
(2)MIMO系統(tǒng)模型 4
(3)分集與復(fù)用
4
三、仿真設(shè)計(jì) 7
(1)流程圖 7
(2)主要模塊 8
(3)主要參數(shù) 11
四、程序塊設(shè)計(jì) 11
(1)結(jié)構(gòu)性和關(guān)鍵語句 11
信源產(chǎn)生 11
信道編碼 11
調(diào)制 11
MIMO信道模型 12
(2)狀態(tài)檢驗(yàn)和性能測(cè)試 13
信源產(chǎn)生 13
調(diào)制 14
MIMO信道模型仿真 17
五、不同仿真條件下測(cè)試誤碼性能 18
六、仿真結(jié)果與分析 19
七、重點(diǎn)研究問題 19
八、結(jié)論(心得體會(huì)) 20
九、參考文獻(xiàn) 20
概述
課設(shè)目的
本課程設(shè)計(jì)的目的是了解移動(dòng)通信關(guān)鍵技術(shù)、了解數(shù)字通信系統(tǒng)仿真流程,學(xué)會(huì)用Matlab實(shí)現(xiàn)基本的信道編譯碼、調(diào)制解調(diào)等通信模塊。學(xué)習(xí)并實(shí)現(xiàn)MIMO空時(shí)處理技術(shù),通過本次實(shí)踐學(xué)習(xí)和掌握性能分析的思路和方法。
(2)數(shù)字通信系統(tǒng)概述
信道中傳輸?shù)氖菙?shù)字信號(hào)的通信方式稱為數(shù)字通信,它包括將基帶數(shù)字信號(hào)直接送往信道傳輸?shù)臄?shù)字基帶傳輸和經(jīng)載波調(diào)制后在送往信道傳輸?shù)臄?shù)字載波傳輸。對(duì)應(yīng)的通信系統(tǒng)稱為數(shù)字通信系統(tǒng)。具體的通信流程如上圖所示。數(shù)字通信具有如下特點(diǎn):抗特點(diǎn)干擾能力強(qiáng),無噪聲積累;保密性能好;便于組成現(xiàn)代化數(shù)字通信網(wǎng),便于實(shí)現(xiàn)多媒體通信和占用信道頻帶寬。
基本原理
MIMO系統(tǒng)理論:
MIMO(Multiple-InputMultiple-Out-put)表示多輸入多輸出。
MIMO的優(yōu)點(diǎn)是能夠增加無線范圍并提高性能。MIMO允許多個(gè)天線同時(shí)發(fā)送和接收多個(gè)空間流。它允許天線同時(shí)傳送和接收。利用MIMO技術(shù)可以提高信道的容量,同時(shí)也可以提高信道的可靠性,降低誤碼率。前者是利用MIMO信道提供的空間復(fù)用增益,后者是利用MIMO信道提供的空間分集增益。
核心思想:時(shí)間上空時(shí)信號(hào)處理和空間上分集相結(jié)合。
時(shí)間上空時(shí):通過在發(fā)送端采用空時(shí)碼實(shí)現(xiàn),如空時(shí)分組、空時(shí)格碼,分層空時(shí)碼。
空間上分集:通過增加空間上天線分布實(shí)現(xiàn)??梢园言瓉韺?duì)用戶來說是有害的無電波多徑傳播轉(zhuǎn)變?yōu)閷?duì)用戶有利。
MIMO系統(tǒng)模型:
代表發(fā)送天線,代表接收天線。
信道矩陣:
接收矢量:,即接收信號(hào)為信道衰落系數(shù)發(fā)射信號(hào)+接收端噪聲
從上圖可以看到,MIMO模型中有一個(gè)空時(shí)編碼器,有多根天線,其系統(tǒng)模型和上述MIMO系統(tǒng)理論一致。發(fā)送天線的數(shù)目要大于接收天線,因?yàn)橐话銇碚f,移動(dòng)終端所支持的天線數(shù)目總是比基站端要少。
分集與復(fù)用:
根據(jù)各根天線上發(fā)送信息的差別,MIMO可以分為發(fā)射分集技術(shù)和空間復(fù)用技術(shù)。
發(fā)射分集:在不同的天線上發(fā)射包含同樣信息的信號(hào)(信號(hào)的具體形式不一定完全相同),達(dá)到空間分集的效果,起到抗衰落的作用
典型代表:空時(shí)塊碼(STBC)
空間復(fù)用:在不同的天線上發(fā)射不同的信息,獲得空間復(fù)用增益,從而大大提高系統(tǒng)的容量和頻譜利用率
典型代表:分層空時(shí)碼
空時(shí)塊碼(STBC)
Alamouti提出了采用兩個(gè)發(fā)射天線和一個(gè)接收天線的系統(tǒng)可以得到采用一個(gè)發(fā)射天線兩個(gè)接收天線系統(tǒng)同樣的分集增益。
將每個(gè)輸入字符映射為一個(gè)矩陣,矩陣的每行對(duì)應(yīng)在個(gè)不同的時(shí)間間隔里不同天線上所發(fā)送的符號(hào)。
在此例中,信源發(fā)送的二進(jìn)制信息比特首先進(jìn)行星座映射。假設(shè)采用4進(jìn)制的調(diào)制星座,有。將從信源來的二進(jìn)制信息比特,每2比特分為一組(此例中是x1和x2),對(duì)連續(xù)的兩組比特進(jìn)行星座映射,得到兩個(gè)調(diào)制符號(hào)x1,x2。把這兩個(gè)符號(hào)送入編碼器,并按照如下方式編碼:
在第一個(gè)發(fā)送時(shí)刻,符號(hào)在天線1上發(fā)送出去,符號(hào)在天線2上發(fā)送出去。第二個(gè)時(shí)刻,符號(hào)在天線1上發(fā)送出去,符號(hào)在天線2上發(fā)送出去。可以看出,兩幅發(fā)送天線上發(fā)送信號(hào)批次存在著一定的關(guān)系,因此這種空時(shí)碼是基于發(fā)送分集的。兩幅發(fā)送天線上發(fā)送的信號(hào)滿足正交特性。
考慮兩個(gè)發(fā)送天線,一個(gè)接收天線的情況:
假設(shè)接收端可以完全準(zhǔn)確地估計(jì)出信道的衰落系數(shù)和,在接收端采用最大似然估計(jì),從星座中找出一對(duì)符號(hào),該符號(hào)即最終接收端認(rèn)為發(fā)送端發(fā)送的符號(hào)。在程序中,其判決式為:
其中,是根據(jù)信道衰落系數(shù)和接收信號(hào)進(jìn)行合并得到的信號(hào)。
考慮多接收天線的情況:
多天線系統(tǒng)中,發(fā)送端的編碼與傳輸方案和單接收天線系統(tǒng)一樣。只是在接收端的處理變得復(fù)雜,需要對(duì)不同接收天線上接收到的信號(hào)進(jìn)行合并處理。多接收天線下的判決度量可以通過把各副接收天線上的接受信號(hào)得到的判決度量線性合并得到。判決式如下:
分層空時(shí)碼(BLAST)
空時(shí)編碼利用多天線組成的天線陣同時(shí)發(fā)送和接收。在發(fā)送端,將數(shù)據(jù)流分離成多個(gè)支流,對(duì)每個(gè)支流進(jìn)行空時(shí)處理和信號(hào)設(shè)計(jì)(空時(shí)編碼),然后通過不同天線同時(shí)發(fā)送;在接收端,利用天線陣接收,并經(jīng)過空時(shí)處理和空時(shí)碼解碼,還原成發(fā)送數(shù)據(jù)流。
串并變換
信道編碼器1
信道編碼器2
空時(shí)編碼
調(diào)制器1
調(diào)制器2
天線1
天線n
圖1分層空時(shí)碼的發(fā)射端系統(tǒng)模型
在接收端,用多個(gè)天線分集接收,信道參數(shù)通過信道估計(jì)獲得,由線性判決反饋均衡器實(shí)現(xiàn)分層判決反饋干擾抵消,然后進(jìn)行分層空時(shí)譯碼,單個(gè)信道譯碼器完成信道譯碼,分層空時(shí)碼接收端系統(tǒng)框圖如下圖所示:
信道估計(jì)
線性判決反饋均衡器
空時(shí)譯碼
信道譯碼
天線1
天線2
圖2分層空時(shí)碼的接收端系統(tǒng)模型
最后的系統(tǒng)結(jié)構(gòu)圖:
仿真設(shè)計(jì)
流程圖
利用ML準(zhǔn)則進(jìn)行判決
解調(diào),進(jìn)行維特比譯碼
結(jié)束
主要模塊
信源產(chǎn)生
要求:產(chǎn)生獨(dú)立等概二進(jìn)制信源
Matlab函數(shù):randsrc()
信道編碼
利用卷積碼來進(jìn)行信道編碼
根據(jù)3GPPTS36.212的規(guī)定,可選取如上所示的卷積碼來進(jìn)行信道編碼。
卷積碼
卷積碼與分組碼不同,其編碼器具有記憶性,即編碼器的當(dāng)前輸出不僅與當(dāng)前輸入有關(guān),還跟以前時(shí)刻的輸入有關(guān)。速率R=k/n、存儲(chǔ)器階數(shù)為m的卷積編碼器可用k個(gè)輸入、n個(gè)輸出、輸入存儲(chǔ)器階數(shù)為m的線性序貫電路實(shí)現(xiàn),即輸入在進(jìn)入編碼器后仍會(huì)多存儲(chǔ)m個(gè)時(shí)間單元。通常,n和k都是比較小的整數(shù),k<n,信息序列被分成長(zhǎng)度為k的分組,碼字被分成長(zhǎng)度為n的分組。當(dāng)k=1時(shí),信息序列無需分組,處理連續(xù)進(jìn)行。值得注意的是,卷積碼不像分組碼,較大的最小距離和低錯(cuò)誤概率不是通過增加k和n實(shí)現(xiàn)的,而是通過增加存儲(chǔ)器階數(shù)m實(shí)現(xiàn)的。
卷積碼的編碼分為兩類:前饋和反饋。
卷積碼的譯碼可以分成兩大類:代數(shù)譯碼的門限譯碼、概率譯碼的序列譯碼與維特比譯碼。在該數(shù)字通信系統(tǒng)中,我們采用的是維特比譯碼。
最大似然譯碼:
如果所有碼字都是等概率發(fā)送,則最佳的譯碼方法是:收到序列r后,譯碼器對(duì)所有個(gè)碼字計(jì)算條件概率。若某一個(gè)似然函數(shù)取最大值,則譯碼器認(rèn)為碼字就是最可能發(fā)送的碼字這種譯碼方案稱為最大似然譯碼,它的譯碼錯(cuò)誤概率最小,但復(fù)雜性卻隨碼長(zhǎng)呈指數(shù)增長(zhǎng)。
在維特比譯碼中,硬判決時(shí),信道可假設(shè)為較理想的二進(jìn)制對(duì)稱BSC信道,此時(shí)最大似然準(zhǔn)則又可等效于最小漢明距離準(zhǔn)則;而軟判決則常用最大似然準(zhǔn)則。
在本題中,我們采用的是硬判決。
(2)譯碼算法:
它主要由路徑度量的“加比選”運(yùn)算、度量的更新、路徑的更新、最大似然路徑的回溯等幾個(gè)過程組成。它不是在網(wǎng)格圖上依次比較所有的路徑,而是接收一段,計(jì)算比較一段,保留最有可能的路徑,從而使整個(gè)碼序列是一個(gè)最大似然序列。Viterbi譯碼算法的步驟可以簡(jiǎn)述如下:
從某一時(shí)間單位j=m開始,對(duì)進(jìn)入每一狀態(tài)的所有長(zhǎng)為j段分支的部分路徑,計(jì)算部分路徑度量。對(duì)每一狀態(tài),挑選并存貯一條有最大度量的部分路徑及其部分度量值,稱此部分路徑為幸存路徑。
j增加1,把此時(shí)刻進(jìn)入每一狀態(tài)的所有分支度量,和同這些分支相連的前一時(shí)刻的幸存路徑的度量相加,得到了此時(shí)刻進(jìn)入每一狀態(tài)的幸存路徑,加以存儲(chǔ)并刪去其它所有路徑,因此幸存路徑延長(zhǎng)了一個(gè)分支。
若j<L+m,則重復(fù)以上各步,否則停止,譯碼器得到了有最大路徑度量的路徑。
卷積碼的距離特性決定了它的糾錯(cuò)性能,而卷積碼的性能取決于所采用的譯碼方法及碼的距離特性。
調(diào)制
調(diào)制模塊基本要求:QPSK
在數(shù)字信號(hào)的調(diào)制方式,QPSK四相移鍵控是目前最常用的一種衛(wèi)星數(shù)字信號(hào)調(diào)制方式,它具有較高的頻譜利用率、較強(qiáng)的抗干擾性、在電路上實(shí)現(xiàn)也較為簡(jiǎn)單。
QPSK信號(hào)的正弦載波有4個(gè)可能的離散相位狀態(tài),每個(gè)載波相位攜帶2個(gè)二進(jìn)制信號(hào)。QPSK利用載波的四種不同相位來表征數(shù)字信息。因此,對(duì)于輸入的二進(jìn)制數(shù)字序列應(yīng)該進(jìn)行分組,將每?jī)蓚€(gè)比特編為一組;然后用四種不同的載波相位去表征它們。例如,若輸入二進(jìn)制數(shù)字信息序列為10110100,則可將它們分成10,11,01,00,然后用四種不同的相位來分別表示它們。
QPSK是在M=4時(shí)的調(diào)相技術(shù),它規(guī)定了四種載波相位,分別為45°,135°,225°,315°,
調(diào)制器
輸入的數(shù)據(jù)是二進(jìn)制數(shù)字序列,為了能和四進(jìn)制的載波
相位
配合起來,則需要把二進(jìn)制數(shù)據(jù)變換為四進(jìn)制數(shù)據(jù),這就是說需要把二進(jìn)制數(shù)字序列中每?jī)蓚€(gè)比特分成一組,共有四種組合,即00,01,10,11,其中每一組稱為雙比特碼元。每一個(gè)雙比特碼元是由兩位二進(jìn)制信息比特組成,它們分別代表四進(jìn)制四個(gè)符號(hào)中的一個(gè)符號(hào)。QPSK中每次調(diào)制可傳輸2個(gè)信息比特,這些信息比特是通過
載波
的四種相位來傳遞的。解調(diào)器根據(jù)星座圖及接收到的載波信號(hào)的相位來判斷發(fā)送端發(fā)送的信息比特。
下圖為QPSK系統(tǒng)調(diào)制圖。
AWGN信道
加性高斯白噪聲AWGN(AdditiveWhiteGaussianNoise)是最基本的噪聲與干擾模型。
加性噪聲:疊加在信號(hào)上的一種噪聲,通常記為n(t),而且無論有無信號(hào),噪聲n(t)都是始終存在的。因此通常稱它為加性噪聲或者加性干擾。
白噪聲:噪聲的功率譜密度在所有的頻率上均為一常數(shù),則稱這樣的噪聲為白噪聲。如果白噪聲取值的概率分布服從高斯分布,則稱這樣的噪聲為高斯白噪聲。
Matlab實(shí)現(xiàn):randn()
MIMO原理
在基本原理中已經(jīng)介紹過
主要參數(shù)
程序塊設(shè)計(jì)
結(jié)構(gòu)性和關(guān)鍵語句
信源產(chǎn)生
因?yàn)橛蓃andsrc()產(chǎn)生的信源序列是+1和-1的序列,而進(jìn)行卷積碼編碼時(shí)輸入編碼器的序列必須是單極性不歸零序列,所以要將序列中的-1修改為0.
信道編碼
根據(jù)圖可得,有6個(gè)寄存器,1個(gè)輸入和2個(gè)輸出。
將編碼器的3個(gè)沖激響應(yīng)寫成二進(jìn)制序列,最后轉(zhuǎn)化成八進(jìn)制,最后得到的結(jié)果為133,171,165,為八進(jìn)制的表示形式。
其中卷積碼的解碼深度設(shè)為8
調(diào)制
在進(jìn)行編寫的過程中,最初沒有想到調(diào)用Matlab已經(jīng)封裝好了的QPSK的調(diào)制函數(shù)而是自己編寫了一個(gè)函數(shù),先進(jìn)行了仿真。
先進(jìn)行了符號(hào)映射。
加入噪聲,因?yàn)檩斎氲氖菑?fù)信息,所以加入的噪聲為復(fù)噪聲
誤碼率和誤比特率的公式
MIMO信道模型仿真
AWGN信道
因?yàn)椴捎肣PSK調(diào)制產(chǎn)生的信號(hào)是復(fù)信號(hào),所以在信號(hào)上疊加的高斯白噪聲也應(yīng)該是復(fù)噪聲。
在實(shí)際中,是將從信源來的二進(jìn)制信息比特,每2比特分為一組(此例中是x1和x2),對(duì)連續(xù)的兩組比特進(jìn)行星座映射,得到兩個(gè)調(diào)制符號(hào)x1,x2。把這兩個(gè)符號(hào)送入編碼器,并按照如下方式編碼
在這里,我并沒有采用將從信源傳來的信息進(jìn)行分組的方式,而是假設(shè)x1和x2這兩路信息都是相同的,即均是QPSK_SO。這樣,相當(dāng)于簡(jiǎn)化了兩發(fā)兩收的模型。
這樣,在最大似然估計(jì)的條件下,得到的接收信號(hào)可以表示為
瑞利信道
在實(shí)現(xiàn)對(duì)瑞利信道的仿真時(shí),因?yàn)檫@時(shí)候?qū)υ碛辛烁羁痰牧私?。所以就放棄了上述的假設(shè),而是將經(jīng)過Qpsk調(diào)制的消息序列進(jìn)行了分組。實(shí)現(xiàn)了發(fā)送兩列不同的信號(hào)x1和x2的要求
兩根接收天線上接收到的信號(hào)為
根據(jù)最大似然譯碼準(zhǔn)則
則其譯碼可以表示為如下
最后的接收輸入是與QPSK星座圖上的四個(gè)星座點(diǎn)進(jìn)行比較的,判決的過程就是判決離哪個(gè)星座點(diǎn)更近。
進(jìn)行QPSK解調(diào)的時(shí)候,解調(diào)輸入為output。
狀態(tài)檢驗(yàn)和性能測(cè)試
信源產(chǎn)生
截取了隨機(jī)產(chǎn)生的+1,-1序列的一部分,根據(jù)代碼,將其中的-1全部替換成了0
(由于信源是隨機(jī)產(chǎn)生的,在不同時(shí)刻運(yùn)行程序得到的序列不同)
信道編碼
結(jié)果符合題目中給出的卷積碼編碼器的形式
通過卷積信道編碼,輸入5000個(gè)信源序列,最后輸出為15000個(gè)輸出
調(diào)制
由圖可見QPSK仿真誤碼率曲線和理論誤碼率曲線重合在一起,QPSK仿真誤比特率曲線和理論誤比特率曲線也重合在一起,誤碼率約是誤比特率的兩倍,說明實(shí)驗(yàn)方法是正確可行的。
QPSK信號(hào)的誤碼率:
QPSK信號(hào)的誤比特率:
最終在實(shí)現(xiàn)MIMO模型的時(shí)候,采用的是matlab自身封裝好的函數(shù)
結(jié)果如下所示
對(duì)應(yīng)的調(diào)制方式如下圖所示。但是在《通信原理》的學(xué)習(xí)中,我們知道該QPSK調(diào)制方式錯(cuò)到相鄰符號(hào)的概率較高。
MIMO信道模型仿真
AWGN信道
左邊為加上高斯白噪聲的信號(hào),右邊為天線上接收到的信號(hào)
瑞利信道
左圖為兩根天線上接收到的信號(hào)。
上圖為判決的結(jié)果,可以看出判決的結(jié)果證是四個(gè)星座點(diǎn)對(duì)應(yīng)的坐標(biāo)
不同仿真條件下測(cè)試誤碼性能
仿真結(jié)果與分析
由上圖可以看出,隨著信噪比的增大,誤碼率逐漸降低。
假定每一根發(fā)射天線到接收天線的衰落是獨(dú)立的,并且接收及完全知道信道系數(shù)。從上述誤碼率性能曲線仿真結(jié)果可以看出,隨著接收天線數(shù)的增加,BER性能得到了很好的改善。采用信道編碼的方式也能夠改善BER性能。相對(duì)于瑞利信道,加性高斯白噪聲信道的BER較小。且隨著接收天線數(shù)的增加,空時(shí)編碼的分集增益就越高,從而性能越好。
重點(diǎn)研究的問題
信源產(chǎn)生
根據(jù)老師的要求,用randsrc函數(shù)產(chǎn)生信源,但是randsrc函數(shù)產(chǎn)生的信源是等概分布的+1和-1序列,而卷積編碼器的輸入應(yīng)該是01序列,所以在進(jìn)入編碼器之前應(yīng)該將其中的-1變成0,引入了一個(gè)for循環(huán)。在查閱資料后發(fā)現(xiàn),其實(shí)直接設(shè)定randsrc(1,N)>.5就可以直接生成01序列。
QPSK調(diào)制
在進(jìn)行仿真時(shí),最初并不知道Matlab自帶的QPSK調(diào)制的函數(shù),所以在QPSK調(diào)制和解調(diào)的時(shí)候也花費(fèi)了很多的時(shí)間。
在自己編寫的過程中,我采用的如下圖所示的星座圖
這樣的情況下,錯(cuò)到相鄰符號(hào)的概率比較小,但是在實(shí)際調(diào)用程序的時(shí)候發(fā)現(xiàn),實(shí)際上是采用星座點(diǎn)在坐標(biāo)軸上的調(diào)制方法。
MIMO信道模型仿真
因?yàn)槭嵌嗵炀€發(fā)多天線收系統(tǒng),所以要知道h信道矩陣的形式。對(duì)于不同的信道,h的形式是不相同的。在實(shí)現(xiàn)加性高斯白噪聲信道是,認(rèn)為h的值均為1,而對(duì)于瑞利信道,認(rèn)為信道矩陣是隨機(jī)產(chǎn)生的參數(shù)值。
由于考慮到噪聲的影響,所以發(fā)送信號(hào)在通過信道之后,要疊加上噪聲。因?yàn)橥ㄟ^QPSK調(diào)制后的信號(hào)時(shí)復(fù)信號(hào),所以添加的噪聲也為復(fù)噪聲。
輸出統(tǒng)計(jì)
Eb/N0:Eb指的是平均比特能量。
Es/N0:Es指的是平均符號(hào)能量
N0是指加性噪聲的單邊功率譜密度
對(duì)于誤比特率的計(jì)算,可以直接調(diào)用matlab的自帶函數(shù)biterr。
結(jié)論(心得體會(huì))
通過兩個(gè)星期的課程設(shè)計(jì),我初步了解了基于MATLAB的MIMO通信系統(tǒng)仿真。兩個(gè)星期的課程設(shè)計(jì)過得很快。對(duì)于MIMO通信系統(tǒng),最初我們只是在《移動(dòng)通信》課上有所了解,但對(duì)于它的整個(gè)實(shí)現(xiàn)流程實(shí)際上是陌生的。在課設(shè)開始初期,我也面臨無從下手的困境,毫無頭緒。后來我根據(jù)老師給出的基本流程圖,一步步拆解,從最初產(chǎn)生信源,到最終完成兩發(fā)兩收,在這個(gè)過程中,我對(duì)基于MATLAB的MIMO通信系統(tǒng)仿真有了比較深刻的認(rèn)識(shí)。
MIMO的優(yōu)點(diǎn)是能夠增加無線范圍并提高性能。MIMO允許多個(gè)天線同時(shí)發(fā)送和接收多個(gè)空間流。它允許天線同時(shí)傳送和接收。利用MIMO技術(shù)可以提高信道的容量,同時(shí)也可以提高信道的可靠性,降低誤碼率。前者是利用MIMO信道提供的空間復(fù)用增益,后者是利用MIMO信道提供的空間分集增益。但是,后來深入了解了我才知道,MIMO不能夠克服頻率選擇性深衰落。所以出現(xiàn)了OFDM和MIMO結(jié)合在一起的技術(shù)。
整個(gè)課程設(shè)計(jì)實(shí)際上是貫穿了我們所學(xué)的專業(yè)知識(shí)。其中用到了卷積碼的編碼與譯碼,是《信息處理與編碼》的知識(shí),對(duì)于QPSK的調(diào)制,則是《通信原理》的知識(shí),而整個(gè)兩發(fā)兩收模型的實(shí)現(xiàn),更是用到了上述專業(yè)課的思想和方法,可見,要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的通信系統(tǒng)都需要這么多門課程的交叉,更不用說進(jìn)行更進(jìn)一步的科學(xué)研究了。
目前,4G技術(shù)已經(jīng)逐漸普及,未來是必要出現(xiàn)更先進(jìn)的通信技術(shù),但是無論科技如何發(fā)展,后來的技術(shù)都是對(duì)先前技術(shù)的改進(jìn)和突破。只有學(xué)好現(xiàn)有的技術(shù),才能夠發(fā)現(xiàn)其中的缺陷和弊端,才能夠找準(zhǔn)改進(jìn)的方向。
通過此次課程設(shè)計(jì),我對(duì)數(shù)字通信系統(tǒng)有了更進(jìn)一步的認(rèn)識(shí),對(duì)Matlab強(qiáng)大的仿真能力有了深刻的體會(huì)。只有靜下心來,潛心研究,認(rèn)真做事,才能達(dá)到最后的目標(biāo)。
參考文獻(xiàn)
[1]周炯磐,龐沁華,續(xù)大我,吳偉陵,楊鴻文,《通信原理》,北京郵電大學(xué)出版社
[2]林云,何豐,《MIMO技術(shù)原理及應(yīng)用》,人民郵電出版社
[3]3GPPTS36.212V9.2.0(2010-06)
[4]
/p-150110752.html
[5]ClaudeOestges,BrunoClerckx,《MIMO無線通信》,機(jī)械工業(yè)出版社
附錄資料:不需要的可以自行刪除
C語言圖形模式速成
第一節(jié)
圖形模式的初始化
TurboC提供了非常豐富的圖形函數(shù),所有圖形函數(shù)的原型均在graphics.h中,本節(jié)主要介紹圖形模式的初始化、獨(dú)立圖形程序的建立、基本圖形功能、圖形窗口以及圖形模式下的文本輸出等函數(shù)。
另外,使用圖形函數(shù)時(shí)要確保有顯示器圖形驅(qū)動(dòng)程序*.BGI,同時(shí)將集成開發(fā)環(huán)境options/Linker中的Graphicslib選為on,只有這樣才能保證正確使用圖形函數(shù)。
不同的顯示器適配器有不同的圖形分辨率。即是同一顯示器適配器,在不同模式下也有不同分辨率。因此,在屏幕作圖之前,必須根據(jù)顯示器適配器種類將顯示器設(shè)置成為某種圖形模式,在未設(shè)置圖形模式之前,微機(jī)系統(tǒng)默認(rèn)屏幕為文本模式(80列,25行字符模式),此時(shí)所有圖形函數(shù)均不能工作。設(shè)置屏幕為圖形模式,可用下列圖形初始化函數(shù):
voidfarinitgraph(intfar*gdriver,intfar*gmode,char*path);
其中g(shù)driver和gmode分別表示圖形驅(qū)動(dòng)器和模式,path是指圖形驅(qū)動(dòng)程序所在的目錄路徑。有關(guān)圖形驅(qū)動(dòng)器、圖形模式的符號(hào)常數(shù)及對(duì)應(yīng)的分辨率見graphics.h。
圖形驅(qū)動(dòng)程序由TurboC出版商提供,文件擴(kuò)展名為.BGI。根據(jù)不同的圖形適配器有不同的圖形驅(qū)動(dòng)程序。例如對(duì)于EGA、VGA圖形適配器就調(diào)用驅(qū)動(dòng)程序EGAVGA.BGI。
#include"stdio.h"
#include"graphics.h"
intmain()
{
intgdriver,gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");
bar3d(100,100,300,250,50,1);/*畫一長(zhǎng)方體*/
getch();
closegraph();
return0;
}
有時(shí)編程者并不知道所用的圖形顯示器適配器種類,或者需要將編寫的程序用于不同圖形驅(qū)動(dòng)器,TurboC提供了一個(gè)自動(dòng)檢測(cè)顯示器硬件的函數(shù),其調(diào)用格式為:
voidfardetectgraph(int*gdriver,*gmode);
其中g(shù)driver和gmode的意義與上面相同。
自動(dòng)進(jìn)行硬件測(cè)試后進(jìn)行圖形初始化:
#include"stdio.h"
#include"graphics.h"
intmain()
{
intgdriver,gmode;
detectgraph(&gdriver,&gmode);/*自動(dòng)測(cè)試硬件*/
printf("thegraphicsdriveris%d,modeis%d\n",gdriver,gmode);/*輸出測(cè)試結(jié)果*/
getch();
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");
/*根據(jù)測(cè)試結(jié)果初始化圖形*/
bar3d(100,100,300,250,50,1);/*畫一長(zhǎng)方體*/
getch();
closegraph();
return0;
}
上例程序中先對(duì)圖形顯示器自動(dòng)檢測(cè),然后再用圖形初始化函數(shù)進(jìn)行初始化設(shè)置,但TurboC提供了一種更簡(jiǎn)單的方法,即用gdriver=DETECT語句后再跟initgraph()函數(shù)就行了。
采用這種方法后,上例可改為:
#include"stdio.h"
#include"graphics.h"
intmain()
{
intgdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");
bar3d(50,50,150,30,50,1);
getch();
closegraph();
return0;
}
另外,TurboC提供了退出圖形狀態(tài)的函數(shù)closegraph(),其調(diào)用格式為:
voidfarclosegraph(void);
第二節(jié)
屏幕顏色的設(shè)置和清屏函數(shù)
對(duì)于圖形模式的屏幕顏色設(shè)置,同樣分為背景色的設(shè)置和前景色的設(shè)置。在TurboC中分別用下面兩個(gè)函數(shù):
設(shè)置背景色:
voidfarsetbkcolor(intcolor);
設(shè)置作圖色:
voidfarsetcolor(intcolor);
其中color為圖形方式下顏色的規(guī)定數(shù)值,對(duì)EGA,VGA顯示器適配器,有關(guān)顏色的符號(hào)常數(shù)及數(shù)值見graphics.h。
清除圖形屏幕內(nèi)容但不清除圖形背景使用清屏函數(shù),其調(diào)用格式如下:
voidefarcleardevice(void);
#include"stdio.h"
#include"graphics.h"
intmain()
{
intgdriver,gmode,i,aa;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");/*圖形初始化*/
setbkcolor(0);/*設(shè)置圖形背景*/
cleardevice();
for(i=0;i<=15;i++)
{
setcolor(i);/*設(shè)置不同作圖色*/
circle(320,240,20+i*10);/*畫半徑不同的圓*/
getch();
}
for(i=0;i<=15;i++)
{
setbkcolor(i);/*設(shè)置不同背景色*/
cleardevice();
circle(320,240,20+i*10);
getch();
}
aa=getmaxcolor();
printf("maxcolor=%d",aa);
getch();
closegraph();
return0;
}
另外,TURBOC也提供了幾個(gè)獲得現(xiàn)行顏色設(shè)置情況的函數(shù)。
intfargetbkcolor(void);
返回現(xiàn)行背景顏色值。
intfargetcolor(void);
返回現(xiàn)行作圖顏色值。
intfargetmaxcolor(void);
返回最高可用的顏色值。
第三節(jié)
基本畫圖函數(shù)
基本圖形函數(shù)包括畫點(diǎn),線以及其它一些基本圖形的函數(shù)。本節(jié)對(duì)這些函數(shù)作一全面的介紹。
1、畫點(diǎn)
I.畫點(diǎn)函數(shù)
voidfarputpixel(intx,inty,intcolor);
該函數(shù)表示有指定的象元畫一個(gè)按color所確定顏色的點(diǎn)。對(duì)于顏色color的值可從表3中獲得而對(duì)x,y是指圖形象元的坐標(biāo)。
在圖形模式下,是按象元來定義坐標(biāo)的。對(duì)VGA適配器,它的最高分辨率為640x480,其中640為整個(gè)屏幕從左到右所有象元的個(gè)數(shù),480為整個(gè)屏幕從上到下所有象元的個(gè)數(shù)。屏幕的左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(639,479),水平方向從左到右為x軸正向,垂直方向從上到下為y軸正向。TURBOC的圖形函數(shù)都是相對(duì)于圖形屏幕坐標(biāo),即象元來說的。
關(guān)于點(diǎn)的另外一個(gè)函數(shù)是:
intfargetpixel(intx,inty);
它獲得當(dāng)前點(diǎn)(x,y)的顏色值。
II、有關(guān)坐標(biāo)位置的函數(shù)
intfargetmaxx(void);
返回x軸的最大值。
intfargetmaxy(void);
返回y軸的最大值。
intfargetx(void);
返回游標(biāo)在x軸的位置。
voidfargety(void);
返回游標(biāo)有y軸的位置。
voidfarmoveto(intx,inty);
移動(dòng)游標(biāo)到(x,y)點(diǎn),不是畫點(diǎn),在移動(dòng)過程中亦畫點(diǎn)。
voidfarmoverel(intdx,intdy);
移動(dòng)游標(biāo)從現(xiàn)行位置(x,y)移動(dòng)到(x+dx,y+dy)的位置,移動(dòng)過程中不畫點(diǎn)。
2、畫線
I.畫線函數(shù)
TURBOC提供了一系列畫線函數(shù):
voidfarline(intx0,inty0,intx1,inty1);
畫一條從點(diǎn)(x0,y0)到(x1,y1)的直線。
voidfarlineto(intx,inty);
畫一作從現(xiàn)行游標(biāo)到點(diǎn)(x,y)的直線。
voidfarlinerel(intdx,intdy);
畫一條從現(xiàn)行游標(biāo)(x,y)到按相對(duì)增量確定的點(diǎn)(x+dx,y+dy)的直線。
voidfarcircle(intx,inty,intradius);
以(x,y)為圓心,radius為半徑,畫一個(gè)圓。
voidfararc(intx,inty,intstangle,intendangle,intradius);
以(x,y)為圓心,radius為半徑,從stangle開始到endangle結(jié)束(用度表示)畫一段圓弧線。
在TURBOC中規(guī)定x軸正向?yàn)?度,逆時(shí)針方向旋轉(zhuǎn)一周,依次為90,180,270和360度(其它有關(guān)函數(shù)也按此規(guī)定,不再重述)。
voidellipse(intx,inty,intstangle,intendangle,intxradius,intyradius);
以(x,y)為中心,xradius,yradius為x軸和y軸半徑,從角stangle開始到endangle結(jié)束畫一段橢圓線,當(dāng)stangle=0,endangle=360時(shí),畫出一個(gè)完整的橢圓。
voidfarrectangle(intx1,inty1,intx2,inty2);
以(x1,y1)為左上角,(x2,y2)為右下角畫一個(gè)矩形框。
voidfardrawpoly(intnumpoints,intfar*polypoints);
畫一個(gè)頂點(diǎn)數(shù)為numpoints,各頂點(diǎn)坐標(biāo)由polypoints給出的多邊形。polypoints整型數(shù)組必須至少有2倍頂點(diǎn)數(shù)個(gè)無素。每一個(gè)頂點(diǎn)的坐標(biāo)都定義為x,y,并且x在前。值得注意的是當(dāng)畫一個(gè)封閉的多邊形時(shí),numpoints的值取實(shí)際多邊形的頂點(diǎn)數(shù)加一,并且數(shù)組polypoints中第一個(gè)和最后一個(gè)點(diǎn)的坐標(biāo)相同。
下面舉一個(gè)用drawpoly()函數(shù)畫箭頭的例子。
#include"stdio.h"
#include"graphics.h"
intmain()
{
intgdriver,gmode,i;
intarw[16]={200,102,300,102,300,107,330,
100,300,93,300,98,200,98,200,102};
gdriver=DETECT;
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");
setbkcolor(BLUE);
cleardevice();
setcolor(12);/*設(shè)置作圖顏色*/
drawpoly(8,arw);/*畫一箭頭*/
getch();
closegraph();
return0;
}
II、設(shè)定線型函數(shù)
在沒有對(duì)線的特性進(jìn)行設(shè)定之前,TURBOC用其默認(rèn)值,即一點(diǎn)寬的實(shí)線,但TURBOC也提供了可以改變線型的函數(shù)。
線型包括:寬度和形狀。其中寬度只有兩種選擇:一點(diǎn)寬和三點(diǎn)寬。而線的形狀則有五種。
下面介紹有關(guān)線型的設(shè)置函數(shù)。
voidfarsetlinestyle(intlinestyle,unsignedupattern,intthickness);
該函數(shù)用來設(shè)置線的有關(guān)信息,其中l(wèi)inestyle是線形狀的規(guī)定,見graphics.h。
對(duì)于upattern,只有l(wèi)inestyle選USERBIT_LINE時(shí)才有意義(選其它線型,uppattern取0即可)。此時(shí)uppattern的16位二進(jìn)制數(shù)的每一位代表一個(gè)象元,如果那位為1,則該象元打開,否則該象元關(guān)閉。
voidfargetlinesettings(structlinesettingstypefar*lineinfo);
該函數(shù)將有關(guān)線的信息存放到由lineinfo指向的結(jié)構(gòu)中,表中l(wèi)inesettingstype的結(jié)構(gòu)如下:
structlinesettingstype{
intlinestyle;
unsignedupattern;
intthickness;
}
例如下面兩句程序可以讀出當(dāng)前線的特性
structlinesettingstype*info;
getlinesettings(info);
voidfarsetwritemode(intmode);
該函數(shù)規(guī)定畫線的方式。如果mode=0,則表示畫線時(shí)將所畫位置的原來信息覆蓋了(這是TURBOC的默認(rèn)方式)。如果mode=1,則表示畫線時(shí)用現(xiàn)在特性的線與所畫之處原有的線進(jìn)行異或(XOR)操作,實(shí)際上畫出的線是原有線與現(xiàn)在規(guī)定的線進(jìn)行異或后的結(jié)果。因此,當(dāng)線的特性不變,進(jìn)行兩次畫線操作相當(dāng)于沒有畫線。
有關(guān)線型設(shè)定和畫線函數(shù)的例子如下所示。
#include"stdio.h"
#include"graphics.h"
intmain()
{
intgdriver,gmode,i;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");
setbkcolor(BLUE);
cleardevice();
setcolor(GREEN);
circle(320,240,98);
setlinestyle(0,0,3);/*設(shè)置三點(diǎn)寬實(shí)線*/
setcolor(2);
rectangle(220,140,420,340);
setcolor(WHITE);
setlinestyle(4,0xaaaa,1);/*設(shè)置一點(diǎn)寬用戶定義線*/
line(220,240,420,240);
line(320,140,320,340);
getch();
closegraph();
return0;
}
第四節(jié)
基本圖形的填充
填充就是用規(guī)定的顏色和圖模填滿一個(gè)封閉圖形。一般是先畫輪廓再填充。
TURBOC提供了一些先畫出基本圖形輪廓,再按規(guī)定圖模和顏色填充整個(gè)封閉圖形的函數(shù)。在沒有改變填充方式時(shí),TURBOC以默認(rèn)方式填充。
voidfarbar(intx1,inty1,intx2,inty2);
確定一個(gè)以(x1,y1)為左上角,(x2,y2)為右下角的矩形窗口,再按規(guī)定圖模和顏色填充。說明:此函數(shù)不畫出邊框,所以填充色為邊框。
voidfarbar3d(intx1,inty1,intx2,inty2,intdepth,inttopflag);
當(dāng)topflag為非0時(shí),畫出一個(gè)三維的長(zhǎng)方體。當(dāng)topflag為0時(shí),三維圖形不封頂,實(shí)際上很少這樣使用。說明:bar3d()函數(shù)中,長(zhǎng)方體第三維的方向不隨任何參數(shù)而變,即始終為45度的方向。
voidfarpieslice(intx,inty,intstangle,intendangle,intradius);
畫一個(gè)以(x,y)為圓心,radius為半徑,stangle為起始角度,endangle為終止角度的扇形,再按規(guī)定方式填充。當(dāng)stangle=0,endangle=360時(shí)變成一個(gè)實(shí)心圓,并在圓內(nèi)從圓點(diǎn)沿X軸正向畫一條半徑。
voidfarsector(intx,inty,intstanle,intendangle,intxradius,intyradius);
畫一個(gè)以(x,y)為圓心分別以xradius,yradius為x軸和y軸半徑,stangle為起始角,endangle為終止角的橢圓扇形,再按規(guī)定方式填充。
第五節(jié)
設(shè)定填充方式
TURBOC有四個(gè)與填充方式有關(guān)的函數(shù)。下面分別介紹:
voidfarsetfillstyle(intpattern,intcolor);
color的值是當(dāng)前屏幕圖形模式時(shí)顏色的有效值。pattern的值及與其等價(jià)的符號(hào)常數(shù)見graphics.h。
除USER_FILL(用戶定義填充式樣)以外,其它填充式樣均可由setfillstyle()函數(shù)設(shè)置。當(dāng)選用USER_FILL時(shí),該函數(shù)對(duì)填充圖模和顏色不作任何改變。之所以定義USER_FILL主要因?yàn)樵讷@得有關(guān)填充信息時(shí)用到此項(xiàng)。
voidfarsetfillpattern(char*upattern,intcolor);
設(shè)置用戶定義的填充圖模的顏色以供對(duì)封閉圖形填充。其中upattern是一個(gè)指向8個(gè)字節(jié)的指針。這8個(gè)字節(jié)定義了8x8點(diǎn)陣的圖形。每個(gè)字節(jié)的8位二進(jìn)制數(shù)表示水平8點(diǎn),8個(gè)字節(jié)表示8行,然后以此為模型向個(gè)封閉區(qū)域填充。
voidfargetfillpattern(char*upattern);
該函數(shù)將用戶定義的填充圖模存入upattern指針指向的內(nèi)存區(qū)域。
voidfargetfillsetings(structfillsettingstypefar*fillinfo);
獲得現(xiàn)行圖模的顏色并將存入結(jié)構(gòu)指針變量fillinfo中。其中fillsettingstype結(jié)構(gòu)定義如下:
structfillsettingstype{
intpattern;/*現(xiàn)行填充模式*/
intcolor;/*現(xiàn)行填充模式*/
};
有關(guān)圖形填充圖模的顏色的選擇,請(qǐng)看下面例程。
#include"stdio.h"
#include"graphics.h"
main()
{
charstr[8]={10,20,30,40,50,60,70,80};/*用戶定義圖模*/
intgdriver,gmode,i;
structfillsettingstypesave;
/*定義一個(gè)用來存儲(chǔ)填充信息的結(jié)構(gòu)變量*/
gdriver=DETECT;
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");
setbkcolor(BLUE);
cleardevice();
for(i=0;i<13;i++)
{
setcolor(i+3);
setfillstyle(i,2+i);/*設(shè)置填充類型*/
bar(100,150,200,50);/*畫矩形并填充*/
bar3d(300,100,500,200,70,1);/*畫長(zhǎng)方體并填充*/
pieslice(200,300,90,180,90);/*畫扇形并填充*/
sector(500,300,180,270,200,100);/*畫橢圓扇形并填充*/
getch();
}
cleardevice();
setcolor(14);
setfillpattern(str,RED);
bar(100,150,200,50);
bar3d(300,100,500,200,70,0);
pieslice(200,300,0,360,90);
sector(500,300,0,360,100,50);
getch();
getfillsettings(&save);
/*獲得用戶定義的填充模式信息*/
closegraph();
clrscr();
printf("Thepatternis%d,Thecoloroffillingis%d",
save.pattern,save.color);
/*輸出目前填充圖模和顏色值*/
getch();
}
第六節(jié)
任意封閉圖形的填充
截止目前為止,我們只能對(duì)一些特定形狀的封閉圖形進(jìn)行填充,但還不能對(duì)任意封閉圖形進(jìn)行填充。為此,TURBOC提供了一個(gè)可對(duì)任意封閉圖形填充的函數(shù),其調(diào)用格式如下:
voidfarfloodfill(intx,inty,intborder);
其中:x,y為封閉圖形內(nèi)的任意一點(diǎn),border為邊界的顏色,也就是封閉圖形輪廓的顏色。調(diào)用了該函數(shù)后,將用由函數(shù)setfillstyle()規(guī)定的顏色和模式填滿整個(gè)封閉圖形。
注意:
a.如果x或y取在邊界上,則不進(jìn)行填充。
b.如果不是封閉圖形則填充會(huì)從沒有封閉的地方溢出去,填滿其它地方。
c.如果x或y在圖形外面,則填充封閉圖形外的屏幕區(qū)域。
d.由border指定的顏色值必須與圖形輪廓的顏色值相同,但填充色可選任意顏色。
下例是有關(guān)floodfill()函數(shù)的用法,該程序填充了bar3d()所畫長(zhǎng)方體中其它兩個(gè)未填充的面。
#include"stdio.h"
#include"graphics.h"
main()
{
intgdriver,gmode;
structfillsettingstypesave;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");
setbkcolor(BLUE);
cleardevice();
setcolor(LIGHTRED);
setlinestyle(0,0,3);
setfillstyle(1,14);/*設(shè)置填充方式*/
bar3d(100,200,400,350,200,1);/*畫長(zhǎng)方體并填充*/
floodfill(450,300,LIGHTRED);
/*填充長(zhǎng)方體另外兩個(gè)面*/
floodfill(250,150,LIGHTRED);
rectangle(450,400,500,450);/*畫一矩形*/
floodfill(470,420,LIGHTRED);/*填充矩形*/
getch();
closegraph();
}
第七節(jié)屏幕操作函數(shù)
除了清屏函數(shù)以外,關(guān)于屏幕操作還有以下函數(shù):
voidfarsetactivepage(intpagenum);
voidfarsetvisualpage(intpagenum);
這兩個(gè)函數(shù)只用于EGA,VGA以及HERCULES圖形適配器。setctivepage()函數(shù)是為圖形輸出選擇激活頁。
所謂激活頁是指后續(xù)圖形的輸出被寫到函數(shù)選定的pagenum頁面,該頁面并不一定可見。setvisualpage()函數(shù)才使pagenum所指定的頁面變成可見頁。頁面從0開始(TurboC默認(rèn)頁)。如果先用setactivepage()函數(shù)在不同頁面上畫出一幅幅圖像,再用setvisualpage()函數(shù)交替顯示,就可以實(shí)現(xiàn)一些動(dòng)畫的效果。
voidfargetimage(intxl,intyl,intx2,inty2,voidfar*mapbuf);
voidfarputimge(intx,int,y,void*mapbuf,intop);
unsinedfarimagesize(intxl,intyl,intx2,inty2);
這三個(gè)函數(shù)用于將屏幕上的圖像復(fù)制到內(nèi)存,然后再將內(nèi)存中的圖像送回到屏幕上。首先通過函數(shù)imagesize()測(cè)試要保存左上角為(xl,yl),右上角為(x2,y2)的圖形屏幕區(qū)域內(nèi)的全部?jī)?nèi)容需多少個(gè)字節(jié),然后再給mapbuf分配一個(gè)所測(cè)數(shù)字節(jié)內(nèi)存空間的指針。通過調(diào)用getimage()函數(shù)就可將該區(qū)域內(nèi)的圖像保存在內(nèi)存中,需要時(shí)可用putimage()函數(shù)將該圖像輸出到左上角為點(diǎn)(x,y)的位置上,其中g(shù)etimage()函數(shù)中的參數(shù)op規(guī)定如何釋放內(nèi)存中圖像。關(guān)于這個(gè)參數(shù)的定義參見下表。
對(duì)于imagesize()函數(shù),只能返回字節(jié)數(shù)小于64K字節(jié)的圖像區(qū)域,否則將會(huì)出錯(cuò),出錯(cuò)時(shí)返回-1。本節(jié)介紹的函數(shù)在圖像動(dòng)畫處理、菜單設(shè)計(jì)技巧中非常有用。
下面程序模擬兩個(gè)小球動(dòng)態(tài)碰撞過程。
#include"stdio.h"
#include"graphics.h"
#include"malloc.h"
intmain()
{
inti,gdriver,gmode,size;
void*buf;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");
setbkcolor(BLUE);
cleardevice();
setcolor(LIGHTRED);
setlinestyle(0,0,1);
setfillstyle(1,10);
circle(100,200,30);
floodfill(100,200,12);
size=imagesize(69,169,131,231);
buf=malloc(size);
if(!buf)return-1;
getimage(69,169,131,231,buf);
putimage(500,269,buf,COPY_PUT);
for(i=0;i<185;i++){
putimage(70+i,170,buf,COPY_PUT);
putimage(500-i,170,buf,COPY_PUT);
}
for(i=0;i<185;i++){
putimage(255-i,170,buf,COPY_PUT);
putimage(315+i,170,buf,COPY_PUT);
}
getch();
closegraph();
}
第八節(jié)用戶對(duì)文本字符大小的設(shè)置
前面介紹的settextstyle()函數(shù),可以設(shè)定圖形方式下輸出文本字符這字體和大小但對(duì)于筆劃型字體(除8*8點(diǎn)陣字以個(gè)的字體),只能在水平和垂直方向以相同的放大倍數(shù)放大。
為此TurboC2.0又提供了另外一個(gè)setusercharsize()函數(shù),對(duì)筆劃字體可以分別設(shè)置水平和垂直方向的放大倍數(shù)。該函數(shù)的調(diào)用格式為:
voidfarsetusercharsize(intmulx,intdivx,intmuly,intdivy);
該函數(shù)用來設(shè)置筆劃型字和放大系數(shù),它只有在settextstyle()函數(shù)中的charsize為0(或USER_CHAR_SIZE)時(shí)才起作用,并且字體為函數(shù)settextstyle()規(guī)定的字體。
調(diào)用函數(shù)setusercharsize()后,每個(gè)顯示在屏幕上的字符都以其缺省大小乘以mulx/divx為輸出字符寬,乘以muly/divy為輸出字符高。
#include"stdio.h"
#include"graphics.h"
intmain()
{
intgdriver,gmode;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");
setbkcolor(BLUE);
cleardevice();
setfillstyle(1,2);/*設(shè)置填充方式*/
setcolor(WHITE);/*設(shè)置白色作圖*/
rectangle(100,100,330,380);
floodfill(50,50,14);/*填充方框以外的區(qū)域*/
setcolor(12);/*作圖色為淡紅*/
settextstyle(1,0,8);/*三重筆劃字體,放大8倍*/
outtextxy(120,120,"VeryGood");
setusercharsize(2,1,4,1);
/*水平放大2倍,垂直放大4倍*/
setcolor(15);
settextstyle(3,0,5);
/*無襯字筆劃,放大5倍*/
outtextxy(220,220,"VeryGood");
setusercharsize(4,1,1,1);
settextstyle(3,0,0);
outtextxy(180,320,"Good");
getch();
closegraph();
return0;
}
第九節(jié)文本字體、字型和輸出方式的設(shè)置
有關(guān)圖形方式下的文本輸出函數(shù),可以通過setcolor()函數(shù)設(shè)置輸出文本的顏色。另外,也可以改變文本字體大小以及選擇是水平方向輸出還是垂直方向輸出。
voidfarsettexjustify(inthoriz,intvert);
該函數(shù)用于定位輸出字符串。對(duì)使用outtextxy(intx,inty,charfar*strtextstring)函數(shù)所輸出的字符串,其中哪個(gè)點(diǎn)對(duì)應(yīng)于定位坐標(biāo)(x,y)在TurboC2.0中是有規(guī)定的。如果把一個(gè)字符串看成一個(gè)長(zhǎng)方形的圖形,在水平方向顯示時(shí),字符串長(zhǎng)方形按垂直方向可分為頂部,中部和底部三個(gè)位置,水平方向可分為左,中,右三個(gè)位置,兩者結(jié)合就有9個(gè)位置。settextjustify()函數(shù)的第一個(gè)參數(shù)horiz指出水平方向三個(gè)位置中的一個(gè),第二個(gè)參數(shù)vert指出垂直方向三個(gè)位置中的一個(gè),二者就確定了其中一個(gè)位置。當(dāng)規(guī)定了這個(gè)位置后,用outtextxy()函數(shù)輸出字符串時(shí),字符串長(zhǎng)方形的這個(gè)規(guī)定位置就對(duì)準(zhǔn)函數(shù)中的(x,y)位置。而對(duì)用uttext()函數(shù)輸出字符串時(shí),這個(gè)規(guī)定的位置就位于現(xiàn)行游標(biāo)的位置。
有關(guān)參數(shù)horiz和vert的取值參見graphics.h。
voidfarsettextstyle(intfont,intdirection,intcharsize);
該函數(shù)用來設(shè)置輸出字符的字形(由font確定)、輸出方向(由direction確定)和字符大小(由charsize確定)等特性。
TurboC2.0對(duì)函數(shù)中各個(gè)參數(shù)的規(guī)定見graphics.h。
有關(guān)圖形屏幕下文本輸出和字體字型設(shè)置函數(shù)的用法請(qǐng)看下例:
#include"stdio.h"
#include"graphics.h"
intmain()
{
inti,gdriver,gmode;
chars[30];
gdriver=DETECT;
initgraph(&gdriver,&gmode,"C:\\TC2.0\\BGI");
setbk
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新能源出租車運(yùn)營(yíng)權(quán)承包經(jīng)營(yíng)合同
- 殘疾人職業(yè)培訓(xùn)與就業(yè)保障協(xié)議
- 婚內(nèi)財(cái)產(chǎn)協(xié)議模板
- 住院患者一般護(hù)理常規(guī)
- 智慧銀行信息化系統(tǒng)建設(shè)方案
- 手術(shù)室護(hù)理查房
- 在職教師普通話培訓(xùn)提升計(jì)劃
- 企業(yè)激勵(lì)培訓(xùn)
- 日本現(xiàn)代教育體系解析
- 正常產(chǎn)程常規(guī)培訓(xùn)
- 2025-2030中國(guó)救護(hù)車市場(chǎng)發(fā)展分析及市場(chǎng)趨勢(shì)與投資方向研究報(bào)告
- 2025成都勞動(dòng)合同范本
- 期末證據(jù)法學(xué)試題及答案
- 2025年科技節(jié)活動(dòng)小學(xué)科普知識(shí)競(jìng)賽題庫及答案(共80題)
- 露天礦山事故警示教育
- 大數(shù)據(jù)治理與服務(wù)平臺(tái)建設(shè)及數(shù)據(jù)服務(wù)運(yùn)營(yíng)實(shí)施技術(shù)方案
- 簡(jiǎn)易信號(hào)通信工具操作使用
- 探尋漆扇之美邂逅漆扇探秘和玩轉(zhuǎn)漆扇課件
- 電氣實(shí)驗(yàn)室工作人員崗位職責(zé)
- 2025年-甘肅建筑安全員-C證考試(專職安全員)題庫及答案
- 高壓滅菌鍋使用管理制度
評(píng)論
0/150
提交評(píng)論