Main Content

deconv

Deconvolución de mínimos cuadrados y división polinomial

Descripción

División larga polinomial

ejemplo

[x,r] = deconv(y,h) deconvoluciona un vector h a partir de un vector y utilizando la división larga polinomial, y devuelve el cociente x y el resto r de manera que y = conv(x,h) + r. Si y y h son vectores de coeficientes polinómicos, la desconvolución es equivalente a dividir el polinomio representado por y por el polinomio representado por h.

Deconvolución de mínimos cuadrados

Desde R2023b

[x,r] = deconv(y,h,shape) especifica las subsecciones de la señal convolucionada y, donde y = conv(x,h,shape) + r.

Si utiliza el método de deconvolución de mínimos cuadrados (Method="least-squares"), puede especificar shape como "full", "same" o "valid". No obstante, si utiliza el método de deconvolución de división larga predeterminado (Method="long-division"), shape debe ser "full".

ejemplo

[x,r] = deconv(___,Name=Value) especifica opciones utilizando uno o más argumentos nombre-valor, además de cualquiera de las combinaciones de argumentos de entrada de las sintaxis anteriores.

  • Puede especificar el método de deconvolución mediante deconv(__,Method=algorithm), donde algorithm puede ser "long-division" o "least-squares".

  • También puede especificar el factor de regularización de Tikhonov en la solución de mínimos cuadrados del método de deconvolución mediante deconv(__,RegularizationFactor=alpha).

Ejemplos

contraer todo

Cree dos vectores, y y h, que contengan los coeficientes de los polinomios 2x3+7x2+4x+9 y x2+1, respectivamente. Divida el primer polinomio por el segundo deconvolucionando h a partir de y. La deconvolución da como resultado los coeficientes del cociente correspondientes al polinomio 2x+7 y los coeficientes del resto correspondientes a 2x+2.

y = [2 7 4 9];
h = [1 0 1];
[x,r] = deconv(y,h)
x = 1×2

     2     7

r = 1×4

     0     0     2     2

Desde R2023b

Cree una señal x que tenga forma gaussiana. Convolucione esta señal mediante una respuesta al impulso h que consiste en ruido aleatorio.

N = 200;
n = 0.1*(1:N);

rng("default")
x = 2*exp(-0.5*((n-10)).^2);
h = 0.1*randn(1,length(x));
y = conv(x,h);

Represente la señal original, la respuesta al impulso y la señal convolucionada.

figure
tiledlayout(3,1)
nexttile
plot(n,x)
title("Original Signal")
nexttile
plot(n,h)
title("Impulse Response")
nexttile
plot(0.1*(1:length(y)),y)
title("Convolved Signal")

Figure contains 3 axes objects. Axes object 1 with title Original Signal contains an object of type line. Axes object 2 with title Impulse Response contains an object of type line. Axes object 3 with title Convolved Signal contains an object of type line.

A continuación, busque la deconvolución de la señal y con respecto a la respuesta al impulso h mediante el método de división larga polinomial predeterminado. Con este método, el cálculo de la deconvolución es inestable y el resultado puede aumentar rápidamente.

[x1,r1] = deconv(y,h);
x1(end)
ans = 7.5992e+90

En su lugar, busque la deconvolución utilizando el método de mínimos cuadrados para obtener cálculos numéricamente estables.

[x2,r2] = deconv(y,h,Method="least-squares");

Represente los dos resultados de la deconvolución. Aquí, el método de mínimos cuadrados devuelve correctamente la señal original que tiene forma gaussiana.

figure
tiledlayout(2,1)
nexttile
plot(n,x1)
title("Deconvolved Signal Using ""long-division"" Method")
nexttile
plot(n,x2)
title("Deconvolved Signal Using ""least-squares"" Method")

Figure contains 2 axes objects. Axes object 1 with title Deconvolved Signal Using "long-division" Method contains an object of type line. Axes object 2 with title Deconvolved Signal Using "least-squares" Method contains an object of type line.

Desde R2023b

Cree dos vectores. Encuentre la parte central de la convolución de xin y h que tenga el mismo tamaño que xin. La parte central de la señal convolucionada y tiene una longitud de 7 en lugar de la longitud completa, que es length(xin)+length(h)-1 o 10.

xin = [-1 2 3 -2 0 1 2];
h = [2 4 -1 1];
y = conv(xin,h,"same")
y = 1×7

    15     5    -9     7     6     7    -1

Encuentre la deconvolución de mínimos cuadrados de la señal y con respecto a la respuesta al impulso h. Utilice la opción "same" para especificar que la señal convolucionada y es solo la parte central, donde y = conv(x,h,"same") + r. Muestre que deconv recupera la señal original en x dentro de errores de redondeo.

[x,r] = deconv(y,h,"same",Method="least-squares")
x = 1×7

   -1.0000    2.0000    3.0000   -2.0000    0.0000    1.0000    2.0000

r = 1×7
10-14 ×

         0    0.0888    0.1776         0         0         0         0

Desde R2023b

Cree dos vectores, cada uno con dos elementos, y convoluciónelos utilizando la opción "valid". Esta opción solo devuelve las partes de la convolución que se calculan sin los bordes con relleno de ceros. En este caso, la señal convolucionada y tiene un único elemento.

xin = [-1 2];
h = [2 5];
y = conv(xin,h,"valid")
y = -1

Busque la deconvolución de mínimos cuadrados de la señal convolucionada y con respecto a la respuesta al impulso h. Con la opción "valid", deconv no siempre devuelve la señal original en x, pero devuelve la solución del problema de deconvolución que minimiza norm(x) en su lugar.

[x,r] = deconv(y,h,"valid",Method="least-squares")
x = 1×2

   -0.1724   -0.0690

r = -3.3307e-16

Para comprobar la solución, puede buscar la convolución completa de la señal calculada x con h. La parte central de esta señal convolucionada es la misma que la original y que definió el problema de deconvolución.

yfull = conv(x,h,"full")
yfull = 1×3

   -0.3448   -1.0000   -0.3448

En este problema, deconv devuelve una señal diferente a la original porque resuelve una ecuación con dos variables, que es -1=5x(1)+2x(2). Este sistema es subdeterminado, es decir, que tiene más variables que ecuaciones. Este sistema tiene soluciones infinitas cuando se usa el método de mínimos cuadrados para minimizar la norma residual, o norm(y - conv(x,h,"valid")), a 0. Por este motivo, deconv también busca una solución que minimice norm(x).

La siguiente figura ilustra la situación de este problema subdeterminado. La línea azul representa el número infinito de soluciones de la ecuación x(2)=-1/2-5/2x(1). El círculo naranja representa la distancia mínima desde el origen hasta la línea de las soluciones. La solución devuelta por deconv se encuentra en el punto de la tangente entre la línea y el círculo, e indica la solución que se acerca más al origen.

Figure showing the solution using least-squares deconvolution

Desde R2023b

Cree dos señales, x y h, y convoluciónelas. Añada ruido aleatorio a la señal convolucionada en y.

N = 200;
n = 0.1*(1:N);

rng("default")
x = 2*exp(-0.8*(n - 8).^2) - 4*exp(-2*(n - 10).^2);
h = 2.*exp(-1*(n - 5).^2).*cos(4*n);
y = conv(x,h);
y = y + max(y)*0.05*randn(1,length(y));

Represente la señal original, la respuesta al impulso y la señal convolucionada.

figure
tiledlayout(3,1)
nexttile
plot(n,x)
title("Original Signal")
nexttile
plot(n,h)
title("Impulse Response")
nexttile
plot(0.1*(1:length(y)),y)
title("Convolved Signal with Added Noise")

Figure contains 3 axes objects. Axes object 1 with title Original Signal contains an object of type line. Axes object 2 with title Impulse Response contains an object of type line. Axes object 3 with title Convolved Signal with Added Noise contains an object of type line.

A continuación, busque la deconvolución de la señal ruidosa y con respecto a la respuesta al impulso h mediante el método de mínimos cuadrados sin factor de regularización. De forma predeterminada, el factor de regularización es 0.

[x1,r1] = deconv(y,h,Method="least-squares");

Represente la señal original y la señal deconvolucionada. Aquí, la función deconv sin un factor de regularización no puede recuperar la señal original a partir de la señal ruidosa.

figure;
tiledlayout(3,1);
nexttile
plot(n,x)
title("Original Signal")
nexttile
plot(n,x1)
title("Deconvolved Signal Without Regularization");

Figure contains 2 axes objects. Axes object 1 with title Original Signal contains an object of type line. Axes object 2 with title Deconvolved Signal Without Regularization contains an object of type line.

En su lugar, busque la deconvolución de y con respecto a h mediante el método de mínimos cuadrados con un factor de regularización de 1. Para un problema de deconvolución mal condicionado, como uno en el que haya señales ruidosas, puede especificar un factor de regularización para que no se produzca un sobreajuste en la solución de mínimos cuadrados.

[x2,r2] = deconv(y,h,Method="least-squares",RegularizationFactor=1);

Represente esta señal deconvolucionada. Aquí, la función deconv con un factor de regularización específico recupera la señal original.

nexttile
plot(n,x2)
title("Deconvolved Signal Using Regularization")

Figure contains 3 axes objects. Axes object 1 with title Original Signal contains an object of type line. Axes object 2 with title Deconvolved Signal Without Regularization contains an object of type line. Axes object 3 with title Deconvolved Signal Using Regularization contains an object of type line.

Argumentos de entrada

contraer todo

Señal de entrada que se desea deconvolucionar, especificada como vector fila o vector columna.

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

Respuesta al impulso o filtro utilizado en la deconvolución, especificados como vectores fila o columna. y y h pueden tener longitudes y tipos de datos diferentes.

  • Si y o h, o ambos, son de tipo single, las salidas también serán de tipo single. De lo contrario, las salidas serán de tipo double.

  • Las longitudes de las entradas deben satisfacer length(h) <= length(y). Sin embargo, si length(h) > length(y), deconv devuelve las salidas como x = 0 y r = y.

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

Desde R2023b

Subsección de la señal convolucionada, especificada como uno de estos valores:

  • "full" (valor predeterminado): y contiene la convolución completa de x con h.

  • "same": y contiene la parte central de la convolución que tiene el mismo tamaño que x.

  • "valid": y contiene solo las partes de la convolución que se calculan sin los bordes con relleno de ceros. Con esta opción, length(y) es max(length(x)-length(h)+1,0), excepto cuando length(h) es cero. Si length(h) = 0, entonces length(y) = length(x).

Argumentos de par nombre-valor

Especifique pares opcionales de argumentos como Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value es el valor correspondiente. Los argumentos nombre-valor deben aparecer después de otros argumentos, pero el orden de los pares no importa.

Ejemplo: [x,r] = deconv(y,h,Method="least-squares",RegularizationFactor=1e-3)

Desde R2023b

Método de deconvolución, especificado como uno de estos valores:

  • "long-division": deconvolución por división larga polinomial (predeterminado).

  • "least-squares": deconvolución por mínimos cuadrados, donde la señal deconvolucionada x se calcula para minimizar la norma de la señal residual (o resto) r. Es decir, x es la solución que minimiza norm(y - conv(x,h)).

Desde R2023b

Factor de regularización de Tikhonov para la deconvolución de mínimos cuadrados, especificado como un número real. Al utilizar el método de deconvolución de mínimos cuadrados, si se especifica el factor de regularización como alpha, se devuelve un vector x que minimiza norm(r)^2 + norm(alpha*x)^2. Para problemas mal condicionados, especificar el factor de regularización da preferencia a las soluciones x con normas más pequeñas.

Si utiliza el método de deconvolución de división larga predeterminado, RegularizationFactor debe ser 0.

Tipos de datos: double | single

Argumentos de salida

contraer todo

Señal deconvolucionada o cociente de la división, devueltos como un vector fila o columna tal que y = conv(x,h) + r.

Tipos de datos: double | single

Señal residual o resto de la división, devueltos como un vector fila o columna tal que y = conv(x,h) + r.

Tipos de datos: double | single

Referencias

[1] Nagy, James G. “Fast Inverse QR Factorization for Toeplitz Matrices.” SIAM Journal on Scientific Computing 14, no. 5 (September 1993): 1174–93. https://doi.org/10.1137/0914070.

Capacidades ampliadas

Historial de versiones

Introducido antes de R2006a

expandir todo

Consulte también

|