cconv

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

Описание

пример

c = cconv(a,b) применяет операцию свертки к векторам a и b.

пример

c = cconv(a,b,n) циркулярный применяет операцию свертки к векторам a и bN длина итогового вектора. Можно также использовать 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