要繪制一份顯示器模式圖,你將需要gnuplot軟件包(一個類UNIX操作系統下的繪圖語言自由軟件)和modeplot
工具.它是一個輸入命令行選項來繪制顯示器特性圖的shell/gnuplot腳本
這里是modeplot
的一份拷貝:
#!/bin/sh # # modeplot--生成顯示器可使用的X模式圖 # # 執行'modeplot -?'獲知控制選項. # # 顯示器描述.頻寬以MHz為單位,行頻以KHz為單位,而場頻以Hz為單位. TITLE="Viewsonic 21PS" BANDWIDTH=185 MINHSF=31 MAXHSF=85 MINVSF=50 MAXVSF=160 ASPECT="4/3" vesa=72.5 # VESA建議的最小刷新率 while [ "$1" != "" ] do case $1 in -t) TITLE="$2"; shift;; -b) BANDWIDTH="$2"; shift;; -h) MINHSF="$2" MAXHSF="$3"; shift; shift;; -v) MINVSF="$2" MAXVSF="$3"; shift; shift;; -a) ASPECT="$2"; shift;; -g) GNUOPTS="$2"; shift;; -?) cat <<EOF modeplot control switches: -t "<description>" name of monitor defaults to "Viewsonic 21PS" -b <nn> bandwidth in MHz defaults to 185 -h <min> <max> min & max HSF (KHz) defaults to 31 85 -v <min> <max> min & max VSF (Hz) defaults to 50 160 -a <aspect ratio> aspect ratio defaults to 4/3 -g "<options>" pass options to gnuplot The -b, -h and -v options are required, -a, -t, -g optional. You can use -g to pass a device type to gnuplot so that (for example) modeplot's output can be redirected to a printer. See gnuplot(1) for details. The modeplot tool was created by Eric S. Raymond <esr@thyrsus.com> based on analysis and scratch code by Martin Lottermoser <Martin.Lottermoser@mch.sni.de> This is modeplot $Revision: 1.9 $ EOF exit;; esac shift done gnuplot $GNUOPTS <<EOF set title "$TITLE Mode Plot" # 有魔力的數值.不幸的是特性圖對它們的改變相當敏感,而對某些顯示器它們不能代表實際值.我們需要糾 # 正這些值以獲得更接近的模式圖.這些值是查找ModeDB數據庫中大量的值而得到的. F1 = 1.30 # 轉換水平分辨率到幀寬的倍數 F2 = 1.05 # 轉換垂直分辨率到幀高的倍數 # 函數定義(乘以1.0強迫進行實數運算) ac = (1.0*$ASPECT)*F1/F2 refresh(hsync, dcf) = ac * (hsync**2)/(1.0*dcf) dotclock(hsync, rr) = ac * (hsync**2)/(1.0*rr) resolution(hv, dcf) = dcf * (10**6)/(hv * F1 * F2) # 在坐標軸上放置標記 set xlabel 'DCF (MHz)' set ylabel 'RR (Hz)' 6 # 在Y軸右邊放置它 # 生成圖形 set grid set label "VB" at $BANDWIDTH+1, ($MAXVSF + $MINVSF) / 2 left set arrow from $BANDWIDTH, $MINVSF to $BANDWIDTH, $MAXVSF nohead set label "max VSF" at 1, $MAXVSF-1.5 set arrow from 0, $MAXVSF to $BANDWIDTH, $MAXVSF nohead set label "min VSF" at 1, $MINVSF-1.5 set arrow from 0, $MINVSF to $BANDWIDTH, $MINVSF nohead set label "min HSF" at dotclock($MINHSF, $MAXVSF+17), $MAXVSF + 17 right set label "max HSF" at dotclock($MAXHSF, $MAXVSF+17), $MAXVSF + 17 right set label "VESA $vesa" at 1, $vesa-1.5 set arrow from 0, $vesa to $BANDWIDTH, $vesa nohead # style -1 plot [dcf=0:1.1*$BANDWIDTH] [$MINVSF-10:$MAXVSF+20] \ refresh($MINHSF, dcf) notitle with lines 1, \ refresh($MAXHSF, dcf) notitle with lines 1, \ resolution(640*480, dcf) title "640x480 " with points 2, \ resolution(800*600, dcf) title "800x600 " with points 3, \ resolution(1024*768, dcf) title "1024x768 " with points 4, \ resolution(1280*1024, dcf) title "1280x1024" with points 5, \ resolution(1600*1280, dcf) title "1600x1200" with points 6 pause 9999 EOF
一旦知道了modeplot
和gnuplot軟件包已經在適當位置,你需要下列顯示器特性:
繪制程序需要進行一些不完全精確的簡化假定.因此得出的圖只能是一個粗略描述.這些假定是:
modeplot
程序默認假定4/3,但你可以替換它.
HFL = F1 * HR
VFL = F2 * VR
作為一份粗略的指南,讓 F1 = 1.30 而 F2 = 1.05 (查閱 frame "計算幀的大小").
現在處理一個特殊的同步頻率,HSF.根據剛才提出的假定,其每個值對時鐘頻率DCF而言已經決定刷新率RR,也就是說,對HSF每個值有一個函數RR(DCF).這可以依下列各項得出.
刷新率等于時鐘頻率除以幀長的乘積:
RR = DCF / (HFL * VFL) (*)
另一方面,水平幀長等于時鐘率除以行頻:
HFL = DCF / HSF (**)
根據上述兩個假定VFL可以化為HFL:
VFL = F2 * VR
= F2 * (HR / AR)
= (F2 / F1) * HFL / AR (***)
插入(**)和(***)到(*)我們得到:
RR = DCF / ((F2 / F1) * HFL**2 / AR)
= (F1 / F2) * AR * DCF * (HSF / DCF)**2
= (F1 / F2) * AR * HSF**2 / DCF
對于固定的HSF,F1,F2和AR,在我們的圖中這是一條雙曲線.對行頻最小值和最大值畫兩條這樣的曲線我們就得到了允許區域的兩條邊界.
穿過特性區域的直線代表特定的分辨率.這是基于(*)和第二個假定:
RR = DCF / (HFL * VFL) = DCF / (F1 * HR * F2 * VR)
通過為某人感興趣的所有分辨率畫這樣的直線,他能立刻記住顯示器特性范圍內分辨率,時鐘頻率和刷新率之間可能的關系.注意這些線不依賴于顯示器的特性,但確實依賴于第二個假定.
modeplot
工具提供給你容易的途徑繪制特性圖.運行modeplot -?
看它的控制選項.一個典型調用類似這樣:
modeplot -t "Swan SW617" -b 85 -v 50 90 -h 31 58
-b選項指定頻寬;-v和-h設置行頻和場頻范圍.
當閱讀modeplot
的輸出時,始終記住它只給出近似的描述.例如,它忽視了由同步脈沖寬度的最小要求造成的HFL的限制,而且它的精確度受限于兩個假定的精確度.因此它不是在
匯總以上討論中出現的詳細計算的代替品(涉及某些巫朮).無論如何,對于什么是可能的和哪些權衡是有關的,它應該給了你更好的感覺.