Contenido principal

cconv

Convolución circular de módulo n

Descripción

c = cconv(a,b) convoluciona circularmente 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.

ejemplo

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

expandir todo

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

Historial de versiones

Introducido en R2007a