2017-01-19 6 views
0

Я пытаюсь понять разницу между линейной и круговой сверткой, адаптируя методологии 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: Если я сюжет результаты этих линейных сверток я получаю:

enter image description hereenter image description here

есть какой-то масштабный вопрос в cconv и c06pk?

ответ

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, которые после этого исправить идеально.