CS/영상처리

[푸리에 변환 이해하기 - 7] Sampling & Reconstruction & shannon Sampling Theorem [컴공과고씨]

시간빌게이츠 2022. 5. 28. 19:07
반응형

C-to-D conversion : sampling (연속신호 -> 이산신호)

D-to-C conversion : Reconstruction(interpolation) (이산신호 -> 연속신호)

 

 

 

Uniform Sampling

기본 적으로 samping은 연속 신호에 일정한 간격마다 값을 매겨주는 것입니다.

자 그럼 n을 sampling index라고 하면 

x[n] = x(nTs)  -∞ < n < ∞ 로 나타낼 수 있습니다.

그리고 여기서 sampling rate는 fs = 1/Ts samples/s 로 나타 낼 수 있겠죠?

 

 

Ideal Reconstruction(D to C)

우리는 이제 이산신호를 연속신호로 바꾸기 위해서는 그 사이 값을 Interpolation(보간)을 해주어야 합니다.

그 식은 바로 convolution을 이용한 식입니다. convolution은 이제 x축으로 shifting 시킨 후 곱해주고 더해주는 방식으로 제가 다른 포스트에서 다룬것이 있으니 거기서 자세하게 보면 이해할 수 있습니다. 

y(t) = ∑ x[n]p(t-nTs) * n=-∞ 부터 ∞ 까지

이 식에 대해서 이해해 봅시다. 

자 p(t)를 보면 샘플링 된 간격 사이까지 1의 값을 가진다고 하면 convolution 해준면 빨간 색 점선 처럼 값이 나올 것이다. 왜냐하면 값이 있는 위치에서 그 다음 간격까지 p(t)가 1이기 때문에 그 값을 유지해주는 식으로 보간을 해주기 때문이다.

노란신호가 원래 신호라고 하고 빨간 점선이 reconstruction한 신호라고 볼 때 원본 신호와는 완전히 같진 않지만 어느정도 형태를 지니고 있다고 볼 수 있다. 그렇다면 더 좋은 방법은 없을까?

바로 sinc를 이용하는 것이 이상적인 방법이다.

sinc 함수는 위 처럼 0에서는 1을 가지고 Ts마다 0을 가지는 것이 특징이다. 이것과 신호를 convolution 연산을 해주면 위 그림처럼 거의 원래 신호와 똑같이 복원할 수 있다.

 

자 그럼 Time - domain에서 sampling을 했을 때 frequency domain에서는 어떤 일이 일어날까? 

바로 주기 반복이 일어난다. 이것은 꼭 기억해두도록 하자. 이것에 대한 설명은 다른 포스트에서 할 예정입니다.

지금은 이 사실을 받아드리도록 하죠

자 그렇다면 관계를 정리하자면

이런 식으로 연속신호에서 sampling 한 값을 DTFT(이산신호에 대한 푸리에 변환 뒤에 포스트에서 다룰 예정) 한다는 것은

연속신호에서 CTFT해서 나온 X(w)를 주기반복 시킨 것이랑 같다라는 것입니다. 다시 한번 강조하면 시간 도메인이든 주파수 도메인이든 sampling을 하면 다른 도메인에서는 주기반복이 일어난다.  

 

그렇다면 복원을 하고 싶다면? 저 주기 반복된 신호에서 가운대 신호만 뽑아 낸다면 그것은 바로 X(w)일 것이다.

이런식으로 말이죠.

그래서 이 P(f)라는 필터를 time에 대한 함수로 바꾸어주면 바로 우리가 아까 공부했던 sinc 함수가 나오게 됩니다.

다만 P(f)처럼 저렇게 딱 직사각형의 필터를 만드는 것은 굉장히 어렵기 때문에 이상적인 필터모양이고 사실은 살짝 곡선이 진 필터를 사용합니다.

 

아무튼 그래서 여기서 우리는 중요한 사실을 알 수 있습니다. time - domain에서의 컨볼루션 연산은 주파수 도메인에서는 곱연산으로 나타나게 됩니다. 이것도 주기반복과 함께 기억하면 굉장히 좋습니다.

 

 shannon Sampling Theorem

샘플링을 할 때 주의할 점이 shannon Sampling Theorem에 의해서 x(t)의 최대주파수의 2배 이상의 주파수로 sampling을 해주어야합니다. 엄밀히 따지자면 2배 보다 조금이라도 크게 해주는게 맞습니다.  이유는

자 이런 신호가 있을 때 최대 주파수가 2Hz이고 샘플링 주파수가 4Hz일 때 초록색 점처럼 샘플링을 했다면 나중에 원래 신호로 복원할 수 있지만 만약 우연하게 빨간색 점처럼 샘플링 하게 되면 원래 신호로 복원을 할 수가 없기 때문에 엄밀히 따지면 2배 보다 조금이라도 크게 해야합니다. 근데 많은 사람들이 최대 주파수의 2배로 해도 문제가 없다라고 말합니다. 왜냐하면 실제 우리가 샘플링할 때 이렇게 딱 완전한 사인웨이브가 아니라 복잡한 신호이고 하필 딱 저렇게 샘플링하게 될 확률이 엄청 작기 때문에 2배 이상으로 해도 문제 없다라고 할 수 도 있지만 엄밀히 말하면 2배 초과가 맞다고 할 수 있습니다.

★ fs > 2fmax 

fmax (bandwidth : 대역폭)

fs = 1/Ts (sampling frequency : 표본화 주파수)

 

자 그렇다면 왜 2배 이상일까?

위 설명을 보면 이해가 될 것이다.

자 주기반복은 샘플링 주파수마다 반복이 될 것이다. 그런데 원래 신호의 주파수의 대역폭보다 fs/2가 더 작아버리게 된다면 위 그림처럼 신호가 곂쳐서 생성이 되면서 원하지 않는 신호가 나오게 된다. 이것을 우리는 aliasing이라고 한다.

그래서 표본화 주파수는 최대 주파수의 2배 이상으로 샘플링 해주어야 한다.

 

문제는 현실에서는 sampling 주파수가 고정되어 있는 경우가 많다. 그럴때는 어쩔 수 없이 low pass filter를 활용하여 aliasing이 발생하는 부분을 잘라낸 후 샘플링을 진행해 주어야한다. 물론 이러면 손실되어지는 신호는 있지만 위처럼 aliasing이 발생하는 것을 막을 수 있다.

다음글 DTFT(Discrete Time Fourier Transform) -> https://hagisilecoding.tistory.com/94

반응형