我试图通过调整Matlab方法here来理解线性和循环卷积之间的区别。我将线性卷积的结果与使用内置conv
和cconv
函数,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
同意,但ccirc
和cnag
不同意,因为它们是为查找循环卷积而设计的。
我是否在填零时做错了什么?
编辑:如果我绘制这些线性卷积的结果,我得到:
cconv
和c06pk
是否存在扩展问题?
答案 0 :(得分: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))];
这应该可以解决问题。我只能测试conv
和cconv
,在此修复后完全同意。