1. 程式人生 > >關於matlab矩陣卷積conv2和傅立葉變換求卷積ifft2的關係

關於matlab矩陣卷積conv2和傅立葉變換求卷積ifft2的關係

先定義兩個矩陣

a = [1 2 3 5 ; 4 7 9 5;1 4 6 7;5 4 3 7;8 7 5 1] %a矩陣取5*4

b = [1 5 4; 3 6 8; 1 5 7]   %b矩陣如多數模板一樣取3*3

那麼conv(a,b)的結果肯定是(5+3-1)*(4+3-1)=7*6的矩陣

卷積計算過程如下:預設先把a矩陣補0變成7*6維的矩陣,然後b翻轉 之後進行模板操作,要計算a矩陣中哪個點卷積以後的值,就把翻轉之後b‘矩陣的中心如圖中的6放到要計算的位子 然後對應的3*3矩陣對應位置相乘,之後全部相加即為對應點的卷積之後的結果。如下圖所示


結果如下:

c=conv2(a,b)

c =


     1      7      17      28      37     20
     7     39     89     127   115     60
    14    61   151    212    207   103
    12    74   165    226    225   119
    24    98   178    190   168    109
    29    98   179    139   102     57
     8     47    96       75     40      7

d=conv2(a,b,'same')  %這個結果表示卷積出來的結果與a矩陣的維數一樣

d =


    39    89   127   115
    61   151   212   207
    74   165   226   225
    98   178   190   168
    98   179   139   102

接下來看看e=ifft2(fft2(a).*fft2(b));計算這個的時候由於是點乘,兩個矩陣的維數應該相同因此首先應該將a、b兩個矩陣都變成卷積之後的維數大小才行,這裡都變成7*6維

因此首先:

a(7,6)=0;

b(7,6)=0;

此時a =


     1     2     3     5     0     0
     4     7     9     5     0     0
     1     4     6     7     0     0
     5     4     3     7     0     0
     8     7     5     1     0     0
     0     0     0     0     0     0
     0     0     0     0     0     0

b =


     1     5     4     0     0     0
     3     6     8     0     0     0
     1     5     7     0     0     0
     0     0     0     0     0     0
     0     0     0     0     0     0
     0     0     0     0     0     0
     0     0     0     0     0     0

然後執行e=ifft2(fft2(a).*fft2(b))

得到

e =


    1.0000    7.0000   17.0000   28.0000   37.0000   20.0000
    7.0000   39.0000   89.0000  127.0000  115.0000   60.0000
   14.0000   61.0000  151.0000  212.0000  207.0000  103.0000
   12.0000   74.0000  165.0000  226.0000  225.0000  119.0000
   24.0000   98.0000  178.0000  190.0000  168.0000  109.0000
   29.0000   98.0000  179.0000  139.0000  102.0000   57.0000
    8.0000   47.0000   96.0000   75.0000   40.0000    7.0000

是不是與之前conv(a,b)的結果一樣,只不過這裡是雙精度型的