Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
CAU 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

Embedded System/신호 및 시스템

[신호및시스템] Phase 4-1 - 샘플링

sm_amoled 2025. 10. 14. 10:41

Impulse Train으로 신호 뽑아내기

Impulse 임펄스 함수 $\delta$

임펄스 함수$\delta(t)$ 란 $t=0$ 에서만 무한대의 크기를 가지고, 나머지 모든 시간에서는 0의 크기를 가지는 아주 뾰족한 함수를 말한다.

  • $t=0$ 에서의 크기는 무한대.
  • 그러나, 해당 지점에서의 가로폭이 매우 작아 함수의 그래프 면적 자체는 무한대가 아님.
  • 전체 시간에 대해서 적분했을 때 면적이 1이 된다.

임펄스 함수는 신호 함수에서 특정한 시점의 신호 값을 뽑아내는 ‘추출 함수’ 의 역할을 수행할 수 있다. 아래 수식은 전체 x 신호에 대해서 $t_0$ 만큼 가로로 이동한 델타 함수를 곱해 $t_0$ 에서의 신호 세기를 뽑아내는 과정을 보여준다.

$$
\int^{\infty}_{-\infty}x(t)\delta(x-t_0)dt = x(t_0)
$$

Impulse Train

Impulse Train (또는 delta train)은 일정한 간격으로 반복되는 임펄스 함수의 합. 임펄스 함수의 추출 방식을 동일하게 사용하면 일정한 간격으로 신호의 값들을 추출해낼 수 있다.

  • $T_0$ : 샘플링 주기
  • $f_0$ : 샘플링 주파수 ($\frac{1}{T_0}$)

연속 신호와 Impulse Train의 곱

  • $p(t)$ : 샘플링 주기를 $T_0$를 가지는 Impulse Train 함수
  • $x_s(t)$ : 샘플링한 신호 (아직 연속함수)

$$
x_s(t) = x(t) \cdot p(t) = x(t) \cdot \sum_{n=-\infty}^{\infty}\delta(t-nT_0)\
x_s(t) = \sum_{n=-\infty}^{\infty}x(t)\cdot \delta(t-nT_0)\
=\sum_{n=-\infty}^{\infty}x(nT_0)\cdot \delta(t-nT_0)
$$

(신호함수 $x(t)$ 의 나머지는 모두 0으로 제거되므로, $x(nT_0)$ 에 대해서만 신호를 곱해주면 된다.)

$$
x_s(t)=\sum_{n=-\infty}^{\infty}x(nT_0)\cdot \delta(t-nT_0)
$$

위 그림에서 보이는 것처럼, 신호 함수 $x(t)$에 Impulse Train 함수를 곱하면 $T_0$를 간격으로 삐죽삐죽한 모양을 그리는 연속함수 $x_s(t)$를 얻을 수 있다.

그러나, 여전히 해당 시점의 신호의 세기(함수값)만 뽑아내는게 아니라 연속 함수로 뾰족뾰족하게 함수값들을 보여주는 함수가 된다. 이제 여기에서 양자화 과정을 거쳐서 측정 값을 디지털 코드로 변환해주어야 한다. (시리얼화 필요함)

Impulse Train To Sequence

현재 변환한 시간 함수 $x_s(t)$ 는 여전히 임펄스들의 합으로 표현된 연속 시간 신호이다. 물리적으로는 “시간 축 상에 존재하는 임펄스들” 정도로 볼 수 있다. 그러나, MCU에서 이 정보들을 디지털 데이터로 활용하기 위해서는 이산 데이터로 분리할 필요가 있다. 다시 말해, 데이터를 연속 시간에서 이산 시간으로 보낼 필요가 있다.

$$
x_s(t) \rightarrow x[n]
$$

샘플링된 신호 시퀀스 $x[n]$ 는 다음의 특징을 가진다.

  • 연속 데이터가 아닌 이산 도메인의 데이터이기에, [ 대괄호 ] 를 사용해 표기한다.
  • 시간 정보를 제거하여, 인자로 시간 $t$ 대신에 index 번호 $n$ 을 사용한다.
  • 임펄스를 제거하여, 단순하게 $x[n] = x(nT_0)$ 의 값을 가진다.

이렇게 변환하면 푸리에 변환의 적용이 매우 단순해진다. $\Omega$ 는 여기에서 물리적인 각주파수 (rad/s) 를 말한다. 물리적인 주파수는 샘플링 주파수와 이어지는 데이터로, $\Omega_s = \frac{2\pi}{T_0}$에 따라 샘플링 주파수가 변경된다면 $X(\Omega)$ 의 주기도 함께 변경된다는 단점이 있다.

$$
X(\Omega) = \sum_{n=-\infty}^{\infty}x[n]\cdot e^{-j\Omega n}
$$

물리적인 각주파수 대신에 정규화된 각주파수 $\omega$를 사용하여 아래처럼 표현해줄 수도 있다. 이 경우에는 샘플링 주파수와 상관없이 항상 주기를 $2\pi$ 로 가지며, $\omega \in [0, 2\pi)$ 의 범위에 대해서만 고려해주면 된다.

$$
X(e^{j\omega}) = \sum_{n=-\infty}^{\infty}x[n]\cdot e^{-j\omega n}\\text{이때 }\omega=\Omega T_0 \text{ and }\omega \in [0, 2\pi)`
$$

이 두 식의 차이와 의미를 계속 생각해봤는데, 나는 나름대로 아래의 결론을 내렸다.


복소 평면에서 회전하는 그래프를 생각했을 때, $\Omega$ 를 인자로 받는 녀석은 $-\infty$ 에서부터 $\infty$ 까지의 주파수에 대해서 일치하는 정도를 찾는다. 아래 그래프에서 $cos(t)$ 함수의 샘플링에 최대가 되는 주파수를 찾아보려고 하면 이렇게 여러 개의 주파수를 찾을 수 있다.

그런데, $\omega$ 를 인자로 받는 녀석은 단순히 0

$2\pi$ 까지의 주파수에 대해서만 일치하는 정도를 찾는다. 어차피 이게 샘플링된 주파수이기 때문에 정확한 주파수를 찾을 수는 없다. 그래서 0

$2\pi$ 범위에 대해서 주파수의 파형만 판단한다. 그 다음에 $\omega = \Omega T_0$ 에서 $\Omega$ 와 $T_0$ 의 값의 밸런스를 조정해주면서 값을 찾으면 되니깐.

그리고 이 $\omega$ 값은 각주파수를 의미하기 때문에, $\frac{3}{2}\pi = -\frac{1}{2}\pi$ 만큼 회전한 것이라고 볼 수 있다. 그래서 매 샘플마다 $\pi$ 만큼 회전하는 경우 (1,0)→(-1,0) 을 반복하기에 가장 빠르게 회전하는 주파수라고 생각할 수 있다.

물론 이게 연속 신호에 대해서 값을 찾는 상황이였다면 단 하나의 주파수가 튀어나오겠지만, 지금은 ‘샘플’에 대해서 주파수를 추측하고 있기 때문에 위 그림처럼 여러 개의 주파수가 해답으로 제시될 수 있는 상황이라 그냥 정규화된 $\omega$ 를 구하고, $\Omega$와 $T_0$ 를 선택하는게 더 나은 방법일 것이라 생각된다.

실제로는?

실제로는 ADC (Analog to Digital Converter) 에서 $T_0$ 마다 신호의 크기를 측정해서 메모리에 저장한다. 즉, 이런 복잡한 Impulse Train과의 곱 같은걸 안하고, 그냥 신호의 세기를 가져온다. 😮😮😮😮

그런데 이걸 수학적으로 표현하고 분석해내기 위해서 Impulse Train과의 곱셈 후 표기방법을 sequence로 변환하는 과정을 거친다고 말을 한 것이다.

  • 푸리에 변환을 적용할 수 있음 (Impulse Train의 푸리에 변환이 간단함)
  • 주파수 영역 분석 가능 (Aliasing, Nyquist 정리 등을 유도해낼 수 있음)
  • 원본 복원에 대한 분석 가능

나는 지금까지 이해 과정을 거치면서 ADC는 이런 일을 하는구나! 아~~ 하고 있었는데, 그런게 아니였어… 그냥 쉽게 해석하기 위한 도구였을 뿐이였다… 어쩐지 처음에는 그냥 값 가져오면 되는거 아닌가 했는데 역시나 이런 이유가 숨어있었네.

320x100