【问题标题】:Comparing different linear convolution methods in MatlabMatlab中比较不同的线性卷积方法
【发布时间】:2017-01-19 09:47:03
【问题描述】:

我试图通过采用 Matlab 方法here 来了解线性卷积和循环卷积之间的区别。我将线性卷积的结果与使用内置 convcconv 函数、Bruno Luong 的 convnfft 和 NAG 的 c06pk 进行比较。

这与math.stackexchange 帖子有关。

我的代码是

% complex vectors
x = rand(2^5,1) + 1j*rand(2^5,1);
y = rand(2^5,1) - 1j*rand(2^5,1);

clin = conv(x,y); % Matlab convolution function
cfun = convnfft(x,y); % Bruno Luong function

N = length(x)+length(y)-1;
xpad = [x' zeros(1,N-length(x))]; % pad vectors
ypad = [y' zeros(1,N-length(y))];
ccirc = cconv(xpad,ypad); % do linear convolution with circular convolution function
cnag = c06pk(int64(1),xpad,ypad); % do linear convolution with NAG function

figure()
plot(clin,'o'); hold on; plot(cfun,'+')
figure()
plot(ccirc,'.'); hold on; plot(cnag,'x')

当我使用代码中列出的各种方法绘制线性卷积的结果时,并非所有人都同意clin 结果。 cfun 同意,但 ccirccnag 不同意,因为它们是为寻找循环卷积而设计的。

我对零填充做错了吗?

编辑:如果我绘制这些线性卷积的结果,我会得到:

cconvc06pk 是否存在缩放问题?

【问题讨论】:

    标签: matlab convolution


    【解决方案1】:

    你写道:

    xpad = [x' zeros(1,N-length(x))]; 
    ypad = [y' zeros(1,N-length(x))]; 
    

    但是,' 运算符不仅可以转置,还可以共轭。替换为

    xpad = [x.' zeros(1,N-length(x))]; 
    ypad = [y.' zeros(1,N-length(x))]; 
    

    这应该可以解决问题。我只能测试 convcconv 在此修复后完全同意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2016-02-12
      • 1970-01-01
      • 2015-01-27
      相关资源
      最近更新 更多