exponenta event banner

cconv

Круговая свёртка по модулю-n

Синтаксис

Описание

пример

c = cconv(a,b) свертывает векторы a и b.

пример

c = cconv(a,b,n) круговые векторы свертки a и b. n - длина результирующего вектора. Также можно использовать cconv вычисляют круговую взаимную корреляцию двух последовательностей.

Примеры

свернуть все

Создайте два сигнала разной длины. Сравните их круговой и линейный свертки. Использовать значение по умолчанию для n.

a = [1 2 -1 1];
b = [1 1 2 1 2 2 1 1];

c = cconv(a,b);            % Circular convolution
cref = conv(a,b);          % Linear convolution

dif = norm(c-cref)
dif = 9.7422e-16

Результирующая норма фактически равна нулю, что показывает, что два свертка дают одинаковый результат для точности обработки.

Создайте два вектора и вычислите их круговую свертку по модулю 4.

a = [2 1 2 1];
b = [1 2 3 4];
c = cconv(a,b,4)
c = 1×4

    14    16    14    16

Создайте две комплексные последовательности. Использовать cconv вычисляют их круговую взаимную корреляцию. Развернуть и сопряжить второй операнд для соответствия определению взаимной корреляции. Укажите длину выходного вектора, равную 7.

a = [1 2 2 1]+1i;
b = [1 3 4 1]-2*1i;
c = cconv(a,conj(fliplr(b)),7);

Сравнение результата с взаимной корреляцией, вычисленной с помощью xcorr.

cref = xcorr(a,b);
dif = norm(c-cref)
dif = 3.3565e-15

Генерируют два сигнала: треугольный сигнал с пятью выборками и КИХ-фильтр первого порядка с откликом H (z) = 1-z-1.

x1 = conv([1 1 1],[1 1 1])
x1 = 1×5

     1     2     3     2     1

x2 = [-1 1]
x2 = 1×2

    -1     1

Вычислите их круговую свертку с длиной вывода по умолчанию. Результат эквивалентен линейной свертке двух сигналов.

ccnv = cconv(x1,x2)
ccnv = 1×6

   -1.0000   -1.0000   -1.0000    1.0000    1.0000    1.0000

lcnv = conv(x1,x2)
lcnv = 1×6

    -1    -1    -1     1     1     1

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

ccn2 = cconv(x1,x2,2)
ccn2 = 1×2

    -1     1

nl = numel(lcnv);
mod2 = sum(reshape(lcnv,2,nl/2)')
mod2 = 1×2

    -1     1

Вычислите круговую свертку по модулю 3 и сравните ее с совмещенной линейной сверткой.

ccn3 = cconv(x1,x2,3)
ccn3 = 1×3

     0     0     0

mod3 = sum(reshape(lcnv,3,nl/3)')
mod3 = 1×3

     0     0     0

Если выходная длина меньше длины свертки и не делит ее точно, перед добавлением заполните сверток нулями.

c = 5;
z = zeros(c*ceil(nl/c),1);
z(1:nl) = lcnv;

ccnc = cconv(x1,x2,c)
ccnc = 1×5

    0.0000   -1.0000   -1.0000    1.0000    1.0000

modc = sum(reshape(z,c,numel(z)/c)')
modc = 1×5

     0    -1    -1     1     1

Если выходная длина равна или больше длины свертки, установите сверток и не добавляйте.

d = 13;
z = zeros(d*ceil(nl/d),1);
z(1:nl) = lcnv;

ccnd = cconv(x1,x2,d)
ccnd = 1×13

   -1.0000   -1.0000   -1.0000    1.0000    1.0000    1.0000    0.0000   -0.0000    0.0000    0.0000    0.0000   -0.0000   -0.0000

modd = z'
modd = 1×13

    -1    -1    -1     1     1     1     0     0     0     0     0     0     0

В следующем примере требуется программное обеспечение Parallel Computing Toolbox™. Сведения о поддерживаемых графических процессорах см. в документе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений).

Создайте два сигнала, состоящих из синусоидальной волны 1 кГц в аддитивном белом гауссовом шуме. Частота дискретизации составляет 10 кГц

Fs = 1e4;
t = 0:1/Fs:10-(1/Fs);
x = cos(2*pi*1e3*t)+randn(size(t));
y = sin(2*pi*1e3*t)+randn(size(t));

Поместить x и y на GPU с использованием gpuArray. Получение круговой свертки с помощью графического процессора.

x = gpuArray(x);
y = gpuArray(y);
cirC = cconv(x,y,length(x)+length(y)-1);

Сравните результат с линейным свертыванием x и y.

linC = conv(x,y);
norm(linC-cirC,2)
ans =

   1.4047e-08

Верните круговой сверток, cirC, в рабочую область MATLAB ® с использованиемgather.

cirC = gather(cirC);

Входные аргументы

свернуть все

Входной массив, указанный как векторы или gpuArray объекты. См. раздел Выполнение функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений) для получения подробной информации о gpuArray объекты. Используя cconv с gpuArray Для объектов требуется программное обеспечение Parallel Computing Toolbox™. Сведения о поддерживаемых графических процессорах см. в документе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений).

Пример: sin(2*pi*(0:9)/10) + randn([1 10])/10 задает шумную синусоиду в качестве вектора строки.

Пример: gpuArray(sin(2*pi*(0:9)/10) + randn([1 10])/10) определяет шумную синусоиду как gpuArray объект.

Типы данных: single | double
Поддержка комплексного номера: Да

Длина свертки, заданная как положительное целое число. Если не указать n, то сверток имеет длину length(a)+length(b)-1.

Выходные аргументы

свернуть все

Круговая свертка входных векторов, возвращаемых как вектор или gpuArray.

Совет

Для длинных последовательностей круговая свертка может быть быстрее линейной.

Ссылки

[1] Орфанидис, Софокл Дж. Введение в обработку сигналов. Энглвуд Клиффс, Нью-Джерси: Прентис-Холл, 1996, стр. 524-529.

Расширенные возможности

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.

См. также

|

Представлен в R2007a