가우스 커널에 의해 흐려진 1D 신호의 디컨 볼 루션


12

노이즈가있는 신호를 생성하기 위해 가우스로 랜덤 신호를 변환하고 노이즈 (이 경우 포아송 노이즈)를 추가했습니다. 이제이 노이즈 신호를 분리하여 동일한 가우시안을 사용하여 원래 신호를 추출하고 싶습니다.

문제는 1D에서 디콘 볼 루션을 수행하는 코드가 필요하다는 것입니다. (나는 이미 2D에서 일부를 찾았지만 주요 목표는 1D입니다.)

그렇게 할 수있는 패키지 나 프로그램을 제안 해 주시겠습니까? (가급적 MATLAB에서)

도움을 주셔서 감사합니다.


1
MATLAB에서 함수 deconv를 사용하십시오.
GOEKHAN GUEL

추가 소음으로 작동하지 않습니다 ...
user1724

신호를 분리 할 수 없습니다 . 시스템의 임펄스 응답과 시스템 출력 이라는 두 가지 신호가 주어지면 역 컨벌루션을 추정 할 수 있습니다 . 어느 쪽을하려고합니까?
Phonon

2
@Phonon :이 의견에 대해서는 늦었지만 시스템 임펄스 응답에 대한 지식이 필요없는 블라인드 디컨 볼 루션 방법이 있습니다. 상상할 수 있듯이 임펄스 응답을 알고 있으면 더 잘할 수 있습니다.
Jason R

1
@JasonR 페어 포인트.
Phonon

답변:


14

StackOverflow에서 한 번 설명했습니다 .


신호는 벡터로 표현 될 수 있으며 컨벌루션은 N- 대각선 행렬 (여기서 N은 필터 길이)과 곱셈입니다. 나는 필터가 신호보다 훨씬 작다는 대답을 가정하고있다.

예를 들면 다음과 같습니다.

당신의 벡터 / 신호는 :

V1
V2
...
Vn

필터 (돌리는 요소)는 다음과 같습니다.

  [b1 b2 b3];

따라서 행렬은 nxn입니다 (A라고 함).

[b2 b3 0  0  0  0.... 0]
[b1 b2 b3 0  0  0.... 0]
[0  b1 b2 b3 0  0.... 0]
.....
[0  0  0  0  0  0...b2 b3]

컨볼 루션은 :

A*v;

그리고 컨볼 루션은

A^(-1) * ( A) * v;

분명히 어떤 경우에는 디컨 볼 루션이 불가능합니다. 단수 A를 갖는 경우가 여기에 해당합니다. 단수는 아니지만 단수에 가까운 행렬이라도 큰 숫자 오류가 있으므로 문제가 될 수 있습니다. 행렬 의 조건 번호 를 계산하여 추정 할 수 있습니다 .

A의 상태가 낮 으면 역을 계산하여 결과에 적용 할 수 있습니다.


이제 Matlab에서 몇 가지 예를 살펴 보겠습니다.

먼저 컨벌루션 행렬을 계산하는 함수를 만들었습니다.

function A = GetConvolutionMatrix(b,numA)
    A = zeros(numA,numA);
    vec = [b  zeros(1,numA-numel(b))];
    for i=1:size(A,1)
        A(i,:) = circshift(vec,[1 i]);
    end
end

이제 다른 커널에서 어떤 일이 발생하는지 봅시다 :

    b = [1 1 1];
    A = GetConvolutionMatrix(b,10);
    disp(cond(A));

조건 번호는 다음과 같습니다.

 7.8541

예상 한대로 문제가됩니다. 평균화 후 원래 신호를 다시 얻기가 어렵습니다.

이제 약간의 평균화를 시도해 보겠습니다.

b = [0.1 0.8 0.1];
A = GetConvolutionMatrix(b,10);
disp(cond(A));

결과는 다음과 같습니다.

1.6667

그것은 우리의 직감과 잘 어울리 며, 원래 신호의 온화한 평균화는 훨씬 쉽게 되돌릴 수 있습니다.

또한 역행렬이 어떻게 보이는지 볼 수 있습니다.

 figure;imagesc(inv(A));

여기에 이미지 설명을 입력하십시오

다음은 행렬에서 한 줄입니다.

  0.0003   -0.0026    0.0208   -0.1640    1.2910   -0.1640    0.0208   -0.0026    0.0003   -0.0001

우리는 각 라인의 에너지 대부분이 중심 주위에 3-5 개의 계수로 집중되어 있음을 알 수 있습니다. 따라서 축소하기 위해이 근사값으로 간단히 신호를 다시 축소 할 수 있습니다.

   [0.0208   -0.1640    1.2910   -0.1640    0.0208]

이 커널은 재미있어 보인다! 날카롭게하는 연산자입니다. 우리의 직감이 정확하고 선명하게하면 흐림이 사라집니다.


3
이 답변은 더 upvotes 자격
동적

1
왜 행렬이 3 각형이라고 생각합니까? 순환 컨볼 루션의 경우 순환합니다. 대부분의 경우 Toeplitz가됩니다. 내 솔루션을 살펴보십시오.
Royi

답을 읽으십시오-필터에 3 가지 요소가있는 경우를 분석하고 있습니다. 대부분의 경우 이미지 처리에서 필터는 신호보다 훨씬 작습니다. 예, 이것은 Toepliz 행렬이지만 N-diagonal이기도합니다. 여기서 N은 필터의 길이입니다. 원형 컨벌루션도 이미지 처리에 매우 쓸모가 없습니다.
Andrey Rubshtein

더 이상의 혼란을 피하기 위해 답변을 업데이트했습니다.
Andrey Rubshtein

3 개의 샘플로 구현 된 Gaussian Kernel을 보셨습니까?
Royi

5

랜덤 노이즈를 추가 한 경우 원래 신호를 얻을 수 없습니다 ... 노이즈와 신호의 주파수가 다른 경우 주파수 영역에서 신호를 분리 할 수 ​​있습니다. 그러나 당신이 찾고있는 것은 Wiener 필터 인 것 같습니다 .


5

나는 이것이 여전히 열린 문제라고 생각합니다.

원래 신호를 최대한 복구하려는 많은 연구 논문이 있습니다.

하나의 고전적인 접근 방식은 Wavelet 기반 방법 입니다.

같은 사전 접근 방식도있다 하나.

David L. Donho, Michael Elad, Alfred M. Bruckstein 등이 수행 한 연구에 따르면 문제에 대한 심층적 인 견해를 얻을 수 있습니다.


1
Nguyen, Farge & Schneider의 복잡한 Morlet wavelet을 사용한 최근 논문은 좋은 결과를 산출하는 것으로 보입니다. Google의 서지 코드 : 2012PhyD..241..186N 내 친구가이 방법을 성간 매체의 2D 웨이블릿과 함께 사용하여 탁월한 결과를 얻었습니다. 아직 자세히 살펴 보지 않았습니다.
PhilMacKay

3

문제를 올바르게 이해하면 다음과 같이 문제를 공식화 할 수 있습니다.

신호 모델이 있습니다

y=Hx+η

여기서 는 관측 값이고 는 컨볼 루션 연산자이며 는 노이즈입니다. 노이즈 특성에 대한 관찰과 관찰을 사용하여 를 추정하려고합니다 .yHηx

이 경우 는 푸 아송 분포에서 시뮬레이션됩니다. 그러나 위에서 언급 한 사전 접근 방식은 가우스 잡음 가정의 기초가됩니다. 이 경우 가우시안은 노이즈가 아닌 컨볼 루션 연산자입니다.η

나는 포아송 잡음 하에서 신호 복구에 대해 연구하지 않았지만, 나는 이 논문 이 유용 할 수 있다는 것을 알았다 . 그 맥락에서 유사한 접근법이이 문제에 유용 할 수 있습니다.


3

노이즈가 재구성 된 신호에서 임의로 확대되기 때문에 잡음이있는 데이터의 디컨 볼 루션은 잘못된 문제로 알려져있다. 따라서 용액을 안정화시키기 위해서는 정규화 방법이 필요합니다. 여기서 Tikhonov의 정규화 알고리즘을 구현하여이 문제를 해결하는 MATLAB 패키지를 찾을 수 있습니다.

https://github.com/soheil-soltani/TranKin .


3

나는 질문의 맨 처음으로 갈 것입니다. MATLAB에는 이미지 처리 응용 프로그램에 사용되는 디컨 볼 루션 기능이 있습니다. 그러나 1D 신호에도이 기능을 사용할 수 있습니다. 예를 들어

% a random signal
sig_clean = zeros(1,200); 
sig_clean(80:100)=100;

figure
subplot(1,3,1)
plot(sig_clean,'b-.','LineWidth',2)
legend('Clean Signal')

% convolve it with a gaussian
x=1:30;
h = exp(-(x-15).^2/20); h=h/sum(h);
sig_noisy = conv(sig_clean,h,'same');

% and add noise
sig_noisy = awgn(sig_noisy,0,'measured');

subplot(1,3,2)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',3)
legend('Blurred and noise added signal','Clean Signal')

( sig_noisy = sig_clean * h + noise) 그렇다면 출력 신호를 h함수와 분리하고 (거의) 입력 신호를 얻으십시오. Wiener deconvolution을 사용하고 있습니다.

sig_deconvolved=deconvwnr(sig_noisy,h,1);

subplot(1,3,3)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',2)
hold on, plot(sig_deconvolved,'k--','LineWidth',2)
legend('Blurred and noise added signal','Clean Signal','Deconvolved Signal')

여기에 이미지 설명을 입력하십시오 또는 h기능을 모르지만 입력 및 출력을 알고 있다면 이번에는 입력 신호를 출력과 분리하여 h^-1기능 을 제공하지 않는 이유는 무엇입니까 ? 그런 다음 노이즈 신호를 필터링하는 필터로 사용할 수 있습니다. ( sig_clean = sig_noisy * h^-1)

h_inv=deconvwnr(sig_clean,sig_noisy,1);

figure;
subplot(1,2,1)
plot(h_inv)
legend('h^-^1')


sig_filtered=conv(sig_noisy,h_inv,'same');
subplot(1,2,2)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',2)
hold on, plot(sig_filtered,'k--','LineWidth',2)
legend('Blurred and noise added signal','Clean Signal','Filtered Signal')

여기에 이미지 설명을 입력하십시오

도움이 되길 바랍니다.


2

컨볼 루션은 두 신호의 신호를 곱하고 합산하는 것입니다. 두 가지 결정적인 신호에 대해 이야기하고 있습니다. 하나를 다른 것으로부터 분리하고 싶다면 이것은 방정식 시스템의 해에 해당합니다. 아시다시피 방정식 시스템을 항상 해결할 수있는 것은 아닙니다. 방정식 시스템은 과도하게 결정되거나, 과소 결정되거나 또는 정확하게 해결할 수 있습니다.

약간의 노이즈가 추가되면 일부 정보가 손실되어이 정보를 다시 얻을 수 없습니다. 각 계수에 노이즈 항이 추가된다는 사실을 고려하여 선형 방정식 시스템을 다시 풀어야합니다. 또는 질문에 대한 다른 답변에서 볼 수 있듯이 먼저 노이즈 신호에서 원래 신호를 추정 한 다음 방정식 시스템을 풀고 싶을 수 있습니다.

잡음이 곱해지고 합산 된 계수에 추가된다는 점에 유의하는 것이 중요합니다. 그러므로 여러분의 방정식 시스템이 궁극적으로 풀리지 않는 경우도 있습니다. 고유하게 해결할 수 있도록 계수 행렬은 정사각형이며 전체 순위 여야합니다.


2

이것은 어려울 것입니다. 가우스와의 컨벌루션은 주파수 영역에서 가우시안의 푸리에 변환으로 곱하는 것과 같습니다. 이것은 또한 가우시안 (Gaussian)이기도하다. 이것은 본질적으로 저역 통과 필터이며 실제로 효과적인 필터이다. 노이즈를 추가하면 가우스의 "중지 대역"에있는 모든 정보가 삭제됩니다. 그것을 회복 할 방법이 없습니다.

디컨 볼 루션은 본질적으로 주파수 응답의 역수와 곱해집니다. 문제는 이렇습니다 : 원래 가우시안이 매우 작은 곳에서는 주파수 응답의 역수가 실제로 커집니다. 이 주파수에서 기본적으로 노이즈를 대량으로 증폭시킵니다. 모든 것이 완전히 소음이 없어도 수치 문제가 발생할 가능성이 큽니다.


2

구혼

디컨 볼 루션 (즉, 열화 연산자는 선형이고 시간 / 공간 불변)에는 많은 방법이 있습니다.
그들 모두는 많은 경우에 문제가 병에 걸렸다는 사실을 다루려고 노력합니다.

더 나은 방법은 복원 할 데이터 모델에 정규화를 추가하는 방법입니다.
통계 모델 (이전) 또는 모든 지식 일 수 있습니다.
이미지의 경우 좋은 모델은 그라디언트 조각이 매끄 럽거나 희소합니다.

그러나 답을 위해 간단한 매개 변수 접근 방식이 필요합니다.-모델에서 복원 된 데이터와 측정 값 사이의 최소 제곱 오차를 최소화합니다.

모델

최소 제곱 모델은 간단합니다.
데이터의 함수 인 목적 함수는 다음과 같습니다.

f(x)=12hxy22

최적화 문제는 다음과 같습니다.

argminxf(x)=argminx12hxy22

여기서 는 복원 할 데이터이며 는 Blurring Kernel (이 경우 가우스)이고 는 지정된 측정 세트입니다. 모델은 컨볼 루션의 유효한 부분에 대해서만 측정 값이 제공된다고 가정합니다. 즉, 및 이면 여기서 입니다.xhy
xRnhRkyRmm=nk+1

이것은 유한 공간에서의 선형 연산이므로 행렬 형식을 사용하여 작성할 수 있습니다.

argminxf(x)=argminx12Hxy22

여기서 은 컨볼 루션 행렬입니다.HRm×n

해결책

최소 제곱 솔루션은 다음과 같이 제공됩니다.

x^=(HTH)1HTy

알 수 있듯이 행렬 반전이 필요합니다.
적절히이 문제를 해결하는 능력은 운전자의 상태 번호에 따라 따르는 . HTHcond(H)=cond(HTH)

조건 번호 분석

이 조건 번호 뒤에 무엇이 있습니까?
Linear Algebra를 사용하여 대답 할 수 있습니다.
그러나 더 직관적 인 접근 방식은 주파수 영역에서 생각하는 것입니다.

기본적으로 열화 연산자는 일반적으로 고주파의 에너지를 감쇠시킵니다.
이제 주파수에서 이것은 기본적으로 요소 별 곱셈이기 때문에, 역 필터에 의해 요소별로 나누는 쉬운 방법이라고 할 수 있습니다.
글쎄, 그것은 위에서 한 일입니다.
필터가 실제로 에너지를 0으로 감쇠시키는 경우 문제가 발생합니다. 그렇다면 우리는 실제 문제가 있습니다 ...
이것은 기본적으로 조건 번호가 알려주는 것입니다. 일부 주파수는 다른 주파수에 비해 얼마나 세게 감쇠 되었습니까?

여기에 이미지 설명을 입력하십시오

위에서 가우시안 필터 STD 파라미터의 함수로 조건 번호 ([dB] 단위 사용)를 볼 수 있습니다.
예상 한 바와 같이, STD가 높을수록 LPF가 강하다는 것을 의미하므로 STD가 높을수록 조건 수가 나빠집니다.

수치 솔루션

가우시안 블러 커널의 앙상블이 만들어졌습니다.

여기에 이미지 설명을 입력하십시오

매개 변수는 , 및 입니다. 데이터는 무작위이며 노이즈가 추가되지 않았습니다.n=300k=31m=270

MATLAB에서 선형 시스템은 pinv()SVD 기반 Pseudo Inverse와 \연산자 를 사용 하여 해결되었습니다 .

여기에 이미지 설명을 입력하십시오

보시다시피 SVD를 사용하면 솔루션이 예상보다 훨씬 덜 민감합니다.

왜 오류가 있습니까?
솔루션보기 (STD가 가장 높은 경우) :

여기에 이미지 설명을 입력하십시오

보시다시피 시작과 끝을 제외하고 신호가 매우 잘 복원됩니다.
이것은 Valid Convolution을 사용하기 때문에 샘플에 대해서는 거의 알려주지 않습니다.

소음

노이즈를 추가하면 상황이 다르게 보일 것입니다!
이전에 결과가 좋았던 이유는 MATLAB이 데이터의 DR을 처리하고 조건 수가 많더라도 방정식을 풀 수 있기 때문입니다.

그러나 큰 조건 수는 역 필터가 일부 주파수를 강하게 증폭 (강한 감쇠를 반전시키기 위해)한다는 의미입니다.
노이즈가 포함되어 있으면 노이즈가 증폭되고 수복물이 나빠집니다.

여기에 이미지 설명을 입력하십시오

위에서 볼 수 있듯이 이제 재구성이 작동하지 않습니다.

요약

Degradation Operator를 정확히 알고 SNR이 매우 좋은 경우 간단한 디컨 볼 루션 방법이 작동합니다.
디컨 볼 루션의 주요 문제는 Degradation Operator가 얼마나 자주 주파수를 감쇠시키는 지입니다.
복원하기 위해 더 많은 SNR이 감쇠 될수록 감쇠됩니다 (이것은 기본적으로 Wiener Filter 의 아이디어입니다 ).
0으로 설정된 주파수는 복원 할 수 없습니다!

실제로 안정적인 결과를 얻으려면 몇 가지 선행 사항을 추가해야합니다.

코드는 내 StackExchange 신호 처리 Q2969 GitHub 리포지토리 에서 사용할 수 있습니다 .


2

일반적으로 두 개 이상의 성분을 추출하는 문제를 실질적으로 일반화하는 문제를 처리하는 한 가지 방법은 신호 # 1, # 2, ..., #n의 스펙트럼 G¹, G² ⋯, Gⁿ를 취하여 총계를 표로 만드는 것입니다. 제곱 Γ (ν) = | G¹ (ν) | ² + | G² (ν) | ² + ⋯ + | Gⁿ (ν) | ² 각 주파수 ν에서 G₁ (ν) ≡ G¹ (ν) * / Γ (ν), G₂ (ν) ≡ G² (ν) * / Γ (ν), ..., G_n (ν) ≡ Gⁿ (ν) * / Γ (ν). 부정확성 및 노이즈 문제는 일부 주파수 ν에 대해 Γ (ν) ~ 0이 가능하다는 사실에 해당합니다. 이를 처리하기 위해 다른 "신호"를 추가하여 G⁰ (ν) = 상수- "잡음"신호를 추출하십시오. 이제 Γ (ν)는 아래에 엄격하게 구속됩니다. 이것은 거의 확실히 Tikhonov 정규화와 관련이 있지만 동등한 결과 또는 다른 서신을 찾거나 확립하지 못했습니다. 더 간단하고 직접적이고 직관적입니다.

또는 G를 적합한 내부 제품 (예 :«G, G '»≡ ∫ G (ν) * G'(ν) dν)이 장착 된 벡터로 취급하고 (G₀, G₁, ⋯, G_n)을 이중으로 취할 수 있습니다 물론 (G⁰, G¹, ⋯, Gⁿ)의 (예를 들어 일반화 된 역)-성분 벡터가 선형 독립이라고 가정합니다.

가우시안 디컨 볼 루션의 경우 n = 1, G⁰ = "노이즈"신호, G¹ = "가우시안"신호를 설정합니다.


1

설명 된 문제는 노이즈 및 모델링 오류에 매우 민감하기 때문에 Andrey Rubshtein이 제공 한 답변은 노이즈가있는 경우 비참하게 실패합니다. 컨벌루션 행렬을 구성하는 것이 좋지만 반전에서 정규화 를 사용 하는 것은 이와 같은 문제에서 절대적으로 필요합니다. TSVD ( Truncated Singular Value Decomposition )는 매우 간단하고 직접적인 정규화 방법 (계산적으로 비싸지 만)입니다 . Tikhonov 정규화전체 변형 정규화 와 같은 방법확인 가치가 있습니다. Tikhonov 정규화 (및 일반적인 형식)는 Matlab에서 쉽게 구현할 수있는 매우 우아한 스택 형식입니다. Samuli Siltanen과 Jennifer Mueller의 실제 응용 분야에서 선형 및 비선형 역 문제를 확인하십시오.


1

실제로 질문은 명확하지 않습니다. 그러나 그 대답은 당신이 요구 한 것을 증명했습니다. 일부 사람들의 조언에 따라 선형 대수 방정식 시스템을 만들 수 있습니다. 맞지만 알려진 신호를 기반으로 한 행렬은 상태가 좋지 않습니다. 즉, 반전하려고 할 때 잘림 오류가 솔루션을 종료하고 결과에 임의의 숫자가 표시됩니다. 일반적인 접근 방식은 극한의 제약입니다. 솔루션의 표준을 최소화 || x || 구속 조건 || Ax-y || <델타. 따라서 Ax와 y의 차이를 크게 허용하지 않는 가장 작은 규범을 가진 x를 찾고 있습니다. 최소 제곱을 적용하여 얻은 행렬의 주 대각선에 소위 정규화 매개 변수를 추가하는 것이 매우 간단합니다. 이를 Tikhonov 정규화라고합니다. 이를 수행하는 코딩 샘플이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.