cconv

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

Синтаксис

c = cconv(a,b)
c = cconv(a,b,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™. Пошлите к Поддержке графического процессора Релизом (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 на графическом процессоре с помощью 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.8496e-08

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

cirC = gather(cirC);

Входные параметры

свернуть все

Входной массив, заданный как векторы или объекты gpuArray. Смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox) для получения дополнительной информации об объектах gpuArray. Используя cconv с gpuArray объекты требует программного обеспечения Parallel Computing Toolbox™. Пошлите к Поддержке графического процессора Релизом (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] Orfanidis, Софокл Дж. Интродукшн к Обработке сигналов. Englewood Cliffs, NJ: Prentice Hall, 1996, стр 524–529.

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

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Смотрите также

|

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