【问题标题】:2D circular convolution Vs convolution FFT [Matlab/Octave/Python]2D 循环卷积与卷积 FFT [Matlab/Octave/Python]
【发布时间】:2014-02-13 23:09:06
【问题描述】:

我正在尝试理解 FTT 和卷积(互相关)理论,因此我创建了以下代码来理解它。代码是 Matlab/Octave,但我也可以在 Python 中完成。

在一维中:

 x = [5 6 8 2 5]; 
 y = [6 -1 3 5 1];
 x1 = [x zeros(1,4)];
 y1 = [y zeros(1,4)];
 c1 = ifft(fft(x1).*fft(y1));
 c2 = conv(x,y);

 c1 =   30   31   57   47   87   47   33   27    5 
 c2 =   30   31   57   47   87   47   33   27    5

在 2D 中:

 X=[1 2 3;4 5 6; 7 8 9]
 y=[-1 1];
 conv1 = conv2(x,y)
 conv1 =
        24    53    89    29    21
        96   140   197    65    42
       168   227   305   101    63

这是我发现问题的地方,填充矩阵和向量?我该怎么做?我可以用零填充x 吗?还是仅在一侧?那么y呢?我知道当xy 是向量时,卷积的长度应该是M+L-1,但是当它们是矩阵时呢? 我怎样才能在这里继续我的例子?

【问题讨论】:

    标签: python matlab signal-processing fft convolution


    【解决方案1】:

    您需要将一个变量填零:

    • 与其他变量减去的列数一样多的零列 一个。
    • 零行数与另一个变量的行数减一一样多。

    在 Matlab 中,它会如下所示:

    % 1D
    x = [5 6 8 2 5]; 
    y = [6 -1 3 5 1];
    x1 = [x zeros(1,size(x,2))];
    y1 = [y zeros(1,size(y,2))];
    c1 = ifft(fft(x1).*fft(y1));
    c2 = conv(x,y,'full');
    
    % 2D 
    X = [1 2 3;4 5 6; 7 8 9];
    Y = [-1 1];
    X1 = [X zeros(size(X,1),size(Y,2)-1);zeros(size(Y,1)-1,size(X,2)+size(Y,2)-1)];
    Y1 = zeros(size(X1));    Y1(1:size(Y,1),1:size(Y,2)) = Y;
    c1 = ifft2(fft2(X1).*fft2(Y1));
    c2 = conv2(X,Y,'full'); 
    

    为了澄清卷积,也看这张图:

    【讨论】:

    • @_tashuka 这是一个很好的答案!我希望它可以帮助许多其他人理解卷积
    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2012-12-10
    • 2016-08-18
    • 2018-11-24
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多