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™. Обратитесь к разделу Поддержка GPU по версии (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.4047e-08

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

cirC = gather(cirC);

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

свернуть все

Входной массив, заданный как векторы или gpuArray объекты. Смотрите Run MATLAB Functions on a GPU (Parallel Computing Toolbox) для получения дополнительной информации о gpuArray объекты. Используя cconv с gpuArray для объектов требуется программное обеспечение Parallel Computing Toolbox™. Обратитесь к разделу Поддержка GPU по версии (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, Sophocles J. Введение в обработку сигналов. Englewood Cliffs, Нью-Джерси: Prentice Hall, 1996, pp. 524-529.

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

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

.

См. также

|

Введенный в R2007a