不負(fù)責(zé)任想想小波變換實(shí)現(xiàn)海面Shader的思路
最近ShaderToy上有一個(gè)實(shí)時(shí)GI讓人眼前一亮
https://www.shadertoy.com/view/ctSGWm

叫àtrous Wavelet Denoising
我對(duì)這個(gè)實(shí)現(xiàn)并不是很感興趣,只不過這個(gè)畫面(主要是兩個(gè)金屬管)特別有真實(shí)感。
其中有一個(gè)詞Wavelet。以前瞎研究的時(shí)候經(jīng)常碰到它,于是想去搞搞清楚。
以前的印象中說,
1.對(duì)于一些特殊應(yīng)用場景,傅里葉變換的效果不是特別滿意。
2.于是有了滑動(dòng)窗口傅里葉變換。比如如果我們提前知道信號(hào)有一些特性,比如分3部分周期各相迥異,就可以分塊變換。當(dāng)然變體有很多,叫法也不一樣。
3.但是滑動(dòng)窗口傅里葉變換,顯然需要我們手動(dòng)賦予一些參數(shù),窗口怎么設(shè)置...效果不一定好。
4.于是直到最近(1974),才開發(fā)出一種方法叫Wavelet Transform(小波變換),貌似解決了這方面的問題。
5.也就是說,小波變換大體是傅里葉變換的plus utilmate pro max版(當(dāng)然具體場景肯定具體應(yīng)用,不能說完全代替)。
今天找到了一個(gè)視頻介紹得特別清楚,https://www.youtube.com/watch?v=jnxqHcObNK4。
讓我影響深刻的有幾點(diǎn):
深刻點(diǎn)一,小波變換的基函數(shù)(以下簡稱base)就是一個(gè)設(shè)計(jì)好的“小波函數(shù)”,可以有不同的形狀:

特征1:定積分為0
特征2:模的定積分有限
顯然這個(gè)條件比較寬泛,不過一般都會(huì)Normalize,方便查看百分比。
最典型的一個(gè)是:

2.深刻點(diǎn)二,如果說FT(傅里葉變換,以下簡稱FT)的base是無數(shù)個(gè)不斷調(diào)整freq(頻率,以下簡稱freq)的sin函數(shù),那么WT的base就是無數(shù)個(gè)不斷調(diào)整freq和tao(時(shí)域位移)的wavelet函數(shù)。以前我看不懂的?也能看懂了,b就是tao,a就是freq。整個(gè)函數(shù)在沿著時(shí)域軸變tao對(duì)b卷積,沿著頻域軸變freq對(duì)a卷積。
3.深刻點(diǎn)三,從信息角度來講,如果原函數(shù)是(100%時(shí)域,0%頻域),其FT是(0%時(shí)域,100%頻域),那么WT是兩者的折中,并且其實(shí)就是“海森堡不確定性原理(Heinsberg's Uncertainty Principle)”,所以小波變換同時(shí)犧牲了兩邊的一些信息量,換來了平衡。 可以看作是一個(gè)函數(shù)Func(in time,in freq,out realComp, out imgComp),通過計(jì)算復(fù)數(shù)的模長,可以獲得類似頻域中的占比信息,但它同時(shí)還帶時(shí)域軸的信息:

如果能將整個(gè)視頻看完,那應(yīng)該是比較清楚的。
看完之后,我覺得這個(gè)WT的思路比FT清晰多了,而且我一直沒有實(shí)現(xiàn)過FFT海面,因?yàn)槭裁春惴ㄌ垓v了,我腦子不夠用。但全流程換成WT,好像簡單清晰了不少。
隨便想想的WT海面思路
1.首先有一個(gè)時(shí)間周期的原海面(in x,in y,out z),不管怎么來的。
這個(gè)周期海面足夠復(fù)雜,但也是一個(gè)周期函數(shù),也就是說不管哪一個(gè)(x,y)的點(diǎn),都會(huì)遍歷到所有可能的z。那么(x,y)最后只是轉(zhuǎn)換成一個(gè)相位差。所以根本來說還是h(t)。
2.對(duì)h(t)進(jìn)行WT,獲得一張類似圖4的scalogram(占比百分度)。我們可以分幾個(gè)優(yōu)化擋位,lod0,先把紅色的點(diǎn)沿著time軸采出來,如果按圖4,就是大概(2,1),(4,2),(6,2.4),(8,2.5),(10,5)的點(diǎn),也就是說在第2s,freq為1的base最匹配,以此類推,所以比如第3s,就可以lerp(wavelet[2,1],wavelet[4,2],0.5)這樣來采樣高度。然后lod1,lod2...是紅色稍弱,白色,藍(lán)色...的點(diǎn),由于它們的百分占比不夠高,所以不影響波形的主體形象,從圖4上也很直觀,也就是一開始低頻占主體形象,后來高頻占主體形象。
3.因?yàn)榉凑闅v看最大,不如暴力求和。也就是說每幀都根據(jù)當(dāng)前t,在縱軸上由scalogram作權(quán)重全部求和,這就有點(diǎn)像FT還原原信號(hào)的意思。假設(shè)我們的scalogram圖片分辨率是64*64,那么其實(shí)就是一張1*64的圖片所有像素“求和”。這其實(shí)就類比FFT里的蝴蝶法,但是由于我們的base都是wavelet,且scalogram已經(jīng)是復(fù)數(shù)的合了,所以只要作“并行折疊加法“就行了,從1*64->1*32->1*16...一共6次Compute Shader的Dispatch,不算高不算低。不管怎么說,我覺得比FFT容易理解。