更新日期 2008-06-08 20:40
新消息
伺服器選擇
雜談
如何架設網站
超頻+省電
Prime95 地獄特訓
AV 心得篇
影音編輯
場景順序
DVD 字幕
歷史
顯示卡輔助技巧

蝦? 利攻蝦? (台語) 顯示卡只是用來顯示用的,還有打電動用的 XD

還能幫忙影像壓縮?俺沒聽說過耶.....

對啦,沒聽說過的話,就要好好的看本文啦~~~

FFT3DFilter 強力除雜訊,又不留下人工痕跡

FF3DFilter 是一個利用 FFT 程式庫進行 3D 編輯的 Avisynth 套件 (作者是 Alexander G. Balakhnin),何謂 3D 編輯呢?其實指的是影像處理時「前一張」「現在這一張」「下一張」而言的,就時間點來說是串列的,但把時間點拉直從上往下看,彷彿三張影像堆疊在一起,因此取名為 3D。

那 FFT 程式庫又是什麼?鼎鼎大名的燒機測試軟體 Prime95 就是一個 FFT 的運算工具,大量使用 packed SSE/SSE2 指令集。FFT 全名是 Fast Fourier Transform 快速富立葉轉換。那是工程數學的領域。應用在很多層面,協助解決問題。

FFT3DFilter 最大的優點,除去畫面上的雜訊,而且不會留下人工痕跡;最大的缺點,就是富立葉轉換需要大量的時間,所以很慢。

FFT3DFilter 官方網站 (http://avisynth.org.ru/fft3dfilter/fft3dfilter.html)

FFT3DGPU 誕生

既然 FFT3DFilter 很慢,長時間壓縮變成夢靨,可是那優秀的除雜訊效果,常常讓人覺得無奈,所幸 TSP 大大將 FFT3DFilter 的原始程式加以修改,改成 GPU 版本。這麼一來,影像壓縮時,CPU 忙的天昏地暗,GPU 亮在旁邊耗電沒事幹的問題,得以解決。

藉由 FFT3DGPU 得助力,富立葉轉換的工作就交給 GPU 來料理,其他影像壓縮的工作仍給 CPU 解決,如此馬上晉升到平行運算的效果了。FFT3DGPU 利用 GPU (目前的兩大品牌 ATi and nVidia 皆可使用),把顯示卡繪圖核心 (GPU) 當成浮點運算器 (FPU),執行時,你的電腦裡不僅有一顆 CPU (內建 FPU),還有另一顆 FPU (其實是 GPU) 來輔助,效果立竿見影!

FFT3DGPU 的優點,平行運算,大幅度提升總體壓縮效率;缺點,如果你的顯示卡太爛,反倒可能會拖慢壓縮速度 XD.

FFT3DGPU 官方網站 (http://www.avisynth.org/tsp/)

開始測試 FFT3DFilter vs FFT3DGPU 的差異 (Part 1)

筆者隨便錄了一段 Discovery 流言終結者 2006 Q2 的 60 sec 影像,用的是飛馬牌 MJPEG Q18 的設定,480x480x29.97fps 影像,長度 110 MB (平均流量 13866 Kbps)

AMD Athlon64 3200+ 不超頻,1.350v@2000Mhz (HT 1007Mhz)
創見 UCCC 1GB*2 跑雙通道,3-3-3-8@400Mhz (未超頻)
nVidia 7300GS 256MB 不超頻,550Mhz core,810Mhz memory.
Forceware 91.45 beta

VirtualDubMod 1.5.10.2 build 2542
Avisynth 2.55
FFT3DFilter 1.85
FFT3DGPU 0.82 (原始程式同步 FFT3DFilter 1.85)
FFTW Library 3.1.2 (FFT3DFilter 需要用的程式庫)

Avisynth Script 檔內容如下 (GPU 版)
SetMemoryMax(256)
OpenDMLSource("E:\Test.avi", audio=false, pixel_type="YV12", fourCC="MJPG")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\FFT3dGPU.dll")
FFT3DGPU(sigma=7.5,sigma2=2.5,sigma3=2.5,sigma4=5.0,oh=8,ow=8,bt=2,interlaced=true,plane=0)

Avisynth Script 檔內容如下 (CPU 版)
SetMemoryMax(256)
OpenDMLSource("E:\Test.avi", audio=false, pixel_type="YV12", fourCC="MJPG")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\FFT3dFilter.dll")
FFT3DFilter(sigma=7.5,sigma2=2.5,sigma3=2.5,sigma4=5.0,oh=8,ow=8,bt=2,interlaced=true,plane=0)

就這樣來跑,輸出檔為 uncompress AVI,目的路徑指向 RAMDisk (用盡一切辦法減少 CPU 負載)

FFT3DGPU 34~36 fps
FFT3DFilter 21~23 fps

然後加入 XVID 壓縮法,AS@L5,VHQ,Turbo,Two-pass of Pass 1

XVID + FFT3DGPU 24~26 fps
XVID + FFT3DFilter 16~19 fps

深度測試,更多的除雜訊+去交錯

一般而言,只用 FFT3DFilter/FFT3DGPU 往往不夠,至少無法去交錯,或是特殊影像楚理,在筆者的測試結果中,如果要 FFT 程式增加處理 U/V 這兩層運算,可說是慢到離譜,於是筆者用 TemporalCleaner 與 DeGrainMedian 這兩個雜訊去除工具,專門針對 U/V 這兩層 Chrominance 的訊號做處理,只 Y 訊號 (Luminance) 交給 FFT 去處理,借重 FFT 處理時不留下人工痕跡的優異特色,處理亮度訊號是最理想的。(早期黑白電視只有 Y 訊號處理,彩色電視才增加 U/V 兩種色相彩度信號)。

Avisynth Script 檔內容如下 (GPU 版)
SetMemoryMax(256)
OpenDMLSource("E:\test.avi", audio=false, pixel_type="YV12", fourCC="MJPG")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\TemporalCleaner.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\LeakKernelDeint.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\DeGrainMedian.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\FFT3dGPU.dll")
TemporalCleaner(cthresh=255)
DeGrainMedian(limitUV=32,interlaced=true,norow=true)
FFT3DGPU(sigma=7.5,sigma2=2.5,sigma3=2.5,sigma4=5.0,oh=8,ow=8,bt=2,interlaced=true,plane=0)
LeakKernelDeint(order=1,threshold=10,map=false,sharp=false,twoway=true,linked=false)

Avisynth Script 檔內容如下 (CPU 版)
SetMemoryMax(256)
OpenDMLSource("E:\test.avi", audio=false, pixel_type="YV12", fourCC="MJPG")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\TemporalCleaner.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\LeakKernelDeint.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\DeGrainMedian.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\FFT3dFilter.dll")
TemporalCleaner(cthresh=255)
DeGrainMedian(limitUV=32,interlaced=true,norow=true)
FFT3DFilter(sigma=7.5,sigma2=2.5,sigma3=2.5,sigma4=5.0,oh=8,ow=8,bt=2,interlaced=true,plane=0)
LeakKernelDeint(order=1,threshold=10,map=false,sharp=false,twoway=true,linked=false)

XVID 壓縮法,AS@L5,VHQ,Turbo,Two-pass of Pass 1

以下是測試總結數據

純 XVID 壓縮,沒有任何 Filter 時,53~56 fps

XVID + TemporalCleaner + DeGainMedian + LeakKernelDeint (就是把 FFT3DFilter/FFT3DGPU 拿掉),39~42 fps

XVID + FFT3DGPU + TemporalCleaner + DeGainMedian + LeakKernelDeint 時,23~27 fps (類似平行運算 CPU + GPU 合力)

XVID + FFT3DFilter + TemporalCleaner + DeGainMedian + LeakKernelDeint 時,16~18 fps (純 CPU 運算)

筆者又用了 X264 (558) 這個仍在研發階段的 MPEG-4 AVC 來編碼

X264 + FFT3DGPU + TemporalCleaner + DeGainMedian + LeakKernelDeint 時,15~20 fps (類似平行運算 CPU + GPU 合力)

X264 + FFT3DFilter + TemporalCleaner + DeGainMedian + LeakKernelDeint 時,10~14 fps (純 CPU 運算)

以平均值來算,FFT3DGPU 以相同效果,總體編碼速度比 FFT3DFilter 提升 (x264) 45.8% (xvid) 47% 可謂相當驚人,何況...這只是 nVidia 7300GS 的顯示卡而已!

結語與展望

未來,個人電腦將持續走向多核心 CPU 與多核心顯示卡 GPU 的時代,也就是個人電腦與大型主機的越來越相似,唯一的差別是核心數目不同,系統程式也不同,然而多核心是必走的路。

初次看到 GPU 也能加入運算的結果時,筆者很感動,看著顯示卡溫度逐漸上升,看到了壓縮速度突飛猛進 (約加快了 47%),這等於是筆者買了一顆雙核心 CPU!雙核心依據實際測試報告來看,最大可提升 80%,最少 0%;因此編碼效率增加 45.8% ~ 47% 實際上已經有達到類似雙核心的效果。

雖然 FFT3DGPU 只是個應用 GPU 運算能力的開端,然而未來肯定有更多類似的程式不斷的誕生、改良。