Я пытаюсь понять разницу между линейной и круговой сверткой, адаптируя методологии Matlab here. Я сравниваю результаты линейной свертки с использованием встроенных функций conv
и cconv
, convnfft
Bruno Luong и NAG c06pk
.Сравнение различных методов линейной свертки в Matlab
Это связано с сообщением 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
не потому, что они предназначены для поиска круговых сверток.
Я сделал что-то неправильно с нулевым заполнением?
Edit: Если я сюжет результаты этих линейных сверток я получаю:
есть какой-то масштабный вопрос в cconv
и c06pk
?