如何使用cconv在2个函数之间进行循环卷积?

时间:2018-05-20 10:05:08

标签: matlab convolution

我被要求通过使用函数cconv对它们进行采样来对两个函数进行循环卷积。这种卷积的已知结果是:CCONV( sin(x), sin(x) ) == -pi*cos(x)

为了测试上面我做了:

w = linspace(0,2*pi,1000);
l = linspace(0,2*pi,1999);
stem(l,cconv(sin(w),sin(w))

但我得到的结果是:

Result

绝对不是-pi*cos(x)

有人可以解释一下我的代码有什么问题以及如何修复它?

1 个答案:

答案 0 :(得分:4)

cconv的文档中,它说:

  

c = cconv(a,b,n)循环卷积向量abn是结果向量的长度。如果省略n,则默认为length(a)+length(b)-1n = length(a)+length(b)-1时,循环卷积等效于使用conv 计算的线性卷积。

我认为你的问题的原因是你没有指定cconv的第三个输入,然后选择默认值,这对你来说不是正确的。我制作了一个动画,展示了选择n的不同值时会发生什么。

animation

如果您将n=200的结果与您的情节进行比较,您会发现数据的幅度大10倍,而linspace的长度则大10倍。这意味着需要进行一些归一化,可能是linspace步骤的乘法。

事实上,在适当缩放和选择n后,我们得到了正确的结果:

res = 100;                % resolution
w = linspace(0,2*pi,res);
dx = diff(w(1:2));        % grid step
stem( linspace(0,2*pi,res), dx * cconv(sin(w),sin(w),res) );

The right result

这是我用于动画的代码:

hF = figure(); 
subplot(1,2,1); hS(1) = stem(1,cconv(1,1,1)); title('Autoscaling');
subplot(1,2,2); hS(2) = stem(1,cconv(1,1,1)); xlim([0,7]); ylim(50*[-1,1]); title('Constant limits');

w = linspace(0,2*pi,100);
for ind1 = 1:200
  set(hS,'XData',linspace(0,2*pi,ind1));
  set(hS,'YData',cconv(sin(w),sin(w),ind1));
  suptitle("n = " + ind1);
  drawnow
  % export_fig(char("D:\BLABLA\F" + ind1 + ".png"),'-nocrop');
end