卷積(轉自wiki百科)

  • 維基百科,自由的百科全書

    圖示兩個方形脈衝波的卷積。其中函數 "g" 首先對 \tau=0 反射,接着平移 "t" ,成爲 g(t-\tau) 。那麼重疊部份的面積就至關於 "t" 處的卷積,其中橫座標表明待積變量 \tau 以及新函數 f\ast g 的自變量 "t" 。php

    圖示方形脈衝波和指數衰退的脈衝波的卷積(後者可能出現於 RC電路中),一樣地重疊部份面積就至關於 "t" 處的卷積。注意到由於 "g" 是對稱的,因此在這兩張圖中,反射並不會改變它的形狀。html

    泛函分析中,卷積(捲積)、旋積或摺積,是經過兩個函數f 和g 生成第三個函數的一種數學算子,表徵函數f 與通過翻轉和平移的g 的重疊部分的累積。若是將參加卷積的一個函數看做區間指示函數,卷積還能夠被看做是「滑動平均」的推廣。git

    目錄

    簡單介紹

    卷積是分析數學中一種重要的運算。設: f(x) ,g(x)\mathbb{R}上的兩個可積函數,做積分:算法

    \int_{-\infty}^{\infty} f(\tau) g(x - \tau)\, \mathrm{d}\tau

    能夠證實,關於幾乎全部的 x \in (-\infty,\infty) ,上述積分是存在的。這樣,隨着 x 的不一樣取值,這個積分就定義了一個新函數h(x),稱爲函數f 與g 的卷積,記爲h(x)=(f*g)(x)。咱們能夠輕易驗證:(f * g)(x) = (g * f)(x),而且(f * g)(x) 仍爲可積函數。這就是說,把卷積代替乘法,L^1(R^1) 空間是一個代數,甚至是巴拿赫代數api

    卷積與傅里葉變換有着密切的關係。例如兩函數的傅里葉變換的乘積等於它們卷積後的傅里葉變換,利用此一性質,能簡化傅里葉分析中的許多問題。app

    由卷積獲得的函數 f*g 通常要比 f 和 g 都光滑。特別當 g 爲具備緊支集的光滑函數,f 爲局部可積時,它們的卷積 f * g 也是光滑函數。利用這一性質,對於任意的可積函數 f ,均可以簡單地構造出一列逼近於 f 的光滑函數列 f_s ,這種方法稱爲函數的光滑化或正則化。dom

    卷積的概念還能夠推廣到數列、測度以及廣義函數上去。svg

    定義

    函數f 與g 的卷積記做f * g,它是其中一個函數翻轉並平移後與另外一個函數的乘積的積分,是一個對平移量的函數。函數

    (f * g )(t) = \int f(\tau) g(t - \tau)\, d\tau

    積分區間取決於f 與g 的定義域spa

    對於定義在離散域的函數,卷積定義爲

    (f * g)[m] = \sum_n {f[n] g[m - n]}

    圖解卷積

    1. 首先將兩個函數都用\tau來表示。
    2. 對其中一個函數作水平翻轉: g(\tau) →g(-\tau).
    3. 加上一個時間偏移量,讓 g(t-\tau) 能沿着 \tau 軸滑動。
    4. t從-∞滑動到+∞。兩函數交會時,計算交會範圍中兩函數乘積的積分值。換句話說,咱們是在計算一個滑動的的加權平均值。也就是使用g(-\tau).當作加權函數,來對f(\tau)取加權平均值。
    最後獲得的波形(未包含在此圖中)就是 fg的卷積。

    若是f(t)是一個單位脈衝,咱們獲得的乘積就是g(t)自己,稱爲衝激響應 。

    Convolution3.PNG

    計算卷積的方法

    當 f[n] 爲有限長度 N , g[n] 爲有限長度 M 的信號,計算卷積 f[n]*g[n] 有三種主要的方法,分別爲 1.直接計算(Direct Method) 2.快速傅里葉轉換(FFT) 和 3.分段卷積 (sectioned convolution)。方法1是直接利用定義來計算卷積,而方法2和3都是用到了FFT來快速計算卷積。也有不須要用到FFT的做法,如使用數論轉換

    方法1 直接計算
    • 做法: 利用卷積的定義
    y[n] = f[n]*g[n] = \sum_{m=0}^{M-1} f[n-m]g[m]
    • f[n] 和 g[n] 皆爲實數信號,則須要 MN 個乘法。
    • f[n] 和 g[n] 皆爲更通常性的複數信號,不使用複數乘法的快速算法,會須要 4MN 個乘法;但若使用複數乘法的快速算法,則可簡化至3MN 個乘法。
    所以,使用定義直接計算卷積的複雜度爲  O(MN) 。
    方法2 快速傅里葉轉換(FFT)
    • 概念:因爲兩個離散信號在時域(time domain)作卷積至關於這兩個信號的離散傅里葉轉換在頻域(frequency domain)作相乘:
     
      
    ,能夠看出在頻域的計算較簡單。
    • 做法: 所以這個方法便是先將信號從時域轉成頻域:
     
      
    ,因而
     
      
    ,最後再將頻域信號轉回時域,就完成了卷積的計算:
     
      
    總共作了 2 次 DFT 和 1 次 IDFT。
    • 特別注意 DFT 和 IDFT 的點數 P 要知足 P \ge M+N-1 。
    • 因爲 DFT 有快速算法 FFT,因此運算量爲 O(P\log_{2}P)
    • 假設P 點 DFT 的乘法量爲 a ,f[n] 和 g[n] 爲通常性的複數信號,並使用複數乘法的快速算法,則共須要3a + 3P 個乘法。
    方法3 分段卷積(sectioned convolution)
    • 概念: 將 f[n] 切成好幾段,每一段分別和 g[n] 作卷積後,再將結果相加。
    • 做法: 先將 f[n] 切成每段長度爲 L 的區段 (L > M),假設共切成S段:
     
      
    Section 1:  f_1[n] = f[n] , n=0,1,...,L-1
    Section 2:  f_2[n] = f[n+L], n=0,1,...,L-1
    \vdots
    Section r:  f_r[n] = f[n+(r-1)L], n=0,1,...,L-1
    \vdots
    Section S:  f_S[n] = f[n+(S-1)L], n=0,1,...,L-1
    f[n]爲各個section的和
     
      
    所以,
    每一小段做卷積則是採用方法2,先將時域信號轉到頻域相乘,再轉回時域:
    • 總共只須要作P 點 FFT 2S+1 次,由於 g[n] 只須要作一次FFT。
    • 假設P 點 DFT 的乘法量爲 a ,f[n] 和 g[n] 爲通常性的複數信號,並使用複數乘法的快速算法,則共須要(2S+1)a+3SP個乘法。
    • 運算量: \frac{N}{L}3(L+M-1)[\log_{2}(L+M-1)+1]
    • 運算複雜度: O(N) ,和 N 呈線性,較方法2小。
    • 分爲 Overlap-Add 和 Overlap-Save 兩種方法。
    • 分段卷積: Overlap-Add

      欲作{\displaystyle x[n]*h[n]}的分段卷積分,{\displaystyle x[n]} 長度爲 {\displaystyle N}h[n] 長度爲 {\displaystyle M},

      Step 1: 將{\displaystyle x[n]}每 L 分紅一段

      Step 2: 再每段 L 點後面添加{\displaystyle M-1} 個零,變成長度 {\displaystyle L+M-1}

      Step 3: 把  h[n] 添加 {\displaystyle L-1}個零,變成長度  {\displaystyle L+M-1}的  h'[n]}{\displaystyle h'[n]}

      Step 4: 把每一個  x[n]}{\displaystyle x[n]} 的小段和  h'[n]}{\displaystyle h'[n]} 作快速卷積,也就是 IDFT_{L+M-1}\{{DFT_{L+M-1}(x[n])DFT_{L+M-1}(h'[n])}\}}{\displaystyle IDFT_{L+M-1}\{{DFT_{L+M-1}(x[n])DFT_{L+M-1}(h'[n])}\}},每小段會獲得長度  {\displaystyle L+M-1} 的時域信號

      Step 5: 放置第  i}i 個小段的起點在位置  L\times i}{\displaystyle L\times i} 上,  i=0,1,...,\lceil {\frac {N}{L}}\rceil -1}{\displaystyle i=0,1,...,\lceil {\frac {N}{L}}\rceil -1}

      Step 6: 會發如今每一段的後面  M-1}{\displaystyle M-1} 點有重疊,將全部點都相加起來,顧名思義 Overlap-Add,最後獲得結果

      舉例來講:

      x[n]=[1,2,3,4,5,-1,-2,-3,-4,-5,1,2,3,4,5]}{\displaystyle x[n]=[1,2,3,4,5,-1,-2,-3,-4,-5,1,2,3,4,5]}, 長度  N=15}{\displaystyle N=15}

      h[n]=[1,2,3]}{\displaystyle h[n]=[1,2,3]}, 長度  M=3}{\displaystyle M=3}

      令  L=5}{\displaystyle L=5}

      令  L=5}{\displaystyle L=5} 切成三段,分別爲  x_{0}[n],x_{1}[n],x_{2}[n]}{\displaystyle x_{0}[n],x_{1}[n],x_{2}[n]}, 每段填  M-1}{\displaystyle M-1} 個零,並將  h[n] 填零至長度  {\displaystyle L+M-1}

      將每一段作 IDFT_{L+M-1}\{{DFT_{L+M-1}(x[n])DFT_{L+M-1}(h'[n])}\}}{\displaystyle IDFT_{L+M-1}\{{DFT_{L+M-1}(x[n])DFT_{L+M-1}(h'[n])}\}}

      若將每小段擺在一塊兒,能夠注意到第一段的範圍是  0\thicksim 6}{\displaystyle 0\thicksim 6} ,第二段的範圍是  5\thicksim 11}{\displaystyle 5\thicksim 11},第三段的範圍是  10\thicksim 16}{\displaystyle 10\thicksim 16},三段的範圍是有重疊的

      最後將三小段加在一塊兒,並將結果和未分段的卷積作比較,上圖是分段的結果,下圖是沒有分段並利用快速卷積所算出的結果,驗證二者運算結果相同。

      分段卷積: Overlap-Save

      欲作 x[n]*h[n]}{\displaystyle x[n]*h[n]}的分段卷積分, x[n]}{\displaystyle x[n]} 長度爲  N}{\displaystyle N} h[n] 長度爲  M}{\displaystyle M},

      Step 1: 將  x[n]}{\displaystyle x[n]} 前面填  M-1}{\displaystyle M-1} 個零

      Step 2: 第一段  i=0}{\displaystyle i=0}, 重新的  {\displaystyle x[n]} 中  {\displaystyle L\times i-(M-1)\times i} 取到{\displaystyle L\times (i+1)-(M-1)\times i-1} 總共  L 點當作一段,所以每小段會重複取到前一小段的  {\displaystyle M-1}點,取到新的一段全爲零爲止

      Step 3: 把  h[n] 添加  L-M}{\displaystyle L-M} 個零,變成長度  L 的{\displaystyle h'[n]}

      Step 4: 把每一個{\displaystyle x[n]} 的小段和 {\displaystyle h'[n]} 作快速卷積,也就是{\displaystyle IDFT_{L}\{{DFT_{L}(x[n])DFT_{L}(h'[n])}\}},每小段會獲得長度L 的時域信號

      Step 5: 對於每一個小段,只會保留末端的{\displaystyle L-(M-1)} 點,所以得名 Overlap-Save

      Step 6: 將全部保留的點合再一塊兒,獲得最後結果

      舉例來講:

      {\displaystyle x[n]=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]}, 長度{\displaystyle N=15}

      {\displaystyle h[n]=[1,2,3]}, 長度{\displaystyle M=3}

      令 {\displaystyle L=7}

      將 {\displaystyle x[n]} 前面填{\displaystyle M-1} 個零之後,按照 Step 2 的方式分段,能夠看到每一段都重複上一段的{\displaystyle M-1} 點

      再將每一段作{\displaystyle IDFT_{L}\{{DFT_{L}(x[n])DFT_{L}(h'[n])}\}}之後能夠獲得

      保留每一段末端的{\displaystyle L-(M-1)} 點,擺在一塊兒之後,能夠注意到第一段的範圍是{\displaystyle 0\thicksim 4} ,第二段的範圍是{\displaystyle 5\thicksim 9},第三段的範圍是}{\displaystyle 10\thicksim 14},第四段的範圍是{\displaystyle 15\thicksim 16},四段的範圍是沒有重疊的

      將結果和未分段的卷積作比較,下圖是分段的結果,上圖是沒有分段並利用快速卷積所算出的結果,驗證二者運算結果相同。

      至於爲何要把前面  M-1}{\displaystyle M-1} 丟掉?

      如下以一例子來闡述:

      {\displaystyle x[n]=[1,2,3,4,5,6,7,8,9,10]}, 長度{\displaystyle L=10}

      {\displaystyle h[n]=[1,2,3,4,5]}, 長度{\displaystyle M=5},

      第一條藍線表明 y  軸,而兩條藍線之間表明長度L,是在作快速卷積時的週期

      當在作快速卷積時{\displaystyle IDFT_{L}\{{DFT_{L}(x[n])DFT_{L}(h'[n])}\}},是把信號視爲週期L,在時域上爲循環卷積分,

      而在一開始前{\displaystyle M-1} 點所獲得的值,是{\displaystyle h[0],h[6],h[7],h[8],h[9]} 和{\displaystyle x[0],x[6],x[7],x[8],x[9]} 內積的值,

      然而{\displaystyle h[6],h[7],h[8],h[9]} 這{\displaystyle M-1} 個值應該要爲零,以往在作快速卷積時長度爲  {\displaystyle L+M-1} 時不會遇到這些問題,

      而今天由於在作快速卷積時長度爲L 纔會把這{\displaystyle M-1} 點算進來,所以咱們要丟棄這{\displaystyle M-1} 點內積的結果

      爲了要丟棄這  M-1}{\displaystyle M-1} 點內積的結果,位移  h[-n]}{\displaystyle h[-n]}  M-1}{\displaystyle M-1} 點,並把位移之後內積合的值纔算有效。


    應用時機

    以上三種方法皆可用來計算卷積,其差異在於所需整體乘法量不一樣。基於運算量以及效率的考量,在計算卷積時,一般會選擇所需整體乘法量較少的方法。

    如下根據 f[n] 和 g[n] 的長度( N, M )分紅5類,並列出適合使用的方法:

    1. M 爲一很是小的整數 - 直接計算
    2. M \ll N - 快速傅里葉轉換
    3. M \approx N - 分段卷積
    4. M \gg N - 快速傅里葉轉換
    5. N 爲一很是小的整數 - 直接計算

    基本上,以上只是粗略的分類。在實際應用時,最好仍是算出三種方法所需的總乘法量,再選擇其中最有效率的方法來計算卷積。

    例子

    Q1: 當 N = 2000, M = 17 ,適合用哪一種方法計算卷積?

    Ans:

    方法1: 所需乘法量爲  3MN = 102000
    方法2:  P \ge M+N-1 = 2016 ,而2016點的DFT最少乘法數  a = 12728 ,因此總乘法量爲  3(a+P) = 44232
    方法3:
    若切成 8 塊( S = 8),則 L = 250, P \ge M+L-1=266。選 P = 288,則總乘法量爲  (2S+1)a+3SP = 26632 ,比方法1和2少了不少。
    可是若要找到最少的乘法量,必須依照如下步驟
    (1)先找出  L : 解  L :  \frac{\partial {\frac{N}{L}3(L+M-1)[\log_{2}(L+M-1)+1]}}{\partial L}=0
    (2)由 P \ge L+M-1 算出點數在  P 附近的DFT所需最少的乘法量,選擇DFT的點數
    (3)最後由 L = P+1-M 算出  L_{opt}
    所以,
    (1)由運算量對  L 的偏微分爲0而求出  L = 85
    (2) P \ge L+M-1 = 101,因此選擇101點 DFT 附近點數乘法量最少的點數  P = 96或  P = 120 。
    (3-1)當  P = 96 \to a = 280, L = P+1-M = 80 \to S = 25 ,總乘法量爲  (2S+1)a+3SP = 21480 。
    (3-2)當  P = 120 \to a = 380, L = P+1-M = 104 \to S = 20 ,總乘法量爲  (2S+1)a+3SP = 22780 。
    由此可知,切成 20 塊會有較好的效率,而所需總乘法量爲 21480。
    • 所以,當N = 2000, M = 17,所需總乘法量: 分段卷積 < 快速傅里葉轉換 < 直接計算。故,此時選擇使用分段卷積來計算卷積最適合。

    Q2: 當 N = 1024, M = 3 ,適合用哪一種方法計算卷積?

    Ans:

    方法1: 所需乘法量爲  3MN = 9216
    方法2:  P \ge M+N-1 = 1026 ,選擇1026點 DFT 附近點數乘法量最少的點數, \to P = 1152, a = 7088
    所以,所需乘法量爲  3(a+P) = 24342
    方法3:
    (1)由運算量對  L 的偏微分爲0而求出  L = 5
    (2) P \ge L+M-1 = 7,因此選擇7點 DFT 附近點數乘法量最少的點數  P = 8 或  P = 6 或  P = 4 。
    (3-1)當  P = 8 \to a = 4, L = P+1-M = 6 \to S = 171 ,總乘法量爲  (2S+1)a+3SP = 5476 。
    (3-2)當  P = 6 \to a = 4, L = P+1-M = 4 \to S = 256 ,總乘法量爲  (2S+1)a+3SP = 6660 。
    (3-3)當  P = 4 \to a = 0, L = P+1-M = 2 \to S = 512 ,總乘法量爲  (2S+1)a+3SP = 6144 。
    由此可知,切成 171 塊會有較好的效率,而所需總乘法量爲 5476。
    • 所以,當N = 1024, M = 3,所需總乘法量: 分段卷積 < 直接計算 < 快速傅里葉轉換。故,此時選擇使用分段卷積來計算卷積最適合。
    • 雖然當 M 是個很小的正整數時,大體上適合使用直接計算。但實際上仍是將3個方法所需的乘法量都算出來,才能知道用哪一種方法能夠達到最高的效率。

    Q3: 當 N = 1024, M = 600 ,適合用哪一種方法計算卷積?

    Ans:

    方法1: 所需乘法量爲  3MN = 1843200
    方法2:  P \ge M+N-1 = 1623 ,選擇1026點 DFT 附近點數乘法量最少的點數, \to P = 2016, a = 12728
    所以,所需乘法量爲  3(a+P) = 44232
    方法3:
    (1)由運算量對  L 的偏微分爲0而求出  L = 1024
    (2) P \ge L+M-1 = 1623,因此選擇1623點 DFT 附近點數乘法量最少的點數  P = 2016 。
    (3)當  P = 2016 \to a = 12728, L = P+1-M = 1417 \to S = 1 ,總乘法量爲  (2S+1)a+3SP = 44232 。
    由此可知,此時切成一段,就跟方法2同樣,所需總乘法量爲 44232。
    • 所以,當N = 1024, M = 600,所需總乘法量: 快速傅里葉轉換 = 分段卷積 < 直接計算。故,此時選擇使用分段卷積來計算卷積最適合。
    多元函數卷積

    按照翻轉、平移、積分的定義,還能夠相似的定義多元函數上的積分:

    (f * g )(t_1,t_2,\cdots,t_n) = \int\int\cdots\int f(\tau_1,\tau_2,\cdots,\tau_n) g(t_1 - \tau_1,t_2 - \tau_2,\cdots,t_n - \tau_n,)\, d\tau_1 d\tau_2 \cdots d\tau_n

    性質

    各類卷積算子都知足下列性質:

    交換律
    f * g = g * f \,
    結合律
    f * (g * h) = (f * g) * h \,
    分配律
    f * (g + h) = (f * g) + (f * h) \,
    數乘結合律
    a (f * g) = (a f) * g = f * (a g) \,

    其中a爲任意實數(或複數)。

    微分定理
    \mathcal{D}(f * g) = \mathcal{D}f * g = f * \mathcal{D}g \,

    其中Df 表示f微分,若是在離散域中則是指差分算子,包括前向差分與後向差分兩種:

    • 前向差分:\mathcal{D}^+f(n) = f(n+1) - f(n)
    • 後向差分:\mathcal{D}^-f(n) = f(n) - f(n-1)

    卷積定理

    卷積定理指出,函數卷積的傅里葉變換是函數傅里葉變換的乘積。即,一個域中的卷積至關於另外一個域中的乘積,例如時域中的卷積就對應於頻域中的乘積。

    \mathcal{F}(f * g) = \mathcal{F} (f) \cdot \mathcal{F} (g)

    其中\mathcal{F}(f)表示f 的傅里葉變換

    這必定理對拉普拉斯變換雙邊拉普拉斯變換Z變換Mellin變換Hartley變換(參見Mellin inversion theorem)等各類傅里葉變換的變體一樣成立。在調和分析中還能夠推廣到在局部緊緻的阿貝爾羣上定義的傅里葉變換。

    利用卷積定理能夠簡化卷積的運算量。對於長度爲n的序列,按照卷積的定義進行計算,須要作2n-1組對位乘法,其計算複雜度\mathcal{O}(n^2);而利用傅里葉變換將序列變換到頻域上後,只須要一組對位乘法,利用傅里葉變換的快速算法以後,總的計算複雜度爲\mathcal{O}(n\log n)。這一結果能夠在快速乘法計算中獲得應用。

    在羣上的卷積

    若 G 是有某 m 測度(例如豪斯多夫空間哈爾測度局部緊緻拓撲羣),對於G 上 m-勒貝格可積實數複數函數f 和g,可定義它們的卷積:

    (f * g)(x) = \int_G f(y)g(xy^{-1})\,dm(y) \,

    對於這些羣上定義的卷積一樣能夠給出諸如卷積定理等性質,可是這須要對這些羣的表示理論以及調和分析的彼得-外爾定理

    應用

    卷積在工程和數學上都有不少應用:

    • 統計學中,加權的滑動平均是一種卷積。
    • 機率論中,兩個統計獨立變量X與Y的和的機率密度函數是X與Y的機率密度函數的卷積。
    • 聲學中,回聲能夠用源聲與一個反映各類反射效應的函數的卷積表示。
    • 電子工程與信號處理中,任一個線性系統的輸出均可以經過將輸入信號與系統函數(系統的衝激響應)作卷積得到。
    • 物理學中,任何一個線性系統(符合疊加原理)都存在卷積。

    參見

    外部連接

相關文章
相關標籤/搜索