版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、 中國地質(zhì)大學(xué)(武漢) 數(shù)字信號處理上機實習(xí) 學(xué)生姓名: 班 級:071132 學(xué) 號:2013100 指導(dǎo)老師:王曉莉 題目一 離散卷積計算實驗題目設(shè)線性時不變(LTI)系統(tǒng)的沖激響應(yīng)為h(n),輸入序列為x(n)1、h(n)=(0.8)n,0n4; x(n)=u(n)-u(n-4)2、h(n)=(0.8)nu(n), x(n)=u(n)-u(n-4)3、h(n)=(0.8)nu(n), x(n)=u(n)求以上三種情況下系統(tǒng)的輸出y(n),顯示輸入和輸出波形。實驗?zāi)康?.理解和掌握離散卷積計算;2.學(xué)習(xí)如何用Mtalab實現(xiàn)離散卷積計算。三、算法設(shè)計離散卷積定義為:, 當(dāng) 時,;當(dāng)時,(0
2、.8)n ;當(dāng)時,(0.8)n;當(dāng)時,;2、, (a) 當(dāng) 時,;(b) 當(dāng)時,(0.8)n;(c) 當(dāng)時,(0.8)n;(d) 當(dāng)時,(0.8)n;當(dāng)時,;3、, (a) 當(dāng) 時,;(b) 當(dāng)時,(0.8)n;(c) 當(dāng)時,(0.8)n;(d) 當(dāng)時,;程序分析所用到的函數(shù):(1)y=conv(x.,h):卷積運算函數(shù),計算;(2)n1=0:4:n1取04;(3)subplot(m,n,p):subplot()函數(shù)是將多個圖畫到一個平面上的工具。其中,m表示是圖排成m行,n表示圖排成n列,也就是整個figure中有n個圖是排成一行的,一共m行,如果m=2就是表示2行圖。p表示圖所在的位置,p
3、=1表示從左到右從上到下的第一個位置。(4)title(content ):title()函數(shù)的功能是為當(dāng)前坐標(biāo)系添加標(biāo)題“content ”。五、程序設(shè)計n=0:4;h=0.8.n;x=1 1 1 1subplot(331);stem(x); title(x(n);y=conv(x,h);subplot(332);stem(h); title(h(n);subplot(333);stem(y); title(y(n); n=0:40;h=0.8.n;x=1 1 1 1subplot(334);stem(x); title(x(n);y=conv(x,h);subplot(335);stem(
4、h); title(h(n);subplot(336);stem(y); title(y(n); n=0:40;h=0.8.n;x=zeros(1,0),ones(1,40);subplot(337);stem(x); title(x(n);y=conv(x,h);subplot(338);stem(h); title(h(n);subplot(339);stem(y); title(y(n);六、運行結(jié)果圖中從左至右三列依次對應(yīng)、及卷積結(jié)果題目二 離散傅立葉變換實驗題目設(shè)有離散序列 分析下列三種情況下的幅頻特性。采集數(shù)據(jù)長度N=16,分析16點的頻譜,并畫出幅頻特性。采集數(shù)據(jù)長度N=16,并
5、補零到64點,分析其頻譜,并畫出幅頻特性。采集數(shù)據(jù)長度N=64,分析64點的頻譜,并畫出幅頻特性。觀察三幅不同的幅頻特性圖,分析和比較它們的特點及形成原因。實驗?zāi)康?、理解掌握DFT及FFT算法;2、利用FFT算法計算信號的頻譜。三、算法設(shè)計當(dāng)抽樣數(shù)N=2M時,以下為蝶形算法圖。當(dāng)N=2M時,則要進行M次分解,即進行M級蝶形單元的計算;2、按自然順序輸入,輸出是碼位倒置;3、每一級包含N/2個基本蝶形運算;4、第L級有2L-1個蝶群,蝶群間隔為N/2L-1;四、程序分析所用到的函數(shù):fft():求x的一維傅里葉變換,計算X(k);使用方法Xk=fft(xn),例如:N=8;n=0:N-1;xn
6、=4 3 2 6 7 8 9 0;Xk=fft(xn)(2)stem():顯示函數(shù)圖像。(3)xlabel():橫坐標(biāo)軸的名稱;(4)ylabel():縱坐標(biāo)軸的名稱;五、程序設(shè)計%x(n)=cos(0.48n)+cos(0.52n)n=0:15; %產(chǎn)生序列x(n) 取16點x=cos(0.48*pi*n)+cos(0.52*pi*n);subplot(231);stem(n,x);title(采集數(shù)據(jù)長度N=16); %顯示x(n)x1k=fft(x,16);%進行16點傅里葉變換subplot(234);stem(0:15,abs(x1k),.); %顯示X(k)xlabel(n);yl
7、abel(X1(k); title(16點傅立葉變換頻譜); x=x zeros(1,48); %取16點,補零到64點x2k=fft(x,64);%進行64點傅里葉變換subplot(232);stem(x);title(采集N=16,補零到64);subplot(235);stem(0:63,abs(x2k),.);xlabel(n);ylabel(X2(k);title(64點傅立葉變換頻譜); n=0:63; %產(chǎn)生序列x(n),取64點x=cos(0.48*pi*n)+cos(0.52*pi*n);subplot(233);stem(n,x);title(采集數(shù)據(jù)長度N=64);x3
8、k=fft(x);%做64點傅里葉變換subplot(236);stem(0:63,abs(x3k),.);xlabel(n);ylabel(X3(k);title(64點傅立葉變換頻譜);六、運行結(jié)果七結(jié)果分析N點DFT的頻譜分辨率是2 /N。一節(jié)指出可以通過補零觀察到更多的頻點,但是這并不意味著補零能夠提高真正的頻譜分辨率。這是因為xn 實際上是x(t) 采樣的主值序列,而將xn補零得到的xn 周期延拓之后與原來的序列并不相同,也不是x(t) 的采樣。因此是不同離散信號的頻譜。對于補零至M點的x的DFT,只能說它的分辨率2 /M僅具有計算上的意義,并不是真正的、物理意義上的頻譜。頻譜分辨率
9、的提高只能通過提高采樣頻率實現(xiàn)。第三幅圖形取樣點數(shù)較多,分辨率最高,而第一幅圖形則顯得較為稀疏,主要是因為取樣點數(shù)太少。題目三 IIR濾波器的設(shè)計實驗題目1、設(shè)計一個切比雪夫數(shù)字低通濾波器,設(shè)計指標(biāo)如下: 通帶截止頻率:0.2,幅度衰減不大于3分貝 阻帶截止頻率:0.3,幅度衰減大于20分貝2、分析不同濾波器的特點和結(jié)果。3、編程設(shè)計實現(xiàn)IIR濾波器。二、實驗?zāi)康?.理解和掌握不同IIR濾波器的性質(zhì)、特點。2.掌握用Matlab設(shè)計切比雪夫濾波器和橢圓濾波器的方法。三、算法設(shè)計1、濾波器類型切比雪夫濾波器:切比雪夫濾波器,又名“車比雪夫濾波器”,是在通帶或阻帶上頻率響應(yīng)幅度等波紋波動的濾波器。
10、2、變換方法(a)沖激響應(yīng)不變法沖激響應(yīng)不變法的基本原理是從濾波器的沖激響應(yīng)出發(fā),對模擬濾波器沖激響應(yīng)h(t)進行取樣,所得到的離散序列h(nT)作為數(shù)字濾波器的單位取樣響應(yīng)。H(z)是由H(s)通過下式的對應(yīng)關(guān)系得到。(b)雙線性變換是在所得到滿足性能指標(biāo)要求的模擬濾波器的基礎(chǔ)上,通過變換,從而得到相應(yīng)的數(shù)字濾波器。程序分析所用到的函數(shù):(1)N,wn=buttord(Wp,Ws,ap,as,s):階數(shù),截止頻率=buttord(通帶截止頻率,阻帶截止頻率,通帶衰減,阻帶衰減,模擬);(2)num,den=bilinear(b,a,fs):雙線性變換可選頻率預(yù)畸變,在 HYPERLINK /
11、s?q=IIR%E6%95%B0%E5%AD%97%E6%BB%A4%E6%B3%A2%E5%99%A8&ie=utf-8&src=wenda_link t /q/_blank IIR數(shù)字濾波器設(shè)計中有把模擬的原型 HYPERLINK /s?q=%E6%BB%A4%E6%B3%A2%E5%99%A8&ie=utf-8&src=wenda_link t /q/_blank 濾波器轉(zhuǎn)變成相應(yīng)的數(shù)字濾波器,即通過已知S變換中 HYPERLINK /s?q=%E6%A8%A1%E6%8B%9F%E6%BB%A4%E6%B3%A2%E5%99%A8&ie=utf-8&src=wenda_link t /
12、q/_blank 模擬濾波器的系數(shù)求數(shù)字濾波器的系數(shù)。其中有兩種方法來進行這種變換,一種是激沖不變法,另一種是雙線性 HYPERLINK /s?q=Z%E5%8F%98%E6%8D%A2&ie=utf-8&src=wenda_link t /q/_blank Z變換法。bilinear 函數(shù)便是雙線性Z變換法。函數(shù)中的b和a是原模擬濾波器S變換中的分子和分母系數(shù),num和den是數(shù)字濾波器的系數(shù)。(3)grid on:增加主要網(wǎng)格線為當(dāng)前軸;(4)h,w=freqz(num,den):求頻率響應(yīng)。函數(shù)的輸出:a.濾波器的頻率響應(yīng)H(N點)b.頻率向量W(N點,且單位為弧度),頻率向量W是均勻分
13、布在濾波器的上半?yún)^(qū),即:0:pi,這些點上的頻率響應(yīng)都將通過此函數(shù)計算出來。;濾波器的系數(shù):分子為num,分母為den。 五、程序設(shè)計clc;Rs=20; Rp=3;Wp1=0.2*pi;Ws1=0.3*pi;N,Wn=cheb1ord(Wp1,Ws1,Rp,Rs,s);num1,den1=cheby1(N,Rp,Wn,s);num,den=bilinear(num1,den1,0.5); subplot(2,2,1);zplane(num,den);title(零極點圖)w=0:pi/256:pi;h=freqz(num,den,w);g=abs(h);g1=angle(h);subplot
14、(223);plot(w/pi,g);gridaxis(0 1 0 1);xlabel(頻率); ylabel(幅度); title(幅頻響應(yīng));subplot(224);plot(w/pi,g1);grid onaxis(0 1 -5 5);xlabel(頻率); ylabel(相位); title(相頻響應(yīng));%測試t=1:300;I=sin(0.1*pi*t)+sin(0.8*pi*t)+sin(0.95*pi*t);%設(shè)計正弦波figure;subplot(311);plot(I);title(原信號x(n)=sin(0.1*pi*t)+sin(0.8*pi*t)+sin(0.95*p
15、i*t);A=filter(num,den,I);%正弦波通過濾波器subplot(312);plot(A);title(濾波后y(n);運行結(jié)果零極點圖、幅頻響應(yīng)、相頻響應(yīng)(2)輸入為I=sin(0.1*pi*t)+sin(0.8*pi*t)+sin(0.95*pi*t)時的濾波結(jié)果結(jié)果分析由幅頻特性可知,橢圓濾波器在通帶內(nèi)的頻率特性是平坦的,并且隨著頻率的增加而衰減。通帶截止頻率:0.2,幅度衰減不大于3分貝,阻帶截止頻率:0.3,幅度衰減大于20分貝。正弦信號在經(jīng)過IIR濾波器濾波后,由傅里葉變換后的頻譜圖可看出高頻信號被濾除,低頻信號被保留了下來。題目四 FIR濾波器的設(shè)計一、實驗內(nèi)容
16、選取合適窗函數(shù)設(shè)計一個線性相位FIR低通濾波器,使它滿足如下性能指標(biāo):通帶截止頻率:p=0.66,通帶截止頻率處的衰減不大于3分貝;阻帶截止頻率:s=0.5,阻帶衰減不小于40分貝二、實驗?zāi)康?、掌握用窗函數(shù)法設(shè)計FIR濾波器的原理和方法。2、熟悉線性相位濾波器特性。3、了解各種窗函數(shù)對濾波器特性的影響。三、原理及算法概要1、算法通過其通帶截止頻率p與阻帶截止頻率s算出其過渡帶的寬度與濾波器的長度,從而得到理想濾波器的截止頻率,根據(jù)所要求的理想濾波器,得到hd(n)。由于其通帶截止頻率處的衰減不大于3分貝與阻帶衰減不小于40分貝,我選擇最接近的漢寧窗,最后調(diào)用函數(shù)h=hd.*win 及freq
17、z(h,1,512)得到實際漢寧窗的響應(yīng)和實際濾波器的幅度響應(yīng)。2、原理概要利用窗函數(shù)法設(shè)計FIR 濾波器,F(xiàn)IR濾波器的最大特點是其相位特性可以設(shè)計為嚴(yán)格的線性,而其幅值可以任意設(shè)置,這樣輸出波形就不會相位失真。理想低通濾波器的單位取樣響應(yīng)hd(n)是無限長的,所以要用一個有限長的因果序列h(n)進行逼近,最有效的方法是截斷hd(n),即用有限長的窗函數(shù)w(n)來截取hd(n),表示為h(n)=hd(n)w(n)。為獲得線性相位的FIR濾波器,h(n)必須滿足中心對稱條件,序列h(n)應(yīng)有一定的延遲,且=(N-1)/2頻率響應(yīng)逼近hd(ejw)的FIR濾波器,最簡單的窗函數(shù)為矩形窗: 1 n
18、(N-1)/2加窗后的頻譜 加窗后使實際頻響偏離理想頻響,影響主要有兩個方面:通帶和阻帶之間存在過渡帶,過渡帶寬度取決于窗函數(shù)頻響的主瓣寬度。通帶和阻帶區(qū)間有紋波,這是由窗函數(shù)的旁瓣引起的,旁瓣越多,紋波越多。增加窗函數(shù)的寬度N,其主瓣寬度減小,但不改變旁瓣的相對值。為了改善濾波器的性能,要求窗函數(shù)的主瓣寬度盡可能窄,以獲得較窄的過渡帶;旁瓣衰減盡可能大,數(shù)量盡可能大,從而改善紋波狀況,使實際頻響H(ej)更好地逼近理想頻響Hd(ej)。除了矩形窗外,一般還可以采用以下幾種窗函數(shù) 漢寧窗:海明窗布來克曼窗程序設(shè)計 clc; wp=0.66*pi;ws=0.5*pi;wd=wp-ws;%hann
19、ing窗N_hann=ceil(8*pi/wd); wc=(wp+ws)/2;if mod(N_hann,2)=0 N_hann=N_hann+1;endhann_win=hanning(N_hann);b_hann=fir1(N_hann-1,wc/pi,high,hann_win);freq_axis=0:pi/512:pi-pi/512;freqn=0:511/512;H_hann=freqz(b_hann,1,512);figure(1);subplot(311);plot(freqn,20*log10(abs(H_hann);xlabel(歸一化頻率w/pi);ylabel(幅度譜(
20、dB));title(采用hanning窗設(shè)計fir濾波器幅度譜);subplot(312);plot(freqn,angle(H_hann);xlabel(歸一化頻率w/pi);ylabel(相位譜);title(采用hanning窗設(shè)計fir濾波器相位譜);subplot(313);stem(b_hann);xlabel(n);ylabel(h(n);title(單位脈沖響應(yīng)序列);%hamming窗N_hamm=ceil(8*pi/wd);wc=(wp+ws)/2;if mod(N_hamm,2)=0 N_hamm=N_hamm+1;endhamm_win=hamming(N_hamm)
21、;b_hamm=fir1(N_hamm-1,wc/pi,high,hamm_win);H_hamm=freqz(b_hamm,1,512);figure(2); subplot(311);plot(freqn,20*log10(abs(H_hamm);xlabel(歸一化頻率w/pi);ylabel(幅度譜(dB));title(采用hamming窗設(shè)計fir濾波器幅度譜);subplot(312);plot(freqn,angle(H_hamm);xlabel(歸一化頻率w/pi);ylabel(相位譜);title(采用hamming窗設(shè)計fir濾波器相位譜);subplot(313);s
22、tem(b_hann);xlabel(n);ylabel(h(n);title(單位脈沖響應(yīng)序列);程序運行結(jié)果(1)采用hanning窗設(shè)計FIR濾波器(2)采用hamming窗設(shè)計FIR濾波器結(jié)果分析上圖為選用漢寧窗和漢明窗的FIR 濾波器的相頻特性、幅頻特性及單位取樣響應(yīng)hd(n)。由運行得出的幅頻特性可知,滿足設(shè)計指標(biāo)通帶截止頻率:p=0.66;阻帶截止頻率:s=0.5。得出的窗主瓣寬度較寬,旁瓣寬度較窄,也合乎要求。題目五一、實驗內(nèi)容錄制一段電話的撥號音,并對錄制的信號進行采樣;畫出采樣后信號的時域波形和頻譜圖;必要的話對采集的信號進行濾波,畫出濾波后信號的時域波形和頻譜,并對濾波前
23、后的信號進行對比,根據(jù)信號的頻譜解析出撥號的數(shù)字。最后,用MATLAB設(shè)計一信號處理系統(tǒng)界面。二、實驗?zāi)康?、掌握用濾波器處理語音信號的原理和方法。2、掌握用matlab設(shè)計界面。三、原理及算法概要調(diào)用函數(shù)function pushbutton1_Callback(hObject, eventdata, handles)實現(xiàn)一個信號處理系統(tǒng)界面。選擇button1時,用雙線性變換法設(shè)計濾波器來對信號進行處理。讀取語音信號,對語音信號進行f=8000的頻率進行采樣,調(diào)用函數(shù)y1=fft(x1,2048)對所采集的點做2048點FFT變換。先設(shè)計butterworth模擬濾波器,再用雙線性變換法實
24、現(xiàn)模擬濾波器到數(shù)字濾波器的轉(zhuǎn)換。最后調(diào)用函數(shù)f1=filter(bz,az,x2)對加了噪聲的語音信號進行濾波,得到濾波后的頻譜圖。程序% Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with
25、 handles and user data (see GUIDATA)clc;fs=8000; %語音信號采樣頻率為8000 x1=wavread(D:matlab2011workshua.wav);t=(0:length(x1)-1)/8000;y1=fft(x1,2048); %對信號做2048點FFT變換f=fs*(0:1023)/2048;plot(handles.axes1,t,x1); %做原始信號的時域波形grid on;axis tight;title(handles.axes1,原始語音信號);xlabel(handles.axes1,time(s);ylabel(hand
26、les.axes1,幅度);plot(handles.axes2,f,abs(y1(1:1024); %做原始信號的FFT頻譜grid on;axis tight;title(handles.axes2,原始語音信號的FFT頻譜);xlabel(handles.axes2,Hz);ylabel(handles.axes2,幅度);%雙線性變換法設(shè)計的巴特沃斯濾波器A1=0.05;A2=0.10;d=A1*cos(2*pi*3800*t)+A2*sin(2*pi*3600*t);x2=x1+d;wp=0.8*pi;ws=0.85*pi;Rp=1;Rs=15;Fs=8000;Ts=1/Fs;wp1
27、=2/Ts*tan(wp/2); %將模擬指標(biāo)轉(zhuǎn)換為數(shù)字指標(biāo)ws1=2/Ts*tan(ws/2);N,Wn=buttord(wp1,ws1,Rp,Rs,s); %選擇濾波器最小階數(shù)Z,P,K=buttap(N); %創(chuàng)建butterworth模擬濾波器Bap,Aap=zp2tf(Z,P,K);b,a=lp2lp(Bap,Aap,Wn); bz,az=bilinear(b,a,Fs); %用雙線性法實現(xiàn)模擬到數(shù)字的轉(zhuǎn)換H,W=freqz(bz,az); %繪制頻率響應(yīng)曲線plot(handles.axes3,W*Fs/(2*pi),abs(H);grid on;axis tight;xlabel
28、(handles.axes3,頻率(Hz));ylabel(handles.axes3,頻率響應(yīng));title(handles.axes3,Butterworth);f1=filter(bz,az,x2);plot(handles.axes4,t,x2); %畫出濾波前的時域圖grid on;axis tight;title(handles.axes4,加噪聲信號濾波前的時域波形);plot(handles.axes5,t,f1); %畫出濾波后的時域圖grid on;axis tight;title(handles.axes5,濾波后的時域波形);y3=fft(f1,2048);y2=fft
29、(x2,2048);plot(handles.axes6,f,abs(y2(1:1024); %畫出濾波前的頻譜圖grid on;axis tight;title(handles.axes6,加噪聲信號濾波前的頻譜);xlabel(handles.axes6,Hz);ylabel(handles.axes6,幅度);plot(handles.axes7,f,abs(y3(1:1024); %畫出濾波后的頻譜圖grid on;axis tight;title(handles.axes7,濾波后的頻譜);xlabel(handles.axes7,Hz);ylabel(handles.axes7,幅
30、度);實驗結(jié)果 實驗界面原始信號和加噪聲信號的時域、頻域波形巴特沃斯濾波器濾波后信號的時域、頻域波形 五結(jié)果分析 所以從語音的頻譜可以看出,通過低通濾波器之后,濾波后的時域波形對濾波前的時域波形看起來相對光滑一些,濾波后的頻譜圖,濾除了添加的高頻噪聲信號,保留了低頻信號,語音效果也改善了不少。通過最后的頻譜圖可以看出,與之前語音信號的頻譜圖幾乎一樣。而通過比較雙線性變換法的濾波器可以看出,它們的濾波效果相似。附錄資料:不需要的可以自行刪除 C語言圖形模式速成第一節(jié) 圖形模式的初始化Turbo C 提供了非常豐富的圖形函數(shù),所有圖形函數(shù)的原型均在graphics. h 中,本節(jié)主要介紹圖形模式的
31、初始化、獨立圖形程序的建立、基本圖形功能、圖形窗口以及圖形模式下的文本輸出等函數(shù)。另外,使用圖形函數(shù)時要確保有顯示器圖形驅(qū)動程序*.BGI,同時將集成開發(fā)環(huán)境options/Linker中的Graphics lib選為on,只有這樣才能保證正確使用圖形函數(shù)。 不同的顯示器適配器有不同的圖形分辨率。即是同一顯示器適配器,在不同模式下也有不同分辨率。因此,在屏幕作圖之前,必須根據(jù)顯示器適配器種類將顯示器設(shè)置成為某種圖形模式,在未設(shè)置圖形模式之前,微機系統(tǒng)默認(rèn)屏幕為文本模式(80列,25行字符模式),此時所有圖形函數(shù)均不能工作。設(shè)置屏幕為圖形模式,可用下列圖形初始化函數(shù):void far initg
32、raph(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出版商提供,文件擴展名為.BGI。 根據(jù)不同的圖形適配器有不同的圖形驅(qū)動程序。例如對于EGA、 VGA 圖形適配器就調(diào)用驅(qū)動程序EGAVGA.BGI。#include stdio.h#include graphics.hint main()int gdriver, gmode;gdriver=VGA;
33、gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/getch();closegraph();return 0;有時編程者并不知道所用的圖形顯示器適配器種類,或者需要將編寫的程序用于不同圖形驅(qū)動器,Turbo C 提供了一個自動檢測顯示器硬件的函數(shù),其調(diào)用格式為:void far detectgraph(int *gdriver, *gmode);其中g(shù)driver和gmode的意義與上面相同。 自動進行硬件測試后進行圖形初始化:#include stdio
34、.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdriver, &gmode); /*自動測試硬件*/printf(the graphics driver is %d, mode is %dn,gdriver,gmode); /*輸出測試結(jié)果*/getch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根據(jù)測試結(jié)果初始化圖形*/bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/getch();closegraph();return 0;
35、上例程序中先對圖形顯示器自動檢測,然后再用圖形初始化函數(shù)進行初始化設(shè)置,但Turbo C提供了一種更簡單的方法, 即用gdriver=DETECT 語句后再跟initgraph()函數(shù)就行了。采用這種方法后,上例可改為:#include stdio.h#include graphics.hint main()int gdriver=DETECT, gmode;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(50, 50, 150, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出圖形狀
36、態(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è)置作圖色: void far setcolor(int color);其中color 為圖形方式下顏色的規(guī)定數(shù)值,對EGA,VGA顯示器適配器,有關(guān)顏色的符號常數(shù)及數(shù)值見graphics.h。清除圖形屏幕內(nèi)容但不清除圖形背景使用清屏函數(shù),其調(diào)用格式如下: voide far clear
37、device(void);#include stdio.h#include graphics.hint main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*圖形初始化*/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+)setbkco
38、lor(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ù)。 int far getbkcolor(void); 返回現(xiàn)行背景顏色值。int far getcolor(void); 返回現(xiàn)行作圖顏色值。int far getmaxcolor(void); 返回最高可用的顏色值。第三節(jié) 基本畫圖函數(shù)基本圖形函數(shù)包括畫點,線以及
39、其它一些基本圖形的函數(shù)。本節(jié)對這些函數(shù)作一全面的介紹。 、畫點. 畫點函數(shù) void far putpixel(int x, int y, int color); 該函數(shù)表示有指定的象元畫一個按color 所確定顏色的點。對于顏色color的值可從表3中獲得而對x, y是指圖形象元的坐標(biāo)。在圖形模式下,是按象元來定義坐標(biāo)的。對VGA適配器,它的最高分辨率為640 x480,其中640為整個屏幕從左到右所有象元的個數(shù),480為整個屏幕從上到下所有象元的個數(shù)。屏幕的左上角坐標(biāo)為(0,0),右下角坐標(biāo)為(639, 479),水平方向從左到右為x 軸正向,垂直方向從上到下為y軸正向。TURBO C的圖
40、形函數(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 far 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(i
41、nt 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 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
42、(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é)束(用度表示)畫一段圓弧線。在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
43、 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, inty2); 以(x1, y1)為左上角,(x2, y2)為右下角畫一個矩形框。 void far drawpoly(int numpoints, int far *polypoints); 畫一個頂點數(shù)為numpoints,各頂點坐標(biāo)由polypoints給出的多
44、邊形。polypoints整型數(shù)組必須至少有2 倍頂點數(shù)個無素。每一個頂點的坐標(biāo)都定義為x,y,并且x在前。值得注意的是當(dāng)畫一個封閉的多邊形時,numpoints 的值取實際多邊形的頂點數(shù)加一,并且數(shù)組polypoints中第一個和最后一個點的坐標(biāo)相同。下面舉一個用drawpoly()函數(shù)畫箭頭的例子。#include stdio.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=DE
45、TECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(12); /*設(shè)置作圖顏色*/drawpoly(8, arw); /*畫一箭頭*/getch();closegraph();return 0;II、設(shè)定線型函數(shù)在沒有對線的特性進行設(shè)定之前,TURBO C 用其默認(rèn)值,即一點寬的實線,但TURBO C 也提供了可以改變線型的函數(shù)。線型包括:寬度和形狀。其中寬度只有兩種選擇:一點寬和三點寬。而線的形狀則有五種。下面介紹有關(guān)線型的設(shè)置函數(shù)。void far setlinestyle
46、(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即可)。此時uppattern的16位二進制數(shù)的每一位代表一個象元,如果那位為1,則該象元打開,否則該象元關(guān)閉。 void far getlinesettings(struct linesettingstypefar *lineinfo);該函數(shù)將有關(guān)線的信息存放到由lineinfo 指向的結(jié)
47、構(gòu)中,表中l(wèi)inesettingstype的結(jié)構(gòu)如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面兩句程序可以讀出當(dāng)前線的特性 struct linesettingstype *info;getlinesettings(info);void far setwritemode(int mode);該函數(shù)規(guī)定畫線的方式。如果mode=0,則表示畫線時將所畫位置的原來信息覆蓋了(這是TURBO C的默認(rèn)方式)。如果mode=1, 則表示畫線時用現(xiàn)在特性的線與所畫之處原有的線進行異或(XOR)操作,實
48、際上畫出的線是原有線與現(xiàn)在規(guī)定的線進行異或后的結(jié)果。因此,當(dāng)線的特性不變,進行兩次畫線操作相當(dāng)于沒有畫線。有關(guān)線型設(shè)定和畫線函數(shù)的例子如下所示。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(GREEN);circle(320, 240, 98);setlinestyle(0, 0, 3); /*設(shè)置三點寬實線*/setc
49、olor(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();return 0;第四節(jié) 基本圖形的填充填充就是用規(guī)定的顏色和圖模填滿一個封閉圖形。 一般是先畫輪廓再填充。TURBO C提供了一些先畫出基本圖形輪廓, 再按規(guī)定圖模和顏色填充整個封閉圖形的函數(shù)。在沒有改變填充方式時,TURBO C 以默認(rèn)方式填充。 void fa
50、r 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 topflag);當(dāng)topflag為非0時, 畫出一個三維的長方體。當(dāng)topflag為0時,三維圖形不封頂,實際上很少這樣使用。說明: bar3d()函數(shù)中,長方體第三維的方向不隨任何參數(shù)而變,即始終為45度的方向。void far pieslice(int x,int
51、 y,int stangle,int endangle,int radius);畫一個以(x, y)為圓心,radius為半徑,stangle為起始角度,endangle 為終止角度的扇形,再按規(guī)定方式填充。當(dāng)stangle=0,endangle=360 時變成一個實心圓,并在圓內(nèi)從圓點沿X軸正向畫一條半徑。void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);畫一個以(x, y)為圓心分別以xradius, yradius為x軸和y軸半徑,stangle 為起始角,endangle為終止角的
52、橢圓扇形,再按規(guī)定方式填充。第五節(jié) 設(shè)定填充方式TURBO C有四個與填充方式有關(guān)的函數(shù)。下面分別介紹: void far setfillstyle(int pattern, int color); color的值是當(dāng)前屏幕圖形模式時顏色的有效值。pattern的值及與其等價的符號常數(shù)見graphics.h。除USER_FILL(用戶定義填充式樣)以外,其它填充式樣均可由setfillstyle() 函數(shù)設(shè)置。當(dāng)選用USER_FILL時,該函數(shù)對填充圖模和顏色不作任何改變。 之所以定義USER_FILL主要因為在獲得有關(guān)填充信息時用到此項。void far setfillpattern(cha
53、r * upattern,int color); 設(shè)置用戶定義的填充圖模的顏色以供對封閉圖形填充。其中upattern是一個指向8個字節(jié)的指針。這8個字節(jié)定義了8x8點陣的圖形。每個字節(jié)的8位二進制數(shù)表示水平8點,8個字節(jié)表示8行,然后以此為模型向個封閉區(qū)域填充。void far getfillpattern(char * upattern); 該函數(shù)將用戶定義的填充圖模存入upattern指針指向的內(nèi)存區(qū)域。void far getfillsetings(struct fillsettingstypefar * fillinfo); 獲得現(xiàn)行圖模的顏色并將存入結(jié)構(gòu)指針變量fillinfo中。
54、其中fillsettingstype結(jié)構(gòu)定義如下:struct fillsettingstypeint pattern; /* 現(xiàn)行填充模式 * /int color; /* 現(xiàn)行填充模式 * /; 有關(guān)圖形填充圖模的顏色的選擇,請看下面例程。#include stdio.h#include graphics.hmain()char str8=10,20,30,40,50,60,70,80; /*用戶定義圖模*/int gdriver,gmode,i;struct fillsettingstype save;/*定義一個用來存儲填充信息的結(jié)構(gòu)變量*/gdriver=DETECT;initgra
55、ph(&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,100,500,200,70,1); /* 畫長方體并填充*/pieslice(200, 300, 90, 180, 90);/*畫扇形并填充*/sector(500,300,180,270,200,100);/*畫橢圓扇形并填充*/getch();cleardevic
56、e();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(The pattern is %d, The color of filling is %d,save.pattern, save.color);/*輸出目
57、前填充圖模和顏色值*/getch();第六節(jié) 任意封閉圖形的填充截止目前為止,我們只能對一些特定形狀的封閉圖形進行填充,但還不能對任意封閉圖形進行填充。為此,TURBO C 提供了一個可對任意封閉圖形填充的函數(shù),其調(diào)用格式如下: void far floodfill(int x, int y, int border); 其中:x, y為封閉圖形內(nèi)的任意一點,border為邊界的顏色,也就是封閉圖形輪廓的顏色。調(diào)用了該函數(shù)后,將用由函數(shù)setfillstyle()規(guī)定的顏色和模式填滿整個封閉圖形。注意:a. 如果x或y取在邊界上,則不進行填充。b. 如果不是封閉圖形則填充會從沒有封閉的地方溢出去
58、,填滿其它地方。c. 如果x或y在圖形外面,則填充封閉圖形外的屏幕區(qū)域。d. 由border指定的顏色值必須與圖形輪廓的顏色值相同, 但填充色可選任意顏色。下例是有關(guān)floodfill()函數(shù)的用法,該程序填充了bar3d()所畫長方體中其它兩個未填充的面。#include stdio.h#include graphics.hmain()int gdriver, gmode;struct fillsettingstype save;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevic
59、e();setcolor(LIGHTRED);setlinestyle(0,0,3);setfillstyle(1,14); /*設(shè)置填充方式*/bar3d(100,200,400,350,200,1); /*畫長方體并填充*/floodfill(450,300,LIGHTRED);/*填充長方體另外兩個面*/floodfill(250,150, LIGHTRED);rectangle(450,400,500,450); /*畫一矩形*/floodfill(470,420, LIGHTRED); /*填充矩形*/getch();closegraph();第七節(jié)屏幕操作函數(shù)除了清屏函數(shù)以外,關(guān)于
60、屏幕操作還有以下函數(shù): void far setactivepage(int pagenum); void far setvisualpage(int pagenum);這兩個函數(shù)只用于EGA,VGA 以及HERCULES圖形適配器。setctivepage()函數(shù)是為圖形輸出選擇激活頁。所謂激活頁是指后續(xù)圖形的輸出被寫到函數(shù)選定的pagenum頁面,該頁面并不一定可見。setvisualpage()函數(shù)才使pagenum所指定的頁面變成可見頁。頁面從0開始(Turbo C默認(rèn)頁)。如果先用setactivepage() 函數(shù)在不同頁面上畫出一幅幅圖像,再用setvisualpage() 函數(shù)
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 止水鋼板施工工藝文檔
- 瀝青瓦工程技術(shù)交底
- 人力資源員工工作總結(jié)
- 降排水專項施工方案
- 重癥監(jiān)護室實習(xí)生出科考試試題含答案
- 2025年礦山廢水處理試題及答案
- 科研人員求職面試技巧總結(jié)
- 建設(shè)工程施工合同糾紛要素式起訴狀模板附法律風(fēng)險提示
- 2026 年離婚協(xié)議書標(biāo)準(zhǔn)權(quán)威版
- 東北特鋼員工年終總結(jié)(3篇)
- 2025年醫(yī)院社區(qū)衛(wèi)生服務(wù)中心工作總結(jié)及2026年工作計劃
- 2025-2026學(xué)年北師大版七年級生物上冊知識點清單
- 委托作品協(xié)議書
- 食品加工廠乳制品設(shè)備安裝方案
- 2025至2030中國芳綸纖維行業(yè)發(fā)展分析及市場發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 尾牙宴活動策劃方案(3篇)
- 魯教版(2024)五四制英語七年級上冊全冊綜合復(fù)習(xí)默寫 (含答案)
- 生蠔課件教學(xué)課件
- 組塔架線安全培訓(xùn)
- 化療神經(jīng)毒性反應(yīng)護理
- 2025年度運營數(shù)據(jù)支及決策對工作總結(jié)
評論
0/150
提交評論