Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

cconv

Convolución circular Modulo-n

Descripción

ejemplo

c = cconv(a,b) implica vectores y .ab

ejemplo

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

Ejemplos

contraer todo

Generar dos señales de diferentes longitudes. Compare su convolución circular y su convolución lineal. Utilice el valor predeterminado para .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 producen el mismo resultado a la precisión de la máquina.

Genera dos vectores y calcula su convolución circular modulo-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. Se utiliza para calcular su correlación circular.cconv Voltear y conjugar 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 el correlación cruzada calculado mediante .xcorr

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

Generar dos señales: una forma de onda triangular de cinco muestras y un filtro FIR de primer orden con respuesta

<math display="block">
<mrow>
<mi>H</mi>
<mo stretchy="false">(</mo>
<mi>z</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>1</mn>
<mo>-</mo>
<msup>
<mrow>
<mi>z</mi>
</mrow>
<mrow>
<mo>-</mo>
<mn>1</mn>
</mrow>
</msup>
</mrow>
</math>
.

x1 = conv([1 1 1],[1 1 1])
x1 = 1×5

     1     2     3     2     1

x2 = [-1 1]
x2 = 1×2

    -1     1

Calcular 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 modulo-2 equivale a dividir la convolución lineal en matrices de dos elementos y sumar las matrices.

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

Calcular la convolución circular modulo-3 y compararla 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 exactamente, rellena la convolución con ceros antes de agregarla.

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 o mayor que la longitud de convolución, rellena la convolución y no agrega.

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

En el ejemplo siguiente se requiere el software de ™ Parallel Computing Toolbox. Consulte para ver qué GPU son compatibles.GPU Support by Release (Parallel Computing Toolbox)

Cree dos señales que consistan en una onda sinusoidal de 1 kHz en ruido gaussiano blanco aditivo. La frecuencia de muestreo es de 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));

Ponga y en la GPU usando .xygpuArray Obtenga la convolución circular utilizando 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.8496e-08 

Devuelve la convolución circular, , al espacio de trabajo MATLAB® utilizando .cirCgather

cirC = gather(cirC);

Argumentos de entrada

contraer todo

Matriz de entrada, especificada como vectores u objetos.gpuArray Consulte para obtener más información sobre los objetos.Run MATLAB Functions on a GPU (Parallel Computing Toolbox)gpuArray El uso con objetos requiere software.cconvgpuArrayParallel Computing Toolbox™ Consulte para ver qué GPU son compatibles.GPU Support by Release (Parallel Computing Toolbox)

Ejemplo: especifica un sinusoides ruidoso como vector de fila.sin(2*pi*(0:9)/10) + randn([1 10])/10

Ejemplo: especifica un sinusoides ruidoso comogpuArray(sin(2*pi*(0:9)/10) + randn([1 10])/10) gpuArray Objeto.

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

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

Argumentos de salida

contraer todo

Convolución circular de vectores de entrada, devueltos como vector o .gpuArray

Sugerencias

Para 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™.

Consulte también

|

Introducido en R2007a