cconv
Convolución circular de módulo n
Sintaxis
Descripción
Ejemplos
Convolución circular y convolución lineal
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.
Convolución circular
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
Correlación cruzada circular
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
Convolución circular con longitud de salida variable
Genere dos señales: una forma de onda triangular de cinco muestras y un filtro FIR de primer orden con respuesta .
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
Convolución circular mediante la GPU
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 espacio de trabajo de MATLAB® mediante gather
.
cirC = gather(cirC);
Argumentos de entrada
a
, b
— Arreglos de entrada
vector | objeto gpuArray
Arreglo de entrada, especificado como vectores u objetos gpuArray
. Consulte Run MATLAB Functions on a GPU (Parallel Computing Toolbox) para obtener más información acerca de los objetos gpuArray
. Para utilizar cconv
con objetos gpuArray
, se requiere el software Parallel Computing Toolbox™. Consulte GPU Computing Requirements (Parallel Computing Toolbox) para ver las GPU que se admiten.
Ejemplo: sin(2*pi*(0:9)/10) + randn([1 10])/10
especifica una sinusoide con ruido como un vector fila.
Ejemplo: gpuArray(sin(2*pi*(0:9)/10) + randn([1 10])/10)
especifica una sinusoide con ruido como un objeto
.gpuArray
Tipos de datos: single
| double
Soporte de números complejos: Sí
n
— Longitud de convolución
entero positivo
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
c
— Convolución circular
vector | objeto gpuArray
Convolución circular de vectores de entrada, devuelta como un vector o gpuArray
.
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™.
Arreglos GPU
Acelere código mediante la ejecución en una unidad de procesamiento gráfico (GPU) mediante Parallel Computing Toolbox™.
Esta función es totalmente compatible con los arreglos de GPU. Para obtener más información, consulte Run MATLAB Functions on a GPU (Parallel Computing Toolbox).
Historial de versiones
Introducido en R2007a
Abrir ejemplo
Tiene una versión modificada de este ejemplo. ¿Desea abrir este ejemplo con sus modificaciones?
Comando de MATLAB
Ha hecho clic en un enlace que corresponde a este comando de MATLAB:
Ejecute el comando introduciéndolo en la ventana de comandos de MATLAB. Los navegadores web no admiten comandos de MATLAB.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)