본 포스트는 Ableton사에서 소프트웨어 개발자로 재직 중인 Jack Schaedler님의 DSP 입문 자료 <strong><em>Seeing Circles, Sines And Signals</em></strong>를 통해 공부하면서 다시 풀어서 정리한 내용입니다.


The Nyquist-Shannon Sampling Theorem

신호처리에서 Oversampling과 undersampling을 방지하고도, 여전히 신호를 잘 표현할 수 있는 sampling rate(샘플링주기)는 어떻게 선택할 수 있을까? 샘플링 주기는 주로 나이퀴스트-섀넌 샘플링 법칙(Nyquist-Shannon Sampling Theorum)를 따른다.

이 샘플링 법칙은 다음과 같이 정의된다.

만일 어떠한 신호 그 어떤 frequency도 B hertz보다 높지 않다면, 1/(2B) 초 간격으로 샘플링을 하면 된다.

특정 신호 내 가장 높은 frequency를 알고 있다면, 샘플링 주기를 그 두배로 설정하면 된다는 뜻이다. 예를 들어 300Hz sine wave 를 샘플링하려 한다면, 우리는 두배 이상 즉, 600Hz 를 샘플링해야 한다. 반대로 샘플링 주파수가 두배보다 작을 경우, 간섭이 일어나며 앞에서 언급한 aliasing(참고)이 발생하게 된다.

신호 위주가 아닌 sampling rate 위주로 법칙을 정하면 다음과 같다.

샘플링 주기 FS hertz에 대하여, FS/2 혹은 그 이상인 frequency를 가진 신호는 적절하게 샘플링할 수 없다.

특히 sampling rate의 절반 즉, FS/2 라는 값은 Nyquist Limit 또는 Nyquist Frequency라고도 불리며, 샘플링 법칙을 논할 때 매우 중요하게 다뤄지는 값이다.

원글의 Figure 1.(링크)의 Sampling period 값을 조절하면서 직관적으로 이해해보자. Sampling rate이 16Hz일 경우, FS/2는 8이다. 모든 네가지 sine wave의 경우 8을 넘지 않으므로 샘플링이 적절하게 가능하다.

 

하지만 sampling rate을 4Hz으로 설정하면 FS/2의 값은 2이다. 따라서 2Hz, 3Hz, 4Hz의 sine wave는 제대로 샘플링 되지 않는다.

 

지난 글에서 인간은 20Hz ~ 20,000Hz 사이의 소리만 들을 수 있다고 말한 바 있다. 따라서 샘플링 법칙에 따라 인간이 들을 수 있는 범위 내에서 음악의 sampling rate를 정하고자 하면, 20,000의 두배 즉 40,000Hz 이상이 되어야 한다. 오디오와 음악의 주파수가 40,000Hz 근처(정확하게 말하자면 44,100Hz)인 것은 이 이유 때문이다.

 

Nyquist Frequency를 초과하는 경우

샘플링 법칙은 Nyquist Frequency(샘플링주기의 절반)에 한해서는 어떤 신호든 정확히 샘플링할 수 있고, 반대로 샘플링하고자 하는 샘플이 Nyquist frequency보다 높은 frequency를 가지고 있다면, 이 샘플링이 제대로 이루어지지 않는다는 것을 알게 되었다. 그렇다면 Nyquist Frequency를 초과하는 신호는 샘플링이 이루어지지 않는 이유에 대해서 알아보자.

원글의 Figure 1.(링크)에서 sampling rate은 24Hz이고 Nyquist frequcny는 24Hz의 절반인 12Hz이다. 플레이 했을 때, 신호가 Nyquist frequency를 지나면, 신호의 샘플들은 하나의 파랑색의 파형 뿐 아니라 새롭게 생성된, 점점 감소하는 frequency 형태의 회색의 파형까지도 sampling 결과를 통해 표현이 가능하게 된다.

 

이렇게 신호의 frequency를 제한하지 않고 Nyquist limit을 넘도록 허용하면, 샘플링된 신호는 Nyquist frequency가 투영된 새로운 sine wave를 표현하게 된다. 결국 실제로는 존재하지도 않는 회색 신호를 샘플링에 포함시키게 되는 결과를 낳게 되는 것이다.

다음 포스팅에서 alias에 대한 다른 예시를 더 깊게 다루어서 정리를 할 예정이다.


Additional material

https://youtu.be/5wyYgy6LPyQ