[DSP 1] 샘플링 이론 (Sampling Theorem)
- Author : Songho Lee
- Date
- First Published: September 01, 2022
- Last modified: -
샘플링 이론 (Sampling Theorem)
시작하기에 앞서 (Before the beginning)
-
파이썬을 활용한 샘플링 이론의 실습을 진행하겠습니다.
-
조금 더 자세한 내용이 궁금하신 분들은 여기를 참고하시면 됩니다.
1. 서론 (Introduction)
- 본 실습의 목적은 앞으로 포스팅될 내용(신호처리, 머신러닝 등)의 가장 기본이 되는 신호의 샘플링에 관한 것입니다.
2. 실습 (Practice)
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
2.1. 정현파 생성하기 (Generating sinusoidal wave)
- 간단하게 주파수($f$) 1 (= 주기($T$) 1, 주기는 주파수의 역수이므로) 이며, 그 진폭($A$)도 1인 사인파형을 생성해보겠습니다.
-
생성한 사인파는 아래와 같습니다.
-
아래와 같이 한 주기에 40개의 포인트를 샘플링하는 경우, 원래 의도했던 연속적인 사인파형을 잘 나타내는 것을 확인할 수 있습니다.
t = np.linspace(0,5,200)
x = np.sin(2*np.pi*t)
# plot
plt.figure(figsize = (10,4))
plt.plot(t, x, '--o')
plt.xlabel('t [sec]')
plt.ylabel('x(t)')
plt.show()
- 이번에는 주파수($f$) 2 (= 주기($T$) 0.5) 이며, 진폭($A$) 1인 사인파형을 생성해보겠습니다.
- 주파수가 1 일때와 마찬가지로 원래 사인파를 잘 나타내는 것을 아래의 결과에서 확인할 수 있습니다.
t = np.linspace(0,5,200)
x = np.sin(2*np.pi*2*t)
# plot
plt.figure(figsize = (10,4))
plt.plot(t, x, '--o')
plt.xlabel('t [sec]')
plt.ylabel('x(t)')
plt.show()
2.2. 나이퀴스트 이론 (Nyquist frequency)
-
나이퀴스트 이론이란, 신호는 그 신호에 포함된 가장 높은 진동수의 2배에 해당하는 빈도로 일정한 간격으로 샘플링하면 원래의 신호로 복원할 수 있다는 샘플링 이론입니다[2].
-
아래의 예제를 통해 감을 잡도록 하겠습니다.
-
2.1.에서 마지막으로 실습하였던 주파수 2인 사인파형을 생각해보겠습니다. 한 주기에 20개의 포인트를 샘플링하였고, 원래 파형을 잘 복원하는 것을 확인하였습니다.
-
그렇다면 더 작게 샘플링하여도 원래의 파형을 잘 나타낼 수 있을까요?
-
한 주기에 0.5, 1, 2, 2.5, 5 개의 포인트만 나타내도록 하겠습니다.
t_1 = np.linspace(0,5,5)
x_1 = np.sin(2*np.pi*2*t_1)
t_2 = np.linspace(0,5,10)
x_2 = np.sin(2*np.pi*2*t_2)
t_4 = np.linspace(0,5,20)
x_4 = np.sin(2*np.pi*2*t_4)
t_5 = np.linspace(0,5,25)
x_5 = np.sin(2*np.pi*2*t_5)
t_10 = np.linspace(0,5,50)
x_10 = np.sin(2*np.pi*2*t_10)
-
이해를 돕기 위해 원신호와 샘플링 포인트를 같이 나타내면 아래와 같습니다.
-
한 주기에 0.5개, 1개 포인트만 샘플링한 경우, 원래 신호를 복원하지 못하는 것을 확인할 수 있습니다.
-
한 주기에 2개 포인트 이상 샘플링한 경우, 주기성을 어느정도 복원하는 것을 확인할 수 있습니다.
-
샘플링 포인트 갯수가 더 많아질수록, 신호를 더 잘 복원합니다.
# plot
plt.figure(figsize = (10,12))
plt.subplot(5,1,1)
plt.plot(t, x, '--')
plt.plot(t_1, x_1, 'r--o')
# plt.xlabel('t [sec]')
plt.ylabel('x(t)')
plt.title('0.5 point per 1 period')
plt.subplot(5,1,2)
plt.plot(t, x, '--')
plt.plot(t_2, x_2, 'r--o')
# plt.xlabel('t [sec]')
plt.ylabel('x(t)')
plt.title('1 point per 1 period')
plt.subplot(5,1,3)
plt.plot(t, x, '--')
plt.plot(t_4, x_4, 'r--o')
# plt.xlabel('t [sec]')
plt.ylabel('x(t)')
plt.title('2 point per 1 period')
plt.subplot(5,1,4)
plt.plot(t, x, '--')
plt.plot(t_5, x_5, 'r--o')
# plt.xlabel('t [sec]')
plt.ylabel('x(t)')
plt.title('2.5 point per 1 period')
plt.subplot(5,1,5)
plt.plot(t, x, '--')
plt.plot(t_10, x_10, 'r--o')
plt.xlabel('t [sec]')
plt.ylabel('x(t)')
plt.title('5 point per 1 period')
plt.tight_layout()
-
하지만 연속적인 아날로그 신호를 복원하기 위해 무한정 샘플링할 수 없습니다.
-
이를 보완하는 이론이 바로 나이퀴스트 이론입니다[3, 4].
-
아날로그 신호를 디지털화(Analog to Digital Convertion)하는 과정에서, 샘플링된 신호에 가까운 범위를 대표하는 정수값으로 바꾸는 양자화(Quantization) 과정을 거칩니다.
-
양자화 과정에서 양자화 오차가 발생하여 기존 아날로그 신호와는 차이가 존재하는 신호를 얻게 됩니다.
-
하지만 나이퀴스트 샘플링 레이트가 만족되면 이론상으로는 오리지널 신호가 복원이 되는 것입니다.
-
신호를 복원했을 때 기존 아날로그 신호의 유실 없이 복원하기 위해서 얼마만큼 신호를 샘플링해야 하는가에 대한 것이 나이퀴스트 주파수입니다.
-
서두에서 언급하였듯, 나이퀴스트 이론에 따르면 원래 신호를 복원하기 위해서는 그 신호에 포함된 가장 높은 진동수의 2배 이상으로 샘플링해야 합니다.
2.3. 에일리어싱 (Aliasing)
-
에일리어싱이란 나이퀴스트(Nyquist) 샘플링 레이트(sampling rate) 보다 실제 샘플링 레이트가 충분히 빠르지 못할 때 생기는 현상입니다[5].
-
주파수 도메인에서 스펙트럼이 겹쳐지는 바람직하지 못한 현상입니다.
- 에일리어싱 예시 1 - 시계[5]
- 시계 초침은 1분에 한바퀴 회전합니다.
- 눈을 감고 15초마다 눈을 떠서 쳐다보면, 1분에 4번을 보게 되고, 초침이 도는 방향과 회전속도를 유추할 수 있습니다. (= 1분에 시계방향으로 1바퀴 유추 가능)
- 30초마다 눈을 떠서 쳐다보면, 초침이 도는 방향을 알기가 모호해집니다. 이 한계점이 나이퀴스트 레이트입니다. 1분에 두번보다 더 자주 보아야 방향과 회전속도를 알 수 있습니다.
- 만일 45초마다 보게 되면, 45×4=180초, 즉 2분마다 반시계 방향으로 1바퀴 도는 것처럼 보일 수 있습니다.
- 만일 75초마다 본다고 하면, 75×4=300초, 즉 5분마다 시계방향으로 한 바퀴 돈다고 생각하게 됩니다.
- 즉, 1분에 2회 이하로 느리게 보게 되면 원래의 회전 방향과 속도를 맞힐 수 없습니다.
- 에일리어싱 예시 2 - 마차 바퀴 현상 (Wagon-wheel effect)[1, 6]
- 카메라가 마차 바퀴를 30 fps(frame per second)로 영상을 촬영합니다.
- 마차 바퀴가 1초에 한 바퀴씩 돈다면, 12도에 한번씩 30번 샘플링이 되어 무리없이 바퀴가 돌아가는 모양의 영상이 촬영됩니다.
- 마차 바퀴가 1초에 30 바퀴씩 돌아간다면, 바퀴는 항상 정확히 같은 모양으로 있게 된다.
- 마차 바퀴가 1초에 30 바퀴 보다 조금 느리다면, 바퀴가 덜 돈 상태로 찍혀 바퀴가 ‘뒤로 도는 듯한’ 영상을 얻게 됩니다.
- 마차 바퀴가 1초에 30 바퀴 보다 조금 더 빠르다면, 바퀴가 더 돈 상태로 찍혀 바퀴가 ‘느리게 앞으로 도는 듯한’ 영상을 얻게 됩니다.
- 유독 자동차 바퀴에서 이런 현상이 도드라지게 나타나는 이유?
- 자동차 휠은 일정한 각도를 가지고 바깥으로 퍼져나가는 형상이기 때문에 한바퀴를 돌 때 여러번 같은 장면이 반복된다.
- 따라서 한 바퀴 도는 동안 비슷한 장면이 반복되고, 한 바퀴에 5번 동일한 모양이 나타난다면, 1초에 6바퀴 돌더라도 정지한 것처럼 보일 수 있다.
%%html
<center><iframe
width="560" height="315" src="https://www.youtube.com/embed/jHS9JGkEOmA?rel=0" frameborder="0" allowfullscreen>
</iframe></center>
- 에일리어싱 예시 3 - 공중부양 하는 새
- ㅋㅋ 웃깁니다.
%%html
<center><iframe
width="560" height="315" src="https://preview.redd.it/aimf202bk7l01.gif?format=mp4&s=9bc22cb5ae05b22d6ba9bdc216d228dab678be22" frameborder="0" allowfullscreen>
</iframe></center>
- 에일리어싱 예시 4 - 화질 깨짐
- 해상도가 낮은 그림을 원본 이상으로 확대할 경우 문제가 생깁니다.
- 한 변의 길이를 2배로 늘린다면 한 점은 4개의 점이 되겠죠? 이 때 확대 전 1개의 픽셀이 가지고 있던 색을 4개의 픽셀에 똑같이 칠해버리는 경우 문제가 생깁니다.
- 예를 들어 비스듬이 그린 직선을 확대한 경우, 직선이 아닌 계단 모양이 나타납니다.
- 해결 방법: 안티 에일리어싱(이에 대한 것은 여기에서는 다루지 않겠습니다.)
3. 마무리하며 (Closing Remarks)
- 결과 (Results)
- 나이퀴스트 샘플링 레이트에 따라서, 기존 신호 최고 주파수의 두 배로 샘플링을 한 경우, 시간 영역(Time-domain)에서의 어느 정도 주기적인 양상은 나타내는 것을 확인하였습니다.
- 하지만 2배의 샘플링으로는 Time-domain 신호의 완벽한 복원은 어려움을 확인하였습니다.
- 시간 영역(Time-domain)과 주파수 영역(Frequency-domain)에 대한 것은, 이후 Fast Fourier Transform(FFT) 포스팅에서 다시 다루도록 하겠습니다.
- 결론 (Conclusion)
- 이렇게 해서, 아날로그 신호를 분석하기 이전에 신호를 샘플링하는 부분을 살펴보았습니다.
- “그냥 무조건 샘플이 많을수록 좋은거네,” 라고 생각할 수 있습니다.
- 하지만 샘플이 많을수록 버퍼에 들어가는 데이터의 용량이 커지고 메모리가 더 소요되니, 시스템에 맞는 적절한 샘플링을 설정하는 것이 중요합니다.
- 저를 포함한, 자연 현상 및 아날로그 신호를 측정하고자 하는 사람들에게 조금이나마 도움이 되었으면 합니다.
4. 참고문헌 (References)
[1] IAI POSTECH Tutorials, “한국소음진동공학회 AI혁신위원회 2022년 인공지능 강습회 Discrete Signal Processing(DSP) 실습,” Link
[2] ralasun github, “나이퀴스트 이론(Nyquist frequency),” Link
[3] 가상현실 공간의 사운드 디자인 VR Sound, “나이퀴스트 이론, 샘플링 레이트,” Link
[4] 골드문트의 (김포) 보청기, 오디오 RC 이야기, “샘플링 이론, 나이퀴스트 샘플링 레이트,” Link
[5] 골드문트의 (김포) 보청기, 오디오 RC 이야기, “오버샘플링, 업샘플링, 에일리어싱,” Link
[6] 이웃집과학자, “차 바퀴 휠이 왜 뒤로 돌지?! ‘에일리어싱’,” Link
[7] reddit, “Framerate synced with a bird’s wings,” Link
Etc…
-
포스팅 공약을 했건만 지켜지지 못했군요… 아직 많이 부족함을 느낍니다.
-
부족한 부분 코멘트해주세요 (:
-
수식 가운데 정렬하는 마크다운 문법이 ‘\(...\)’ …에 수식을 삽입하는 것이 아닌걸까요… 왜 안되는 걸까요… ): 어렵네요 ㅠ.ㅠ
Shout-out to J. Choi !
댓글남기기