Main Content

deconv

최소제곱 디컨벌루션(Deconvolution)과 다항식(Polynomial) 나눗셈

설명

다항식의 장제법

예제

[x,r] = deconv(y,h)는 다항식의 장제법(Long Division)을 사용하여 벡터 y에서 벡터 h를 디컨벌루션하고, 몫 x와 나머지 r을 반환합니다. 따라서 y = conv(x,h) + r이 됩니다. yh가 다항식 계수의 벡터인 경우 디컨벌루션하는 것은 y로 표현된 다항식을 h로 표현된 다항식으로 나누는 것과 같습니다.

최소제곱 디컨벌루션

R2023b 이후

[x,r] = deconv(y,h,shape)는 컨벌루션된 신호 y의 하위 섹션을 지정합니다. 여기서 y = conv(x,h,shape) + r입니다.

최소제곱 디컨벌루션 방법(Method="least-squares")을 사용하는 경우 shape"full", "same" 또는 "valid"로 지정할 수 있습니다. 그렇지 않고 디폴트 장제법 디컨벌루션 방법(Method="long-division")을 사용하는 경우 shape"full"이어야 합니다.

예제

[x,r] = deconv(___,Name=Value)는 위에 열거된 구문에 나와 있는 입력 인수 조합 외에, 이름-값 인수를 하나 이상 사용하여 옵션을 지정합니다.

  • deconv(__,Method=algorithm)을 사용하여 디컨벌루션 방법을 지정할 수 있습니다. 여기서 algorithm"long-division" 또는 "least-squares"일 수 있습니다.

  • deconv(__,RegularizationFactor=alpha)를 사용하여 디컨벌루션 방법의 최소제곱해에 대한 Tikhonov 정규화 인자를 지정할 수도 있습니다.

예제

모두 축소

각각 다항식 2x3+7x2+4x+9x2+1의 계수를 포함하는 벡터 yh를 만듭니다. y에서 h를 디컨벌루션하여 첫 번째 다항식을 두 번째 다항식으로 나눕니다. 디컨벌루션 결과는 몫 계수 다항식 2x+7과 나머지 계수 다항식 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

R2023b 이후

가우스 형태를 가진 신호 x를 만듭니다. 이 신호를 랜덤 잡음으로 구성된 임펄스 응답 h와 컨벌루션합니다.

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

원래 신호, 임펄스 응답, 컨벌루션된 신호를 플로팅합니다.

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.

다음으로, 디폴트 다항식의 장제법을 사용하여 임펄스 응답 h에 대해 신호 y의 디컨벌루션을 구합니다. 이 방법을 사용할 경우 디컨벌루션 계산이 불안정하므로, 결과가 빠르게 증가할 수 있습니다.

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

수치적으로 안정된 계산을 위해 대신 최소제곱 방법을 사용하여 디컨벌루션을 구합니다.

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

두 개의 디컨벌루션 결과를 플로팅합니다. 여기에서는 최소제곱 방법이 가우스 형태를 갖는 원래 신호를 정확하게 반환합니다.

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.

R2023b 이후

두 개의 벡터를 만듭니다. xinh와의 컨벌루션에서 크기가 xin과 같은 중앙부를 구합니다. 컨벌루션된 신호 y의 중앙부는 전체 길이(length(xin)+length(h)-1 또는 10) 대신 길이 7을 가집니다.

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

임펄스 응답 h에 대해 신호 y의 최소제곱 디컨벌루션을 구합니다. 컨벌루션된 신호 y가 중앙부에 한정됨을 지정하려면 "same" 옵션을 사용하십시오. 여기서 y = conv(x,h,"same") + r입니다. deconv가 반올림 오차 범위 내에서 원래 신호를 x로 복구하는지 확인합니다.

[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

R2023b 이후

두 개의 요소를 갖는 벡터 두 개를 만들고 "valid" 옵션을 사용하여 이들 벡터를 컨벌루션합니다. 이 옵션은 모서리를 0으로 채우지 않고, 계산한 컨벌루션의 일부만 반환합니다. 이 경우 컨벌루션된 신호 y는 요소를 하나만 갖습니다.

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

임펄스 응답 h에 대해 컨벌루션된 신호 y의 최소제곱 디컨벌루션을 구합니다. "valid" 옵션을 사용하는 경우 deconv가 항상 원래 신호를 x에 반환하지는 않습니다. 하지만 대신에 norm(x)를 최소화하는 디컨벌루션 문제의 해를 반환합니다.

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

   -0.1724   -0.0690

r = -3.3307e-16

해를 검사하려면 h를 사용하여 계산된 신호 x의 전체 컨벌루션을 구할 수 있습니다. 이 컨벌루션된 신호의 중앙부는 디컨벌루션 문제를 정의한 원래 y와 동일합니다.

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

   -0.3448   -1.0000   -0.3448

이 문제에서 deconv는 두 개의 변수를 갖는 하나의 방정식(-1=5x(1)+2x(2))을 풀기 때문에 원래 신호와 다른 신호를 반환합니다. 이는 부족 결정 시스템으로, 방정식보다 더 많은 변수를 가짐을 의미합니다. 이 시스템은 최소제곱 방법을 사용하여 잔차 노름 즉, norm(y - conv(x,h,"valid"))를 0으로 최소화할 경우 무한한 해를 갖습니다. 이러한 이유로 인해 deconvnorm(x)를 최소화하는 해도 구합니다.

다음 그림에서는 이 부족 결정 문제에 대한 상황을 보여줍니다. 파란색 선은 방정식 x(2)=-1/2-5/2x(1)에 대한 무한한 개수의 해를 나타냅니다. 주황색 원은 원점에서 해의 선까지의 최소 거리를 나타냅니다. deconv에서 반환된 해는 선과 원 사이의 접점에 놓여, 이것이 원점과 가장 가까운 해임을 나타냅니다.

Figure showing the solution using least-squares deconvolution

R2023b 이후

두 개의 신호 xh를 만들고 이들 신호를 컨벌루션합니다. 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));

원래 신호, 임펄스 응답, 컨벌루션된 신호를 플로팅합니다.

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.

다음으로, 정규화 인자 없이 최소제곱 방법을 사용하여 임펄스 응답 h에 대해, 잡음 있는 신호 y의 디컨벌루션을 구합니다. 기본적으로 정규화 인자는 0입니다.

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

원래 신호와 디컨벌루션된 신호를 플로팅합니다. 여기에서의 정규화 인자가 없는 deconv 함수는 잡음 있는 신호에서 원래 신호를 복구할 수 없습니다.

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.

대신 최소제곱 방법에 정규화 인자 1을 사용하여 h에 대한 y의 디컨벌루션을 구합니다. 조건이 나쁜 디컨벌루션 문제(예: 잡음 있는 신호가 포함된 문제)의 경우 정규화 인자를 지정하여 최소제곱해에 과적합이 발생하지 않도록 할 수 있습니다.

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

이 디컨벌루션된 신호를 플로팅합니다. 여기에서의 정규화 인자가 지정된 deconv 함수는 원래 신호를 복원합니다.

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.

입력 인수

모두 축소

디컨벌루션할 입력 신호로, 행 벡터 또는 열 벡터로 지정됩니다.

데이터형: double | single
복소수 지원 여부:

디컨벌루션에 사용되는 임펄스 응답 또는 필터로, 행 벡터 또는 열 벡터로 지정됩니다. yh는 길이와 데이터형이 서로 다를 수 있습니다.

  • yh 중 하나 또는 둘 모두 single형이면 출력값도 single형입니다. 그렇지 않은 경우 출력값은 double형입니다.

  • 입력값의 길이는 length(h) <= length(y)를 충족해야 합니다. 그러나 length(h) > length(y)이면 deconv는 출력값을 x = 0r = y로 반환합니다.

데이터형: double | single
복소수 지원 여부:

R2023b 이후

컨벌루션된 신호의 하위 섹션으로, 다음 값 중 하나로 지정됩니다.

  • "full"(디폴트 값) — yh와 함께 x의 전체 컨벌루션을 포함합니다.

  • "same"y는 컨벌루션에서 크기가 x와 같은 중앙부를 포함합니다.

  • "valid"y는 모서리를 0으로 채우지 않고 계산한 컨벌루션의 부분만 포함합니다. 이 옵션을 사용하면 length(h)가 0일 때를 제외하고 length(y)max(length(x)-length(h)+1,0)입니다. length(h) = 0이면 length(y) = length(x)입니다.

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

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

R2023b 이후

디컨벌루션 방법으로, 다음 값 중 하나로 지정됩니다.

  • "long-division" — 다항식의 장제법을 사용한 디컨벌루션(디폴트 값).

  • "least-squares" — 최소제곱을 사용한 디컨벌루션. 여기에서 잔차 신호(또는 나머지) r의 노름을 최소화하기 위해 디컨벌루션된 신호 x가 계산됩니다. 즉, xnorm(y - conv(x,h))를 최소화하는 해입니다.

R2023b 이후

최소제곱 디컨벌루션을 위한 Tikhonov 정규화 인자로, 실수로 지정됩니다. 최소제곱 디컨벌루션 방법을 사용할 때 정규화 인자를 alpha로 지정하면 norm(r)^2 + norm(alpha*x)^2을 최소화하는 벡터 x가 반환됩니다. 조건이 나쁜 문제에 정규화 인자를 지정하면 노름이 더 작은 해 x가 더 우선시됩니다.

디폴트 장제법 디컨벌루션 방법을 사용하는 경우 RegularizationFactor0이어야 합니다.

데이터형: double | single

출력 인수

모두 축소

디컨벌루션된 신호 또는 나눗셈의 몫으로, y = conv(x,h) + r이 되는 행 벡터나 열 벡터로 반환됩니다.

데이터형: double | single

잔차 신호 또는 나눗셈의 나머지로, y = conv(x,h) + r이 되는 행 벡터나 열 벡터로 반환됩니다.

데이터형: double | single

참고 문헌

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

확장 기능

버전 내역

R2006a 이전에 개발됨

모두 확장

참고 항목

|