Как сделать круговую свертку между 2 функциями с cconv? - PullRequest
0 голосов
/ 20 мая 2018

Меня попросили выполнить циклическую свертку между двумя функциями путем выборки их, используя функции cconv.Известный результат такого рода свертки: CCONV( sin(x), sin(x) ) == -pi*cos(x)

Чтобы проверить вышеизложенное, я сделал:

w = linspace(0,2*pi,1000);
l = linspace(0,2*pi,1999);
stem(l,cconv(sin(w),sin(w))

, но полученный результат был:

Result

что абсолютно не -pi*cos(x).

Кто-нибудь может объяснить, пожалуйста, что не так с моим кодом и как его исправить?

1 Ответ

0 голосов
/ 22 мая 2018

В документации 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.

animation

Если вы сравните мой результат для 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) );

The right result


Это код, который я использовал для анимации:

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
...