基于MATLAB的OFDM的仿真_第1頁
基于MATLAB的OFDM的仿真_第2頁
基于MATLAB的OFDM的仿真_第3頁
基于MATLAB的OFDM的仿真_第4頁
基于MATLAB的OFDM的仿真_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、PAGE PAGE 37實習(xí)目的熟悉通信相關(guān)方面的知識、學(xué)習(xí)并掌握OFDM技術(shù)的原理熟悉MATLAB語言設(shè)計并實現(xiàn)OFDM通信系統(tǒng)的建模與仿真實習(xí)要求仿真實現(xiàn)OFDM調(diào)制解調(diào),在發(fā)射端,經(jīng)串/并變換和IFFT變換,加上保護(hù)間隔(又稱“循環(huán)前綴”),形成數(shù)字信號,通過信道到達(dá)接收端,結(jié)束端實現(xiàn)反變換,進(jìn)行誤碼分析三、實習(xí)內(nèi)容實習(xí)題目 正交頻分復(fù)用OFDM系統(tǒng)建模與仿真原理介紹OFDM的基本原理就是把高速的數(shù)據(jù)流通過串并變換,分配到傳輸速率相對較低的若干個子信道中進(jìn)行傳輸。由于每個子信道中的符號周期會相對增加,因此可以減輕由無線信道的多徑時延擴(kuò)展所產(chǎn)生的時間彌散性對系統(tǒng)造成的影響。并且還可以在OF

2、DM符號之間插入保護(hù)間隔,令保護(hù)間隔大于無線信道的最大時延擴(kuò)展,這樣就可以最大限度地消除由于多徑而帶來的符號間干擾(ISI)。而且,一般都采用循環(huán)前綴作為保護(hù)間隔,從而可以避免由多徑帶來的子載波間干擾(ICI) 。原理框圖高速數(shù)據(jù)圖1-1 OFDM 原理框圖 功能說明4.1確定參數(shù)需要確定的參數(shù)為:子信道,子載波數(shù),F(xiàn)FT長度,每次使用的OFDM符號數(shù),調(diào)制度水平,符號速率,比特率,保護(hù)間隔長度,信噪比,插入導(dǎo)頻數(shù),基本的仿真可以不插入導(dǎo)頻,可以為0。4.2產(chǎn)生數(shù)據(jù)使用個隨機(jī)數(shù)產(chǎn)生器產(chǎn)生二進(jìn)制數(shù)據(jù),每次產(chǎn)生的數(shù)據(jù)個數(shù)為carrier_count * symbols_per_carrier *

3、bits_per_symbol。4.3編碼交織交織編碼可以有效地抗突發(fā)干擾。4.4子載波調(diào)制OFDM采用BPSK、QPSK、16QAM、64QAM4種調(diào)制方式。按照星座圖,將每個子信道上的數(shù)據(jù),映射到星座圖點的復(fù)數(shù)表示,轉(zhuǎn)換為同相Ich和正交分量Qch。其實這是一種查表的方法,以16QAM星座為例,bits_per_symbol=4,則每個OFDM符號的每個子信道上有4個二進(jìn)制數(shù)d1,d2,d3,d4,共有16種取值,對應(yīng)星座圖上16個點,每個點的實部記為Qch。為了所有的映射點有相同高的平均功率,輸出要進(jìn)行歸一化,所以對應(yīng)BPSK,PQSK,16QAM,64QAM,分別乘以歸一化系數(shù)系數(shù)1,

4、, , .輸出的復(fù)數(shù)序列即為映射后的調(diào)制結(jié)果。4.5串并轉(zhuǎn)換。將一路高速數(shù)據(jù)轉(zhuǎn)換成多路低速數(shù)據(jù)4.6 IFFT。對上一步得到的相同分量和正交分量按照(Ich+Qch*i)進(jìn)行IFFT運算。并將得到的復(fù)數(shù)的實部作為新的Ich,虛部作為新的Qch。在實際運用中, 信號的產(chǎn)生和解調(diào)都是采用數(shù)字信號處理的方法來實現(xiàn)的, 此時要對信號進(jìn)行抽樣, 形成離散時間信號。 由于OFDM信號的帶寬為B=Nf, 信號必須以t=1/B=1/(Nf)的時間間隔進(jìn)行采樣。 采樣后的信號用sn,i表示, i = 0, 1, , N-1,則有 從該式可以看出,它是一個嚴(yán)格的離散反傅立葉變換(IDFT)的表達(dá)式。IDFT可以采

5、用快速反傅立葉變換(IFFT)來實現(xiàn) 4.7加入保護(hù)間隔。由IFFT運算后的每個符號的同相分量和正交分量分別轉(zhuǎn)換為串行數(shù)據(jù),并將符號尾部G長度的數(shù)據(jù)加到頭部,構(gòu)成循環(huán)前綴。如果加入空的間隔,在多徑傳播的影響下,會造成載波間干擾ICI。保護(hù)見個的長度G應(yīng)該大于多徑時的擴(kuò)張的最大值。 圖 1-2 多徑情況下,空閑保護(hù)間隔在子載波間造成的干擾圖1-3 保護(hù)間隔的插入過程4.8加窗加窗是為了降低系統(tǒng)的PAPR,滾降系數(shù)為1/32。通過這種方法,可以顯著地改善OFDM通信系統(tǒng)高的PAPR分布,大大降低了峰值信號出現(xiàn)的概率以及對功率放大器的要求,節(jié)約成本。經(jīng)常被采用的窗函數(shù)是升余弦窗 (1-2) 圖1-9

6、 經(jīng)過加窗處理后的OFDM符號示意圖4.9通過信道。信道分為多徑實驗信道和高斯白噪聲信道。多徑時延信道直射波河延遲波對于標(biāo)準(zhǔn)時間按照固定比率遞減,因此多徑時延信道參數(shù)為比率和對大延遲時間。4.10同步。同步是決定OFDM系統(tǒng)高性能十分重要的方面,實際OFDM系統(tǒng)都有同步過稱。主要同步方法有使用導(dǎo)頻,循環(huán)前綴,忙算法三種。研究目的為同步的可以詳細(xì)實現(xiàn)本步,基本的方針可以略過此步,假設(shè)接收端已經(jīng)于發(fā)射端同步。4.11去掉保護(hù)間隔。根據(jù)同步得到的數(shù)據(jù),分別見給每個符號的同相分量和正交分量開頭的保護(hù)間隔去掉。4.12并串轉(zhuǎn)換。將每個符號分布在子信道上的數(shù)據(jù),還原為一路串行數(shù)據(jù)。4.13 FFT。對每個

7、符號的同相分量和正交分量按照(Ich+Qch*i)進(jìn)行FFT運算。并將得到的實部作為新的Ich,虛部作為新的Qch。與發(fā)端相類似,上述相關(guān)運算可以通過離散傅立葉變換(DFT)或快速傅立葉變換(FFT)來實現(xiàn), 即: 4.14子載波解調(diào)FFT后的同相粉臉感和正交分量兩組數(shù)據(jù)在星座圖上對飲高的點,由于噪聲和信道的影響,不再是嚴(yán)格的發(fā)送端的星座圖。將得到的星座圖上的點按照最近原則判決為原星座圖上的點,并按映射規(guī)則還原為一組數(shù)據(jù)。4.15解碼解交織。按照編碼交織對應(yīng)解碼,解交織的方法,還原為原始數(shù)據(jù),并進(jìn)行糾錯處理。4.16計算誤碼率。比較第2步產(chǎn)生的數(shù)據(jù)和接收到的數(shù)據(jù),計算誤碼率BER實現(xiàn)步驟5.1

8、 16QAM的調(diào)制函數(shù)function complex_qam_data=qam16(bitdata)%modulation of 16QAM,modulate bitdata to 16QAM complex signalX1=reshape(bitdata,4,length(bitdata)/4);d=1;%min distance of symble for i=1:length(bitdata)/4; for j=1:4 X1(i,j)=X1(i,j)*(2(4-j); end source(i,1)=1+sum(X1(i,:);%convert to the number 1 to

9、16endmapping=-3*d 3*d; -d 3*d; d 3*d; 3*d 3*d; -3*d d; -d d; d d; 3*d d; -3*d -d; -d -d; d -d; 3*d -d; -3*d -3*d; -d -3*d; d -3*d; 3*d -3*d; for i=1:length(bitdata)/4 qam_data(i,:)=mapping(source(i),:);%data mapping end complex_qam_data=complex(qam_data(:,1),qam_data(:,2);5.2 16QAM的解調(diào)函數(shù)。function dem

10、odu_bit_symble=demoduqam16(Rx_serial_complex_symbols)%將得到的串行16QAM數(shù)據(jù)解調(diào)成二進(jìn)制比特流complex_symbols=reshape(Rx_serial_complex_symbols,length(Rx_serial_complex_symbols),1);d=1;mapping=-3*d 3*d; -d 3*d; d 3*d; 3*d 3*d; -3*d d; -d d; d d; 3*d d; -3*d -d; -d -d; d -d; 3*d -d; -3*d -3*d; -d -3*d; d -3*d; 3*d -3*

11、d; complex_mapping=complex(mapping(:,1),mapping(:,2); for i=1:length(Rx_serial_complex_symbols); for j=1:16; metrics(j)=abs(complex_symbols(i,1)-complex_mapping(j,1); end min_metric decode_symble(i)= min(metrics) ; %將離某星座點最近的值賦給decode_symble(i) end decode_bit_symble=de2bi(decode_symble-1),left-msb);

12、 demodu_bit_symble=reshape(decode_bit_symble,1,length(Rx_serial_complex_symbols)*4);5.3加窗函數(shù)function rcosw=rcoswindow(beta, Ts)%定義升余弦窗,其中beta為滾降系數(shù),Ts為包含循環(huán)前綴的OFDM符號的長度,Ts為正偶數(shù)t=0:(1+beta)*Ts;rcosw=zeros(1,(1+beta)*Ts);for i=1:beta*Ts;rcosw(i)=0.5+0.5*cos(pi+ t(i)*pi/(beta*Ts);endrcosw(beta*Ts+1:Ts)=1;f

13、or j=Ts+1:(1+beta)*Ts+1; rcosw(j-1)=0.5+0.5*cos(t(j)-Ts)*pi/(beta*Ts);endrcosw=rcosw;%變換為列向量5.4 OFDM主程序clear all;close all;carrier_count=200;%子載波數(shù)symbols_per_carrier=12;%每子載波含符號數(shù)bits_per_symbol=4;%每符號含比特數(shù),16QAM調(diào)制IFFT_bin_length=512;%FFT點數(shù)PrefixRatio=1/4;%保護(hù)間隔與OFDM數(shù)據(jù)的比例 1/61/4GI=PrefixRatio*IFFT_bin_

14、length ;%每一個OFDM符號添加的循環(huán)前綴長度為1/4*IFFT_bin_length 即保護(hù)間隔長度為128beta=1/32;%窗函數(shù)滾降系數(shù)GIP=beta*(IFFT_bin_length+GI);%循環(huán)后綴的長度20SNR=15; %信噪比dB%=%=信號產(chǎn)生=baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;%所輸入的比特數(shù)目carriers = (1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_co

15、unt/2);%共軛對稱子載波映射 復(fù)數(shù)數(shù)據(jù)對應(yīng)的IFFT點坐標(biāo)conjugate_carriers = IFFT_bin_length - carriers + 2;%共軛對稱子載波映射 共軛復(fù)數(shù)對應(yīng)的IFFT點坐標(biāo)baseband_out=round(rand(1,baseband_out_length);%輸出待調(diào)制的二進(jìn)制比特流%=16QAM調(diào)制=complex_carrier_matrix=qam16(baseband_out);%列向量complex_carrier_matrix=reshape(complex_carrier_matrix,carrier_count,symbol

16、s_per_carrier);%symbols_per_carrier*carrier_count 矩陣figure(1);plot(complex_carrier_matrix,*r);%16QAM調(diào)制后星座圖title(16QAM調(diào)制后星座圖)axis(-4, 4, -4, 4);grid on%=IFFT=IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%添0組成IFFT_bin_length IFFT 運算 IFFT_modulation(:,carriers ) = complex_carrier_matrix ;

17、%未添加導(dǎo)頻信號 ,子載波映射在此處IFFT_modulation(:,conjugate_carriers ) = conj(complex_carrier_matrix);%共軛復(fù)數(shù)映射%=signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);%OFDM調(diào)制 即IFFT變換time_wave_matrix =signal_after_IFFT;%時域波形矩陣,行為每載波所含符號數(shù),列ITTF點數(shù),N個子載波映射在其內(nèi),每一行即為一個OFDM符號%=%=添加循環(huán)前綴與后綴=XX=zeros(symbols_per_carrier,

18、IFFT_bin_length+GI+GIP);for k=1:symbols_per_carrier; for i=1:IFFT_bin_length; XX(k,i+GI)=signal_after_IFFT(k,i); end for i=1:GI; XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循環(huán)前綴 end for j=1:GIP; XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循環(huán)后綴 endendtime_wave_matrix_cp=XX;%添加了循環(huán)前綴與

19、后綴的時域信號矩陣,此時一個OFDM符號長度為IFFT_bin_length+GI+GIP=660%=OFDM符號加窗=windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP);for i = 1:symbols_per_carrier windowed_time_wave_matrix_cp(i,:) = real(time_wave_matrix_cp(i,:).*rcoswindow(beta,IFFT_bin_length+GI);%加窗 升余弦窗end %=生成發(fā)送信號,并串變換=windowed_Tx_data=zer

20、os(1,symbols_per_carrier*(IFFT_bin_length+GI)+GIP);windowed_Tx_data(1:IFFT_bin_length+GI+GIP)=windowed_time_wave_matrix_cp(1,:);for i = 1:symbols_per_carrier-1 ; windowed_Tx_data(IFFT_bin_length+GI)*i+1:(IFFT_bin_length+GI)*(i+1)+GIP)=windowed_time_wave_matrix_cp(i+1,:);%并串轉(zhuǎn)換,循環(huán)后綴與循環(huán)前綴相疊加end%=Tx_dat

21、a=reshape(windowed_time_wave_matrix_cp,(symbols_per_carrier)*(IFFT_bin_length+GI+GIP),1);%加窗后 循環(huán)前綴與后綴不疊加 的串行信號%=temp_time1 = (symbols_per_carrier)*(IFFT_bin_length+GI+GIP);%加窗后 循環(huán)前綴與后綴不疊加 發(fā)送總位數(shù)figure (2)subplot(2,1,1);plot(0:temp_time1-1,Tx_data );%循環(huán)前綴與后綴不疊加 發(fā)送的信號波形grid onylabel(Amplitude (volts)xl

22、abel(Time (samples)title(循環(huán)前后綴不疊加的OFDM Time Signal)temp_time2 =symbols_per_carrier*(IFFT_bin_length+GI)+GIP;subplot(2,1,2);plot(0:temp_time2-1,windowed_Tx_data);%循環(huán)后綴與循環(huán)前綴相疊加 發(fā)送信號波形grid onylabel(Amplitude (volts)xlabel(Time (samples)title(循環(huán)前后綴疊加的OFDM Time Signal)%=加窗的發(fā)送信號頻譜=symbols_per_average = ce

23、il(symbols_per_carrier/5);%符號數(shù)的1/5,10行avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%點數(shù),10行數(shù)據(jù),10個符號averages = floor(temp_time1/avg_temp_time);average_fft(1:avg_temp_time) = 0;%分成5段for a = 0:(averages-1) subset_ofdm = Tx_data(a*avg_temp_time)+1):(a+1)*avg_temp_time);%利用循環(huán)前綴后綴未疊加的串行加窗信號

24、計算頻譜 subset_ofdm_f = abs(fft(subset_ofdm);%分段求頻譜 average_fft = average_fft + (subset_ofdm_f/averages);%總共的數(shù)據(jù)分為5段,分段進(jìn)行FFT,平均相加endaverage_fft_log = 20*log10(average_fft);figure (3)subplot(2,1,2)plot(0:(avg_temp_time-1)/avg_temp_time, average_fft_log)%歸一化 0/avg_temp_time : (avg_temp_time-1)/avg_temp_ti

25、mehold onplot(0:1/IFFT_bin_length:1, -35, rd)grid onaxis(0 0.5 -40 max(average_fft_log)ylabel(Magnitude (dB)xlabel(Normalized Frequency (0.5 = fs/2)title(加窗的發(fā)送信號頻譜)%=添加噪聲=Tx_signal_power = var(windowed_Tx_data);%發(fā)送信號功率linear_SNR=10(SNR/10);%線性信噪比 noise_sigma=Tx_signal_power/linear_SNR;noise_scale_fa

26、ctor = sqrt(noise_sigma);%標(biāo)準(zhǔn)差sigmanoise=randn(1,(symbols_per_carrier)*(IFFT_bin_length+GI)+GIP)*noise_scale_factor;%產(chǎn)生正態(tài)分布噪聲序列Rx_data=windowed_Tx_data +noise;%接收到的信號加噪聲%=接收信號 串/并變換 去除前綴與后綴=Rx_data_matrix=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);for i=1:symbols_per_carrier; Rx_data_matrix(i,

27、:)=Rx_data(1,(i-1)*(IFFT_bin_length+GI)+1:i*(IFFT_bin_length+GI)+GIP);%串并變換endRx_data_complex_matrix=Rx_data_matrix(:,GI+1:IFFT_bin_length+GI);%去除循環(huán)前綴與循環(huán)后綴,得到有用信號矩陣%=% OFDM解碼 16QAM解碼%=FFT變換=Y1=fft(Rx_data_complex_matrix,IFFT_bin_length,2);%OFDM解碼 即FFT變換Rx_carriers=Y1(:,carriers);%除去IFFT/FFT變換添加的0,選出

28、映射的子載波Rx_phase =angle(Rx_carriers);%接收信號的相位Rx_mag = abs(Rx_carriers);%接收信號的幅度figure(4);polar(Rx_phase, Rx_mag,bd);%極坐標(biāo)坐標(biāo)下畫出接收信號的星座圖title(極坐標(biāo)下的接收信號的星座圖)%=M, N=pol2cart(Rx_phase, Rx_mag); Rx_complex_carrier_matrix = complex(M, N);figure(5);plot(Rx_complex_carrier_matrix,*r);%XY坐標(biāo)接收信號的星座圖title(XY坐標(biāo)接收信號

29、的星座圖)axis(-4, 4, -4, 4);grid on%=16qam解調(diào)=Rx_serial_complex_symbols=reshape(Rx_complex_carrier_matrix,size(Rx_complex_carrier_matrix, 1)*size(Rx_complex_carrier_matrix,2),1) ;Rx_decoded_binary_symbols=demoduqam16(Rx_serial_complex_symbols);%=baseband_in = Rx_decoded_binary_symbols;figure(6);subplot(2

30、,1,1);stem(baseband_out(1:100);title(輸出待調(diào)制的二進(jìn)制比特流)subplot(2,1,2);stem(baseband_in(1:100);title(接收解調(diào)后的二進(jìn)制比特流)%=誤碼率計算=bit_errors=find(baseband_in =baseband_out);bit_error_count = size(bit_errors, 2) ber=bit_error_count/baseband_out_length5.5實驗仿真結(jié)果誤碼率bit_error_count =11ber =0.0011四、參考文獻(xiàn) 1 Erich Cosby.

31、Orthogonal Frequency Division Multip lexing(OFDM) Tutorial and AnalysisM . Northern Virginia Center,2001. 2 Mingqi L i, ,Qicong Peng, Yubai L i, Performance Evaluation ofMC - DS - CDMA Systems inMultipath Fading Channels J . 0- 7803 - 7547 - 5 /02, IEEE , 2002. 3 A Peled, A Ruiz. Frequency domain da

32、ta transmission usingreduced computational comp lexity algorithmsC . In Proc.IEEE Int. Conf. Acoust. , Speech, Signal Processing, 1980.964 - 967. 4 R van Nee. OFDM WirelessMultimedia CommunicationsM .Rrasad R. Artech House, 1998. 5 周正蘭,等. OFDM及其鏈路級平臺的Simulink實現(xiàn) J . 中國數(shù)據(jù)通信, 2003, (10) : 90 - 92 6 尹澤明

33、,等. 精通MATLAB6 M . 清華大學(xué)出版社, 2002. 7 蔡濤, 等譯. 無線通信原理與應(yīng)用M . 電子工業(yè)出版社,1999. 8 丁玉美,等. 數(shù)字信號處理M. 西安電子科技大學(xué)出版社, 2003.五、實習(xí)體會本次實習(xí)的題目是OFDM系統(tǒng)的建模與仿真,對于我們通信工程各專業(yè)的學(xué)生來說這也是畢業(yè)設(shè)計的一次熱身,也讓我們提前走上了工作的實習(xí)崗位,為以后工作和奮斗墊上了豐厚的基石。我通過本次課程設(shè)計鞏固并擴(kuò)展了本專業(yè)的基本概念,基本理論,分析方法和實現(xiàn)方法。集合數(shù)字信號處理,移動通信和通信原理的MATLAB編程。這次課程設(shè)計,培養(yǎng)了我的軟件編程實現(xiàn)能力,解決實際問題能力,和獨立思考。加

34、強(qiáng)了我對OFDM系統(tǒng)原理的理解,為能順利完成畢業(yè)設(shè)計和走上工作崗位做好了準(zhǔn)備。 附錄資料:不需要的可以自行刪除 C語言圖形模式速成第一節(jié) 圖形模式的初始化Turbo C 提供了非常豐富的圖形函數(shù),所有圖形函數(shù)的原型均在graphics. h 中,本節(jié)主要介紹圖形模式的初始化、獨立圖形程序的建立、基本圖形功能、圖形窗口以及圖形模式下的文本輸出等函數(shù)。另外,使用圖形函數(shù)時要確保有顯示器圖形驅(qū)動程序*.BGI,同時將集成開發(fā)環(huán)境options/Linker中的Graphics lib選為on,只有這樣才能保證正確使用圖形函數(shù)。 不同的顯示器適配器有不同的圖形分辨率。即是同一顯示器適配器,在不同模式下

35、也有不同分辨率。因此,在屏幕作圖之前,必須根據(jù)顯示器適配器種類將顯示器設(shè)置成為某種圖形模式,在未設(shè)置圖形模式之前,微機(jī)系統(tǒng)默認(rèn)屏幕為文本模式(80列,25行字符模式),此時所有圖形函數(shù)均不能工作。設(shè)置屏幕為圖形模式,可用下列圖形初始化函數(shù):void far initgraph(int far *gdriver, int far *gmode,char *path);其中g(shù)driver和gmode分別表示圖形驅(qū)動器和模式,path是指圖形驅(qū)動程序所在的目錄路徑。有關(guān)圖形驅(qū)動器、圖形模式的符號常數(shù)及對應(yīng)的分辨率見graphics. h。圖形驅(qū)動程序由Turbo C出版商提供,文件擴(kuò)展名為.BGI。

36、 根據(jù)不同的圖形適配器有不同的圖形驅(qū)動程序。例如對于EGA、 VGA 圖形適配器就調(diào)用驅(qū)動程序EGAVGA.BGI。#include stdio.h#include graphics.hint main()int gdriver, gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/getch();closegraph();return 0;有時編程者并不知道所用的圖形顯示器適配器種類,或者需要將編寫的程序用于不同圖形驅(qū)動

37、器,Turbo C 提供了一個自動檢測顯示器硬件的函數(shù),其調(diào)用格式為:void far detectgraph(int *gdriver, *gmode);其中g(shù)driver和gmode的意義與上面相同。 自動進(jìn)行硬件測試后進(jìn)行圖形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdriver, &gmode); /*自動測試硬件*/printf(the graphics driver is %d, mode is %dn,gdriver,gmode); /*輸出測試結(jié)果*/get

38、ch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根據(jù)測試結(jié)果初始化圖形*/bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/getch();closegraph();return 0;上例程序中先對圖形顯示器自動檢測,然后再用圖形初始化函數(shù)進(jìn)行初始化設(shè)置,但Turbo C提供了一種更簡單的方法, 即用gdriver=DETECT 語句后再跟initgraph()函數(shù)就行了。采用這種方法后,上例可改為:#include stdio.h#include graphics.hint main()int gdriver

39、=DETECT, gmode;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(50, 50, 150, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出圖形狀態(tài)的函數(shù)closegraph(),其調(diào)用格式為:void far closegraph(void);第二節(jié) 屏幕顏色的設(shè)置和清屏函數(shù)對于圖形模式的屏幕顏色設(shè)置,同樣分為背景色的設(shè)置和前景色的設(shè)置。在Turbo C中分別用下面兩個函數(shù): 設(shè)置背景色: void far setbkcolor(int color);設(shè)置作圖色: voi

40、d far setcolor(int color);其中color 為圖形方式下顏色的規(guī)定數(shù)值,對EGA,VGA顯示器適配器,有關(guān)顏色的符號常數(shù)及數(shù)值見graphics.h。清除圖形屏幕內(nèi)容但不清除圖形背景使用清屏函數(shù),其調(diào)用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hint main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*圖形初始化*/setbkcolor(0); /*設(shè)

41、置圖形背景*/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();return 0;另外,TURBO C也提供了幾個獲得現(xiàn)行顏色設(shè)置情況的函數(shù)

42、。 int far getbkcolor(void); 返回現(xiàn)行背景顏色值。int far getcolor(void); 返回現(xiàn)行作圖顏色值。int far getmaxcolor(void); 返回最高可用的顏色值。第三節(jié) 基本畫圖函數(shù)基本圖形函數(shù)包括畫點,線以及其它一些基本圖形的函數(shù)。本節(jié)對這些函數(shù)作一全面的介紹。 、畫點. 畫點函數(shù) void far putpixel(int x, int y, int color); 該函數(shù)表示有指定的象元畫一個按color 所確定顏色的點。對于顏色color的值可從表3中獲得而對x, y是指圖形象元的坐標(biāo)。在圖形模式下,是按象元來定義坐標(biāo)的。對VG

43、A適配器,它的最高分辨率為640 x480,其中640為整個屏幕從左到右所有象元的個數(shù),480為整個屏幕從上到下所有象元的個數(shù)。屏幕的左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(639, 479),水平方向從左到右為x 軸正向,垂直方向從上到下為y軸正向。TURBO C的圖形函數(shù)都是相對于圖形屏幕坐標(biāo),即象元來說的。關(guān)于點的另外一個函數(shù)是: int far getpixel(int x, int y); 它獲得當(dāng)前點(x, y)的顏色值。 II、有關(guān)坐標(biāo)位置的函數(shù) int far getmaxx(void);返回x軸的最大值。int far getmaxy(void);返回y軸的最大值。int fa

44、r getx(void); 返回游標(biāo)在x軸的位置。void far gety(void); 返回游標(biāo)有y軸的位置。void far moveto(int x, int y); 移動游標(biāo)到(x, y)點,不是畫點,在移動過程中亦畫點。void far moverel(int dx, int dy); 移動游標(biāo)從現(xiàn)行位置(x, y)移動到(x+dx, y+dy)的位置,移動過程中不畫點。、畫線I. 畫線函數(shù)TURBO C提供了一系列畫線函數(shù): void far line(int x0, int y0, int x1, int y1); 畫一條從點(x0, y0)到(x1, y1)的直線。void

45、far lineto(int x, int y); 畫一作從現(xiàn)行游標(biāo)到點(x, y)的直線。void far linerel(int dx, int dy); 畫一條從現(xiàn)行游標(biāo)(x,y)到按相對增量確定的點(x+dx, y+dy)的直線。void far circle(int x, int y, int radius); 以(x, y)為圓心,radius為半徑,畫一個圓。void far arc(int x, int y, int stangle, int endangle,int radius); 以(x,y)為圓心,radius為半徑,從stangle開始到endangle結(jié)束(用度表示

46、)畫一段圓弧線。在TURBO C中規(guī)定x軸正向為0 度,逆時針方向旋轉(zhuǎn)一周, 依次為90,180, 270和360度(其它有關(guān)函數(shù)也按此規(guī)定,不再重述)。 void ellipse(int x, int y, int stangle, int endangle,int xradius,int yradius);以(x, y)為中心,xradius,yradius為x軸和y軸半徑,從角stangle 開始到endangle結(jié)束畫一段橢圓線,當(dāng)stangle=0,endangle=360時, 畫出一個完整的橢圓。void far rectangle(int x1, int y1, int x2,

47、inty2); 以(x1, y1)為左上角,(x2, y2)為右下角畫一個矩形框。 void far drawpoly(int numpoints, int far *polypoints); 畫一個頂點數(shù)為numpoints,各頂點坐標(biāo)由polypoints給出的多邊形。polypoints整型數(shù)組必須至少有2 倍頂點數(shù)個無素。每一個頂點的坐標(biāo)都定義為x,y,并且x在前。值得注意的是當(dāng)畫一個封閉的多邊形時,numpoints 的值取實際多邊形的頂點數(shù)加一,并且數(shù)組polypoints中第一個和最后一個點的坐標(biāo)相同。下面舉一個用drawpoly()函數(shù)畫箭頭的例子。#include stdio

48、.h#include graphics.hint main()int gdriver, gmode, i;int arw16=200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(12); /*設(shè)置作圖顏色*/drawpoly(8, arw); /*畫一箭頭*/getch();closegraph();return 0;II、設(shè)定線型函數(shù)在

49、沒有對線的特性進(jìn)行設(shè)定之前,TURBO C 用其默認(rèn)值,即一點寬的實線,但TURBO C 也提供了可以改變線型的函數(shù)。線型包括:寬度和形狀。其中寬度只有兩種選擇:一點寬和三點寬。而線的形狀則有五種。下面介紹有關(guān)線型的設(shè)置函數(shù)。void far setlinestyle(int linestyle,unsigned upattern,int thickness);該函數(shù)用來設(shè)置線的有關(guān)信息,其中l(wèi)inestyle是線形狀的規(guī)定,見graphics.h。對于upattern,只有l(wèi)inestyle選USERBIT_LINE 時才有意義 (選其它線型,uppattern取0即可)。此時uppatte

50、rn的16位二進(jìn)制數(shù)的每一位代表一個象元,如果那位為1,則該象元打開,否則該象元關(guān)閉。 void far getlinesettings(struct linesettingstypefar *lineinfo);該函數(shù)將有關(guān)線的信息存放到由lineinfo 指向的結(jié)構(gòu)中,表中l(wèi)inesettingstype的結(jié)構(gòu)如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面兩句程序可以讀出當(dāng)前線的特性 struct linesettingstype *info;getlinesettings(info)

51、;void far setwritemode(int mode);該函數(shù)規(guī)定畫線的方式。如果mode=0,則表示畫線時將所畫位置的原來信息覆蓋了(這是TURBO C的默認(rèn)方式)。如果mode=1, 則表示畫線時用現(xiàn)在特性的線與所畫之處原有的線進(jìn)行異或(XOR)操作,實際上畫出的線是原有線與現(xiàn)在規(guī)定的線進(jìn)行異或后的結(jié)果。因此,當(dāng)線的特性不變,進(jìn)行兩次畫線操作相當(dāng)于沒有畫線。有關(guān)線型設(shè)定和畫線函數(shù)的例子如下所示。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;gdriver=DETECT;initgraph(&g

52、driver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(GREEN);circle(320, 240, 98);setlinestyle(0, 0, 3); /*設(shè)置三點寬實線*/setcolor(2);rectangle(220, 140, 420, 340);setcolor(WHITE);setlinestyle(4, 0 xaaaa, 1);/*設(shè)置一點寬用戶定義線*/line(220, 240, 420, 240);line(320, 140, 320, 340);getch();closegraph()

53、;return 0;第四節(jié) 基本圖形的填充填充就是用規(guī)定的顏色和圖模填滿一個封閉圖形。 一般是先畫輪廓再填充。TURBO C提供了一些先畫出基本圖形輪廓, 再按規(guī)定圖模和顏色填充整個封閉圖形的函數(shù)。在沒有改變填充方式時,TURBO C 以默認(rèn)方式填充。 void far bar(int x1, int y1, int x2, int y2);確定一個以(x1,y1)為左上角,(x2,y2)為右下角的矩形窗口,再按規(guī)定圖模和顏色填充。說明:此函數(shù)不畫出邊框,所以填充色為邊框。void far bar3d(int x1, int y1, int x2, int y2,int depth,int t

54、opflag);當(dāng)topflag為非0時, 畫出一個三維的長方體。當(dāng)topflag為0時,三維圖形不封頂,實際上很少這樣使用。說明: bar3d()函數(shù)中,長方體第三維的方向不隨任何參數(shù)而變,即始終為45度的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);畫一個以(x, y)為圓心,radius為半徑,stangle為起始角度,endangle 為終止角度的扇形,再按規(guī)定方式填充。當(dāng)stangle=0,endangle=360 時變成一個實心圓,并在圓內(nèi)從圓點沿X軸正向畫一條半徑。void far se

55、ctor(int x, int y,int stanle,intendangle,int xradius, int yradius);畫一個以(x, y)為圓心分別以xradius, yradius為x軸和y軸半徑,stangle 為起始角,endangle為終止角的橢圓扇形,再按規(guī)定方式填充。第五節(jié) 設(shè)定填充方式TURBO C有四個與填充方式有關(guān)的函數(shù)。下面分別介紹: void far setfillstyle(int pattern, int color); color的值是當(dāng)前屏幕圖形模式時顏色的有效值。pattern的值及與其等價的符號常數(shù)見graphics.h。除USER_FILL(

56、用戶定義填充式樣)以外,其它填充式樣均可由setfillstyle() 函數(shù)設(shè)置。當(dāng)選用USER_FILL時,該函數(shù)對填充圖模和顏色不作任何改變。 之所以定義USER_FILL主要因為在獲得有關(guān)填充信息時用到此項。void far setfillpattern(char * upattern,int color); 設(shè)置用戶定義的填充圖模的顏色以供對封閉圖形填充。其中upattern是一個指向8個字節(jié)的指針。這8個字節(jié)定義了8x8點陣的圖形。每個字節(jié)的8位二進(jìn)制數(shù)表示水平8點,8個字節(jié)表示8行,然后以此為模型向個封閉區(qū)域填充。void far getfillpattern(char * upa

57、ttern); 該函數(shù)將用戶定義的填充圖模存入upattern指針指向的內(nèi)存區(qū)域。void far getfillsetings(struct fillsettingstypefar * fillinfo); 獲得現(xiàn)行圖模的顏色并將存入結(jié)構(gòu)指針變量fillinfo中。其中fillsettingstype結(jié)構(gòu)定義如下:struct fillsettingstypeint pattern; /* 現(xiàn)行填充模式 * /int color; /* 現(xiàn)行填充模式 * /; 有關(guān)圖形填充圖模的顏色的選擇,請看下面例程。#include stdio.h#include graphics.hmain()cha

58、r str8=10,20,30,40,50,60,70,80; /*用戶定義圖模*/int gdriver,gmode,i;struct fillsettingstype save;/*定義一個用來存儲填充信息的結(jié)構(gòu)變量*/gdriver=DETECT;initgraph(&gdriver,&gmode,C:TC2.0BGI);setbkcolor(BLUE);cleardevice();for(i=0;i13;i+)setcolor(i+3);setfillstyle(i,2+i); /* 設(shè)置填充類型 */bar(100,150,200,50); /*畫矩形并填充*/bar3d(300,1

59、00,500,200,70,1); /* 畫長方體并填充*/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();getfillsetti

60、ngs(&save);/*獲得用戶定義的填充模式信息*/closegraph();clrscr();printf(The pattern is %d, The color of filling is %d,save.pattern, save.color);/*輸出目前填充圖模和顏色值*/getch();第六節(jié) 任意封閉圖形的填充截止目前為止,我們只能對一些特定形狀的封閉圖形進(jìn)行填充,但還不能對任意封閉圖形進(jìn)行填充。為此,TURBO C 提供了一個可對任意封閉圖形填充的函數(shù),其調(diào)用格式如下: void far floodfill(int x, int y, int border); 其中:x,

溫馨提示

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

評論

0/150

提交評論