REMI Lab강의 노트

Wireless Embedded Systems E02

복습: 복소수와 이산 신호

SDR은 표본마다 두 값 I와 Q를 재어 복소수 z = I + jQ로 넘겨준다. I와 Q가 수신기 안에서 어떻게 만들어지는지는 4장 '주파수 변환' 절에서 다룬다. 이 장은 신호 및 시스템에서 배운 복소수, LTI 시스템, 표본화, DFT를 짧게 되짚고, 개념마다 SDR 표본을 다룰 때 필요한 사실을 하나씩 뽑는다. 유도와 자세한 그림은 각 절에 연결한 신호 및 시스템 교재의 쪽에 있다.

복소수와 I/Q

SDR이 표본마다 넘겨주는 두 숫자 I와 Q는 어떻게 읽을까?

두 형식

복소수 하나는 실수 두 개를 담는다.

z=I+jQ=rejθr=∣z∣=I2+Q2,θ=arg⁡z\begin{gathered} z=I+jQ=re^{j\theta}\\ r=|z|=\sqrt{I^2+Q^2},\qquad \theta=\arg z \end{gathered}

더하고 뺄 때는 직교형식 (I,Q)(I,Q)가, 곱하고 나눌 때는 극형식 (r,θ)(r,\theta)가 편하다. 곱하면 크기는 곱해지고 각은 더해진다. 그래서 표본에 ejφe^{j\varphi}를 곱하면 크기는 그대로이고 각만 φ\varphi 돈다. SDR 코드에서 위상을 맞추는 일은 이 곱셈 한 번이다. 자세한 내용: 신호 및 시스템 4장 직교형식과 극형식, 곱셈과 거듭제곱근.

Euler 공식과 회전

Euler 공식 ejθ=cos⁡θ+jsin⁡θe^{j\theta}=\cos\theta+j\sin\theta에서 (ejθ)n=ejnθ(e^{j\theta})^n=e^{jn\theta}를 쓰면 De Moivre 공식 (cos⁡θ+jsin⁡θ)n=cos⁡nθ+jsin⁡nθ(\cos\theta+j\sin\theta)^n=\cos n\theta+j\sin n\theta가 나오고, θ=π\theta=\pi를 넣으면 ejπ+1=0e^{j\pi}+1=0이다. Euler 공식의 유도는 신호 및 시스템 4장 극형식과 Euler 공식에 있다.

정현파는 회전하는 복소수의 실수부이다.

Acos⁡(2πft+ϕ)=Re⁡{Aejϕej2πft}A\cos(2\pi ft+\phi)=\operatorname{Re}\left\{Ae^{j\phi}e^{j2\pi ft}\right\}

ej2πfte^{j2\pi ft}는 단위원 위를 1초에 ff바퀴 도는 점이다. f>0f>0이면 반시계 방향, f<0f<0이면 시계 방향으로 돈다. 음의 주파수는 도는 방향이 반대라는 뜻이다. 코사인은 두 방향의 회전을 절반씩 담는다.

cos⁡(2πft)=ej2πft+e−j2πft2\cos(2\pi ft)=\frac{e^{j2\pi ft}+e^{-j2\pi ft}}{2}

그래서 cos⁡(2πft)\cos(2\pi ft)와 cos⁡(−2πft)\cos(-2\pi ft)는 같은 파형이고, 코사인만 재서는 도는 방향을 알 수 없다. 방향을 알려면 가로 좌표 cos⁡\cos와 세로 좌표 sin⁡\sin을 함께 재야 한다. I/Q 수신기가 하는 일이 이것이다.

아래 그림은 ej2πfte^{j2\pi ft}의 점과 그 두 좌표가 그리는 파형이다. 먼저 ff를 +1+1 Hz와 −1-1 Hz로 바꾸며 점이 도는 방향을 보고, 그다음 오른쪽 파형에서 바뀌는 것이 cos인지 sin인지 본다.

반지름 1인 원 위의 점 ej2πft와 가로 좌표 cos 2πft(파랑), 세로 좌표 sin 2πft(보라)이다. 신호 및 시스템 2장·4장의 그림을 그대로 썼다.

해 보기 · 누르면 위 그림이 그 상태로 바뀐다

  1. f=+1f=+1 Hz에서 t=0.125t=0.125 s의 점을 본다.
    관찰

    점이 45°에 있고 두 좌표는 모두 0.71이다. 점은 반시계 방향으로 돈다.

  2. f=−1f=-1 Hz로 바꾼다.
    관찰

    점이 −45°에 있다. 가로 좌표(cos)는 0.71 그대로이고 세로 좌표(sin)만 −0.71로 부호가 바뀐다.

  3. f=+2f=+2 Hz로 바꾼다.
    관찰

    같은 시각에 점이 90°에 있다. 주파수는 회전 속도이다.

위상의 모호성

위상은 2π2\pi의 정수배만큼 정해지지 않는다. np.angle은 (−π,π](-\pi,\pi]로 접은 위상을 주고, np.unwrap은 이웃한 표본 사이의 변화가 π\pi보다 작다고 가정하고 2π2\pi를 더하거나 빼서 펼친다. 한 표본 사이에 반 바퀴 넘게 도는 신호는 접은 위상만으로 방향과 빠르기를 알 수 없다. 이것이 뒤에서 볼 aliasing과 같은 뿌리이다(신호 및 시스템 4장 정현파와 위상).

위상이 쓸모 있는 예가 GPS이다. L1 반송파는 1575.42 MHz라 파장이 c/f≈19c/f\approx19 cm이고, 거리를 재는 데 쓰는 C/A 부호는 위성마다 정해진 ±1의 수열이고, 그 값 하나가 이어지는 시간(칩)이 1/1.023 µs라 그동안 빛은 약 293 m 간다. 반송파 위상으로 거리를 재면 부호로 재는 것보다 훨씬 곱게 잴 수 있다. 대신 몇 번째 파장인지는 위상만으로 알 수 없다.

거듭제곱근과 직교

1의 NN제곱근 ej2πk/Ne^{j2\pi k/N}(k=0,…,N−1k=0,\ldots,N-1)은 단위원을 NN등분한 점이다. 뒤의 DFT 행렬은 이 점들로만 이루어진다.

복소 지수끼리의 직교는 켤레를 붙인 내적으로 잰다. 켤레 없이 곱하면 ej2πt⋅e−j2πt=1e^{j2\pi t}\cdot e^{-j2\pi t}=1처럼 서로 다른 두 주파수의 곱을 적분해도 0이 되지 않는다. 켤레를 붙이면 공통 주기 TT에서 k≠mk\ne m일 때 ∫0Tejkω0t ejmω0t‾ dt=0\int_0^Te^{jk\omega_0t}\,\overline{e^{jm\omega_0t}}\,dt=0이다. DFT의 지수가 음수인 것은 이 켤레 때문이다(신호 및 시스템 4장 직교성).

numpy에서는 이렇게 쓴다.

import numpy as np
z = np.array([1 + 1j, -1 + 1j])      # 표본 두 개, I + jQ
np.abs(z), np.angle(z)               # 크기 1.414…, 각 0.785…, 2.356… rad
z * np.exp(1j * np.pi / 2)           # 두 표본을 모두 90° 돌린다