실습 5. 스펙트럼 모니터링
실제 전파는 버스트와 연속 반송파로 보이고, 스펙트로그램의 프레임 길이 N은 시간과 주파수의 해상도를 맞바꾼다.
이 실습의 자리: Pluto 실습: 실제 신호 — 실습 4의 비트 복원에서 주변 전파 관찰로 넘어가며, 다음 실습 6에서 LTE를 기준으로 수신기의 주파수 오차를 잰다.
준비
Wi-Fi의 버스트, LTE 반송파의 폭, LO를 옮기며 받은 대역 스윕을 차례로 관찰한다. 함수를 새로 쓰는 활동은 없으며, 손잡이를 바꾼 뒤 받기를 눌러 비교한다. 그림과 표 옆의 기록에 넣기 단추로 결과를 모으고, 글 상자에 설명을 쓴 뒤 도구 막대의 저장을 누른다.
- RX에 안테나를 단다. 이 실습은 수신만 하며 TX를 멈추고 감쇠를 최대로 둔다.
- 세기는 ADC 전폭 기준인 dBFS로 읽는다. 교정한 dBm이 아니므로 같은 수신 이득의 값끼리 비교한다. 전폭에 가까우면 이득을 낮춘다.
- 순정 Pluto(AD9363)의 수신 범위는 325 MHz–3.8 GHz, RF 대역폭은 최대 20 MHz이다. 5 GHz Wi-Fi와 FM 방송(88–108 MHz)은 범위 밖이다.
?device=fake에서는 도우미가 만든 합성 Wi-Fi·LTE를 합성 장치의 잡음에 더한다. 실제 전파나 실제 프로토콜 복호 결과가 아니다.
이론은 3장 표본 수와 주파수 간격, 시간에 따라 바뀌는 신호, 수신기의 DC 오프셋을 따른다.
from sdrlab import pluto, show, spectrumlab
sdr = await pluto.connect()
await sdr.setup('spectrum-wifi', mode='receive')
LTE_CENTER = 1842.5e6 # Hz. 합성 예제값. 실제 반송파 중심은 실습실에서 확인한다.
활동 1. Wi-Fi의 버스트와 프레임 길이
Wi-Fi 신호는 왜 나타났다 사라질까? 버스트(burst)는 짧은 시간 동안 이어지는 신호 묶음이다. Wi-Fi는 패킷을 보낼 때 채널을 채우고 그 사이에는 쉼이 있다. 거리와 출력이 다르면 띠의 밝기도 다르다. 가운데의 가는 선은 패킷이 아니라 수신기의 DC일 수 있다. 합성 예제는 일정한 세기의 버스트를 쓰므로 실제 패킷의 모든 모양을 나타내지는 않는다.
스펙트로그램(spectrogram)은 짧은 구간마다 구한 스펙트럼을 시각 순서로 늘어놓은 그림이다. 프레임 길이가 N이면 칸 간격은 , 한 프레임이 담는 시간은 이다. N이 작으면 버스트 경계와 짧은 쉼이 잘 보이지만 가까운 주파수가 섞인다. N이 크면 주파수 칸은 촘촘해지지만 시작과 끝이 같은 프레임에 섞여 번진다. 같은 N에서 표본화율을 낮추면 시간은 길어지고 볼 수 있는 대역은 좁아진다.
먼저 같은 채널에서 N만 바꾸어 버스트 경계를 본다. 그다음 주파수 방향의 모양과 표의 눈금을 비교한다. 기본 N=256에서는 칸 간격 97.65625 kHz, 프레임 시간 10.24 µs이다. 새로 받기를 누를 때 실제 전파도 달라질 수 있으므로 창 길이의 영향과 구분한다.
async def draw_wifi(channel, N):
global wifi_result
wifi_result = await spectrumlab.wifi(sdr, channel, N)
await show.control(
draw_wifi,
channel=show.choice([1, 6, 11], value=6, label='Wi-Fi 채널'),
N=show.choice([32, 256, 2048], value=256, label='프레임 길이 N'),
capture=True,
)
Wi-Fi 채널 중심의 간격보다 채널 폭이 넓어 이웃 채널은 겹친다. 선택 목록은 서로 겹치지 않는 채널 조합이다. 한 채널을 온전히 담도록 표본화율과 RF 대역폭을 설정했지만, 실제 수신 필터가 가장자리를 얼마나 줄이는지는 실습 3에서 잰 값도 함께 본다.
어느 N에서 짧은 쉼이 더 잘 보이고, 어느 N에서 주파수 모양이 더 잘 보이는가? 항상 켜진 가는 선과 넓은 버스트를 어떻게 구별했는가?
활동 2. LTE 반송파의 폭
평균 스펙트럼의 폭은 채널 대역폭과 같을까? LTE는 부반송파(subcarrier), 즉 일정한 간격의 톤들에 정보를 나누어 싣는 OFDM(orthogonal frequency division multiplexing)을 쓴다. 채널 가장자리에는 비워 둔 보호 대역(guard band)이 있어 실제 신호가 차지하는 폭과 채널 대역폭은 다르다. 도우미가 보여 주는 표에서 부반송파 수와 간격으로 구한 사용 폭을 채널 대역폭과 비교한다. 합성 예제의 사용 폭은 약 9 MHz이며 10 MHz 채널을 흉내 낸다.
기지국은 데이터가 없어도 기준 신호를 계속 보내므로 Wi-Fi와 달리 반송파가 지속해서 보인다. 평균 스펙트럼은 짧은 구간마다 구한 전력을 평균한다. 잡음의 들쭉날쭉함은 줄지만 시간 정보는 사라진다. 실내 반사파 때문에 꼭대기가 울퉁불퉁할 수 있으며 수신 필터가 가장자리의 세기를 낮출 수도 있다.
LTE_CENTER는 실습실에서 확인한 중심으로 바꾼다. 먼저 반송파의 양 끝을 눈으로 읽고, 그다음 문턱으로 잰 폭과 비교한다. 도우미는 바닥과 꼭대기 사이 문턱을 넘는 바깥 두 칸으로 폭을 잰다. 이웃 반송파까지 한 덩어리로 들어가면 중심을 다시 맞춘다. 폭만으로 LTE라고 확정하거나 정확한 채널 설정을 복호했다고 말할 수는 없다.
async def draw_lte():
global lte_result
lte_result = await spectrumlab.lte(sdr, LTE_CENTER)
await show.control(draw_lte, capture=True)
수업 시간에 LTE 실측 화면을 함께 본다. 연구실 HURA EdgeRF 장비가 받은 LTE 하향 신호의 스펙트로그램·전력 스펙트럼·워터폴과 셀의 기본 정보 복호 결과가 나온다. 이 활동에서 읽은 폭과 그 화면의 대역폭을 비교한다.
신호가 차지하는 폭과 채널 대역폭이 다른 이유는 무엇인가? 문턱으로 잰 폭에 이웃 신호나 수신 필터가 영향을 주었는지 그림으로 설명한다.
활동 3. LO를 옮기며 대역 이어 붙이기
한 번에 담을 수 없는 넓은 대역은 어떻게 볼까? LO를 옮기며 받은 조각마다 평균 스펙트럼을 구해 이어 붙인다. 수신 필터의 가장자리 영향을 줄이려고 각 조각의 가운데 부분만 쓰고, LO에 서는 DC 성분 둘레는 비운다.
각 조각은 서로 다른 시각의 캡처다. 한 채널이 조각 경계에 걸리면 왼쪽과 오른쪽이 다른 순간을 나타낸다. 평균 높이에는 그동안 버스트가 켜져 있던 시간도 들어 있다. 그러므로 이 그림은 짧은 버스트들이 동시에 있었는지 알려 주지 않는다.
먼저 표에서 조각별 캡처 시각을 보고, 그다음 색이 바뀌는 경계의 높이를 본다. 받기를 다시 눌러도 경계가 같은 모양인지 비교한다.
async def draw_sweep():
global sweep_result
sweep_result = await spectrumlab.sweep(sdr)
await show.control(draw_sweep, capture=True)
조각 경계에서 높이가 달라진 까닭으로 무엇을 생각할 수 있는가? 이 그림으로 두 버스트가 동시에 있었다고 말할 수 없는 이유는 무엇인가?
강의 노트