복습: 복소수와 이산 신호
SDR은 표본마다 두 값 I와 Q를 재어 복소수 z = I + jQ로 넘겨준다. I와 Q가 수신기 안에서 어떻게 만들어지는지는 4장 '주파수 변환' 절에서 다룬다. 이 장은 신호 및 시스템에서 배운 복소수, LTI 시스템, 표본화, DFT를 짧게 되짚고, 개념마다 SDR 표본을 다룰 때 필요한 사실을 하나씩 뽑는다. 유도와 자세한 그림은 각 절에 연결한 신호 및 시스템 교재의 쪽에 있다.
복소수와 I/Q
SDR이 표본마다 넘겨주는 두 숫자 I와 Q는 어떻게 읽을까?
두 형식
복소수 하나는 실수 두 개를 담는다.
더하고 뺄 때는 직교형식 가, 곱하고 나눌 때는 극형식 가 편하다. 곱하면 크기는 곱해지고 각은 더해진다. 그래서 표본에 를 곱하면 크기는 그대로이고 각만 돈다. SDR 코드에서 위상을 맞추는 일은 이 곱셈 한 번이다. 자세한 내용: 신호 및 시스템 4장 직교형식과 극형식, 곱셈과 거듭제곱근.
Euler 공식과 회전
Euler 공식 에서 를 쓰면 De Moivre 공식 가 나오고, 를 넣으면 이다. Euler 공식의 유도는 신호 및 시스템 4장 극형식과 Euler 공식에 있다.
정현파는 회전하는 복소수의 실수부이다.
는 단위원 위를 1초에 바퀴 도는 점이다. 이면 반시계 방향, 이면 시계 방향으로 돈다. 음의 주파수는 도는 방향이 반대라는 뜻이다. 코사인은 두 방향의 회전을 절반씩 담는다.
그래서 와 는 같은 파형이고, 코사인만 재서는 도는 방향을 알 수 없다. 방향을 알려면 가로 좌표 와 세로 좌표 을 함께 재야 한다. I/Q 수신기가 하는 일이 이것이다.
아래 그림은 의 점과 그 두 좌표가 그리는 파형이다. 먼저 를 Hz와 Hz로 바꾸며 점이 도는 방향을 보고, 그다음 오른쪽 파형에서 바뀌는 것이 cos인지 sin인지 본다.
반지름 1인 원 위의 점 ej2πft와 가로 좌표 cos 2πft(파랑), 세로 좌표 sin 2πft(보라)이다. 신호 및 시스템 2장·4장의 그림을 그대로 썼다.
해 보기 · 누르면 위 그림이 그 상태로 바뀐다
- Hz에서 s의 점을 본다.
관찰
점이 45°에 있고 두 좌표는 모두 0.71이다. 점은 반시계 방향으로 돈다.
- Hz로 바꾼다.
관찰
점이 −45°에 있다. 가로 좌표(cos)는 0.71 그대로이고 세로 좌표(sin)만 −0.71로 부호가 바뀐다.
- Hz로 바꾼다.
관찰
같은 시각에 점이 90°에 있다. 주파수는 회전 속도이다.
위상의 모호성
위상은 의 정수배만큼 정해지지 않는다. np.angle은 로 접은 위상을 주고, np.unwrap은 이웃한 표본 사이의 변화가 보다 작다고 가정하고 를 더하거나 빼서 펼친다. 한 표본 사이에 반 바퀴 넘게 도는 신호는 접은 위상만으로 방향과 빠르기를 알 수 없다. 이것이 뒤에서 볼 aliasing과 같은 뿌리이다(신호 및 시스템 4장 정현파와 위상).
위상이 쓸모 있는 예가 GPS이다. L1 반송파는 1575.42 MHz라 파장이 cm이고, 거리를 재는 데 쓰는 C/A 부호는 위성마다 정해진 ±1의 수열이고, 그 값 하나가 이어지는 시간(칩)이 1/1.023 µs라 그동안 빛은 약 293 m 간다. 반송파 위상으로 거리를 재면 부호로 재는 것보다 훨씬 곱게 잴 수 있다. 대신 몇 번째 파장인지는 위상만으로 알 수 없다.
거듭제곱근과 직교
1의 제곱근 ()은 단위원을 등분한 점이다. 뒤의 DFT 행렬은 이 점들로만 이루어진다.
복소 지수끼리의 직교는 켤레를 붙인 내적으로 잰다. 켤레 없이 곱하면 처럼 서로 다른 두 주파수의 곱을 적분해도 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° 돌린다
강의 노트