В этом примере показано, как установить эквивалентность между линейными и круговыми свертками.
Линейная и круговая свертка - принципиально разные операции. Однако существуют условия, при которых линейная и круговая свертка эквивалентны. Установление этой эквивалентности имеет важные последствия. Для двух векторов: x и yкруговая свертка равна обратному дискретному преобразованию Фурье (DFT) произведения DFT векторов. Знание условий, при которых линейные и круговые свертки эквивалентны, позволяет использовать DFT для эффективного вычисления линейных сверток.
Линейная свертка N-точечного вектора, xи вектор L-точки, y, имеет длину N + L - 1.
Для того, чтобы круговая свертка x и y была эквивалентной, необходимо наклеить векторы с нулями на длину, по крайней мере, N + L-1, прежде чем брать DFT. После инвертирования произведения DFT сохраните только первые элементы N + L - 1.
Создайте два вектора, x и yи вычисляют линейную свертку двух векторов.
x = [2 1 2 1]; y = [1 2 3]; clin = conv(x,y);
Выходной сигнал имеет длину 4 + 3-1.
Наклейка обоих векторов с нулями до длины 4 + 3-1. Получить DFT обоих векторов, умножить DFT и получить обратную DFT произведения.
xpad = [x zeros(1,6-length(x))]; ypad = [y zeros(1,6-length(y))]; ccirc = ifft(fft(xpad).*fft(ypad));
Круговая свертка векторов, заполненных нулем, xpad и ypad, эквивалентно линейному свертыванию x и y. Вы сохраняете все элементы ccirc так как выходные данные имеют длину 4 + 3-1.
Постройте график вывода линейной свертки и обратной ДПФ-произведения, чтобы показать эквивалентность.
subplot(2,1,1) stem(clin,'filled') ylim([0 11]) title('Linear Convolution of x and y') subplot(2,1,2) stem(ccirc,'filled') ylim([0 11]) title('Circular Convolution of xpad and ypad')

Поместите векторы на длину 12 и получите круговую свертку, используя обратную ДПФ произведения ДПФ. Сохраните только первые элементы 4 + 3-1, чтобы получить результат, эквивалентный линейной свертке.
N = length(x)+length(y)-1; xpad = [x zeros(1,12-length(x))]; ypad = [y zeros(1,12-length(y))]; ccirc = ifft(fft(xpad).*fft(ypad)); ccirc = ccirc(1:N);
Программное обеспечение Toolbox™ обработки сигналов имеет функцию, cconv, что возвращает круговую свертку двух векторов. Можно получить линейную свертку x и y с использованием круговой свертки со следующим кодом.
ccirc2 = cconv(x,y,6);
cconv используется та же процедура на основе DFT, что и в предыдущем примере.