В документации cconv
говорится, что:
c = cconv(a,b,n)
циклически сворачивает векторы a
и b
.n
- длина результирующего вектора.Если вы пропустите n
, по умолчанию будет length(a)+length(b)-1
. Когда n = length(a)+length(b)-1
, круговая свертка эквивалентна линейной свертке, вычисленной с помощью conv
.
Я считаю, что причиной вашей проблемы является то, что вы не указали3-й вход в cconv
, который затем выбирает значение по умолчанию, которое вам не подходит.Я сделал анимацию, показывающую, что происходит, когда выбираются разные значения n
.
Если вы сравните мой результат для 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) );
Это код, который я использовал для анимации:
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