首先我們來理解什麼是卷積,卷積分為連續卷積和離散卷積,連續卷積是積分,離散卷積是求和。
首先我們來看一個列子:
比如說你的老闆命令你幹活,你卻到樓下打撞球去了,後來被老闆發現,他非常氣憤,扇了你一巴掌(注意,這就是輸入信號),於是你的臉上會漸漸地(賤賤地)鼓起來一個包,你的臉就是一個系統,而鼓起來的包就是你的臉對巴掌的響應,好,這樣就和信號系統建立起來意義對應的聯繫。下面還需要一些假設來保證論證的嚴謹:假定你的臉是線性時不變系統,也就是說,無論什麼時候老闆打你一巴掌,打在你臉的同一位置,你的臉上總是鼓起來一個相同高度的包來,並且假定以鼓起來的包的大小作為系統輸出。好了,前言說完了,下面可以進入核心內容——卷積
如果你每天都到地下去打撞球,那麼老闆每天都要扇你一巴掌,不過當老闆打你一巴掌後,你5分鐘就消腫了,所以時間長了,你甚至就適應這種生活了……如果有一天,老闆忍無可忍,以0.5秒的間隔開始不間斷的扇你的過程,這樣問題就來了,第一次扇你鼓起來的包還沒消腫,第二個巴掌就來了,你臉上的包就可能鼓起來兩倍高,老闆不斷扇你,脈衝不斷作用在你臉上,效果不斷疊加了,這樣這些效果就可以求和了,結果就是你臉上的包的高度隨時間變化的一個函數了,這就是離散卷積,把每次的結果求和輸出。
如果老闆再狠一點,扇你頻率足夠(無限)高,以至於你都辨別不清時間間隔了,那麼,求和就變成積分了,於是就變成了連續卷積。
可以這樣理解,在這個過程中的某一固定時刻,你臉上的包的鼓起程度和什麼有關呢?和之前每次打你都有關,也就是和之前的每次輸入都有關,但是每次的貢獻是不一樣的,越早打的巴掌,貢獻越小,所以這就是說,某一時刻的輸出是之前很多次輸入乘以各自的衰減係數之後的疊加而形成某一點的輸出,然後再把不同時刻的輸出點放在一起,形成一個函數,這就是卷積,卷積之後的函數就是你臉上的包的大小隨時間變化的函數。
那麼卷積為什麼可以通過FFT和IFFT實現呢?
首選對於FFT我們知道有這樣的性質,就是時序卷積等於頻域乘積,所以可以對輸入的兩個信號先分別求其FFT,將其轉化到頻域,在頻域對兩個信號相乘,然後再對其進行IFFT,將其轉回到時域,則就得到了兩個信號的時域卷積了。
為什麼需要通過FFT和IFFT實現呢?
因為直接求兩個信號的時域卷積計算量大,乘法加法次數多,對於有些算法複雜度高又要求實時性的場合,需要減少計算量,那麼就可以利用FFT和IFFT來實現卷積,因為無論是FFT和IFFT都有快速算法,能大量減少運算量。
FFT蝶形運算