Main Content

cconv

Convolución circular de módulo n

Descripción

ejemplo

c = cconv(a,b) convoluciona los vectores a y b.

ejemplo

c = cconv(a,b,n) convoluciona circularmente los vectores a y b. n es la longitud del vector resultante. También puede utilizar cconv para calcular la correlación cruzada circular de dos secuencias.

Ejemplos

contraer todo

Genere dos señales de diferente longitud. Compare su convolución circular y su convolución lineal. Utilice el valor predeterminado de 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

La norma resultante es prácticamente cero, lo que muestra que las dos convoluciones generan el mismo resultado con precisión de la máquina.

Genere dos vectores y calcule su convolución circular de módulo 4.

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

    14    16    14    16

Genere dos secuencias complejas. Utilice cconv para calcular su correlación cruzada circular. Voltee y conjugue el segundo operando para cumplir con la definición de correlación cruzada. Especifique una longitud de vector de salida de 7.

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

Compare el resultado con la correlación cruzada calculada mediante xcorr.

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

Genere dos señales: una forma de onda triangular de cinco muestras y un filtro FIR de primer orden con respuesta 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

Calcule su convolución circular con la longitud de salida predeterminada. El resultado es equivalente a la convolución lineal de las dos señales.

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

La convolución circular de módulo 2 es equivalente a dividir la convolución lineal en arreglos de dos elementos y sumar los arreglos.

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

Calcule la convolución circular de módulo 3 y compárela con la convolución lineal con alias.

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

     0     0     0

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

     0     0     0

Si la longitud de salida es menor que la longitud de convolución y no la divide de forma exacta, rellene la convolución con ceros antes de sumarla.

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

Si la longitud de salida es igual a o mayor que la longitud de convolución, rellene la convolución y no la sume.

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

El siguiente ejemplo requiere el software Parallel Computing Toolbox™. Consulte GPU Computing Requirements (Parallel Computing Toolbox) para ver las GPU que se admiten.

Cree dos señales compuestas por una onda sinusoidal de 1 kHz en ruido blanco gaussiano aditivo. La tasa de muestreo es 10 kHz.

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));

Coloque x e y en la GPU mediante gpuArray. Obtenga la convolución circular mediante la GPU.

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

Compare el resultado con la convolución lineal de x e y.

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

   1.4047e-08

Devuelva la convolución circular, cirC, al área de trabajo de MATLAB® mediante gather.

cirC = gather(cirC);

Argumentos de entrada

contraer todo

Arreglo de entrada, especificado como vectores.

Ejemplo: sin(2*pi*(0:9)/10) + randn([1 10])/10 especifica una sinusoide con ruido como un vector fila.

Tipos de datos: single | double
Soporte de números complejos:

Longitud de convolución, especificada como un entero positivo. Si no especifica n, la convolución tiene una longitud length(a)+length(b)-1.

Argumentos de salida

contraer todo

Convolución circular de vectores de entrada, devuelta como vector.

Sugerencias

En secuencias largas, la convolución circular puede ser más rápida que la convolución lineal.

Referencias

[1] Orfanidis, Sophocles J. Introduction to Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1996, pp. 524–529.

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2007a