Как реализован cconv в matlab? - PullRequest
0 голосов
/ 01 июня 2018

Мое понимание было, что эти три должны быть одинаковыми, однако Matlab дает совершенно разные результаты.Первый и третий синхронизируются с тем, что я вычислил вручную, второй отличается.

x_1 = [1, 2, 0, 5];
x_2 = [1/2, -1/4, 1, 0, 3/4];

y_2_1 = ifft(fft(x_1, 2) .* fft(x_2, 2))
y_2_2 = cconv(x_2, x_1, 2)
y_2_3 = cconv(x_2(1:2), x_1(1:2), 2)

1 Ответ

0 голосов
/ 01 июня 2018

Из документации :

Круговая свертка по модулю-2 эквивалентна разбиению линейной свертки на двухэлементные массивы и суммированию массивов.

Так что это не то же самое

res = cconv(x_2, x_1, 2);

, что и

res2 = cconv(x_2, x_1);
res2 = res(1:2);

Первое эквивалентно

res = cconv(x_2, x_1);
res = res(1:2) + res(3:4) + res(5:6) + ...;

(заполнениенули, если res нечетного размера).

С другой стороны,

res3 = ifft(fft(x_1, 2) .* fft(x_2, 2));

эквивалентно

res3 = fft(x_1(1:2)) .* fft(x_2(1:2));
res3 = ifft(res3);

и отличается от любого из двухcconv результаты.

...