Skusku
Skusku

Reputation: 588

How is cconv in matlab implemented?

My understanding was, that these three should be the same, however matlab gives completely different results. The first and third one are in sync with what I calculated by hand, the second one is different.

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)

Upvotes: 1

Views: 208

Answers (1)

Cris Luengo
Cris Luengo

Reputation: 60645

From the documentation:

The modulo-2 circular convolution is equivalent to splitting the linear convolution into two-element arrays and summing the arrays.

So it is not the same to do

res = cconv(x_2, x_1, 2);

as to do

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

The former is equivalent to

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

(padding with zeros if res is odd in size).

On the other hand,

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

is equivalent to

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

and different from either of the two cconv results.

Upvotes: 1

Related Questions