在Matlab中比较不同的线性卷积方法
Comparing different linear convolution methods in Matlab
我试图通过采用 Matlab 方法来理解线性和循环卷积之间的区别 here. I'm comparing the results of linear convolution with use of the inbuilt conv
and cconv
function, Bruno Luong's convnfft
, and NAG's c06pk
。
这与math.stackexchangepost有关。
我的密码是
% 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
中是否存在缩放问题?
您写道:
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
,在这个修复之后它们完全一致。
我试图通过采用 Matlab 方法来理解线性和循环卷积之间的区别 here. I'm comparing the results of linear convolution with use of the inbuilt conv
and cconv
function, Bruno Luong's convnfft
, and NAG's c06pk
。
这与math.stackexchangepost有关。
我的密码是
% 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
中是否存在缩放问题?
您写道:
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
,在这个修复之后它们完全一致。