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

La convolución circular modulo-n

Descripción

ejemplo

c = cconv(a,b) convoluciona 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 cruzada circular de dos secuencias.cconv

Ejemplos

contraer todo

Genere 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 demuestra que las dos convoluciones producen el mismo resultado para la precisión de la máquina.

Genere dos vectores y calcule 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 usa para calcular su correlación cruzada circular.cconv Voltear y conjugada 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

<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

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

Calcule la convolución circular modulo-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 más pequeña que la longitud de convolución y no la divide exactamente, Pad la convolución con ceros antes de agregar.

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, Pad la convolución y no agregar.

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 siguiente ejemplo se requiere el software Parallel Computing Toolbox™. Consulte para ver qué GPU son compatibles.GPU Support by Release (Parallel Computing Toolbox)

Cree dos señales que consisten 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));

Poner 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 

Devuelva la convolución circular, al espacio de trabajo de 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 de objetos requiere software.cconvgpuArrayParallel Computing Toolbox™ Consulte para ver qué GPU son compatibles.GPU Support by Release (Parallel Computing Toolbox)

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

Ejemplo: especifica una sinusoide ruidosa como ungpuArray(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 se especifica, la convolución tiene longitud.nlength(a)+length(b)-1

Argumentos de salida

contraer todo

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

Sugerencias

Para las 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