실습 1. Pluto 기본
LO는 주파수의 기준, 표본화율은 보이는 범위와 칸 간격, 이득은 받은 I/Q의 크기를 정한다.
이 실습의 자리: Pluto 실습: 송수신기 이해 — 연결 점검에서 Pluto의 송수신을 확인했고, 이 실습은 LO·표본화율·이득을 바꾸며 받은 신호를 보고, 다음 실습 2에서 I와 Q 두 갈래의 불균형을 잰다.
준비
활동은 셋이다. 같은 톤의 시간 파형·I/Q 평면·스펙트럼을 보고, LO와 표본화율을 바꾸고, 이득을 올려 잘림을 관찰한다.
그림과 표 옆의 기록에 넣기를 누르고 글 상자에 설명을 쓴 뒤, 도구 막대의 저장을 누른다. 손잡이는 값을 고르는 장치이며, 값을 고른 뒤 받기를 눌러 새로 측정한다. 셀을 처음 실행할 때는 기본값으로 한 번 받는다.
연결 방식을 먼저 고른다. 모든 셀은 두 방식에서 그대로 돈다. 첫 셀의 MODE 한 줄만 바꾸면 된다.
루프백 (MODE = 'loopback') |
수신 전용 (MODE = 'receive') |
|
|---|---|---|
| 연결 | 내 Pluto의 TX → SMA 케이블 → 30 dB 감쇠기 → 같은 Pluto의 RX | RX에 안테나. 내 Pluto는 보내지 않는다 |
| 받는 신호 | 내가 보내는 복소 톤, 기저대역 +200 kHz (RF 2442.2 MHz) | 강의실 송신 Pluto가 보내는 목록의 cw: 2442.1 MHz(LO + 100 kHz)의 톤 |
| 송신 쪽 준비 | 없음 | 강의실 송신 Pluto(lab/transmit.html)가 cw를 보내는지 확인한다 |
루프백은 점검 화면에서 한 Pluto로 송신과 수신을 함께 할 수 있다고 확인된 경우에 쓴다. 그렇지 않으면 수신 전용으로 한다.
루프백은 케이블과 30 dB 감쇠기를 연결한 뒤 실행한다. 안테나로 송신하지 않는다. 송신 대역과 감쇠 제한은 도우미가 적용한다(송신 규칙).
세기는 dBFS로 읽는다. ADC 최대 크기의 복소 톤이 0 dBFS이다. 교정하지 않은 값은 dBm이 아니다. 캡처 하나 안의 표본은 이어지지만 캡처 사이의 위상은 이어지지 않는다.
장치 없이 할 때는 주소 끝에 ?device=fake를 붙인다. 합성 장치로 같은 셀을 돌릴 수 있고, 그림 제목과 기록에 "합성"이 붙는다. 합성 장치는 강의실 송신 신호 cw도 흉내 낸다(수신 전용 연습은 ?device=fake&signal=cw, 두 장치의 클럭 차까지 넣으려면 &ppm=2처럼). 합성 장치의 숫자는 칩을 흉내 낸 모형의 값이라, Pluto의 측정값으로 옮겨 적지 않는다.
MODE = 'loopback' # 수신 전용은 'receive'
from sdrlab import pluto, show, dsp
from sdrlab.front_end import ReceiverLab, rc_spectrum
import numpy as np
sdr = await pluto.connect()
await sdr.setup('rx-basic', mode=MODE)
lab = ReceiverLab(sdr, MODE)
활동 1. 같은 톤을 세 그림으로 보기
복소 톤 하나는 각 그림에서 어떻게 보일까? 양의 주파수로 도는 복소 톤은 LO 위에 실린다. I와 Q는 같은 진폭으로 흔들리되 꼭대기에 닿는 시각이 다르다. 두 값을 함께 그리면 원이 되고, 원 둘레의 두께는 잡음을 보여 준다. 루프백에서 봉우리가 LO 아래에 서면 송수신 I/Q의 부호를 확인하고 관찰한 방향을 기록한다.
수신기의 DC 오프셋과 LO 누설은 기저대역의 원점에 모이므로, 톤과 가운데 선을 구별한다. 수신 전용에서는 두 Pluto의 기준 클럭 차 때문에 봉우리가 설정한 자리에서 조금 벗어난다.
먼저 시간 파형에서 I와 Q의 꼭대기 시각을 보고, 그다음 I/Q 평면의 모양과 RF 스펙트럼의 봉우리를 본다. 수신 전용은 강의실 송신 Pluto가 cw를 보내는지 확인한다.
await show.control(lab.first, capture=True)
I와 Q의 꼭대기 시각은 어떻게 다르고, 두 값을 함께 그리면 어떤 모양인가? 스펙트럼의 톤은 LO의 어느 쪽에 있는가?
활동 2. LO와 표본화율로 축 바꾸기
RX LO를 올리면 봉우리는 어느 쪽으로 움직일까? LO는 RF 스펙트럼의 어느 자리를 기저대역의 원점에 놓을지 고른다. 수신기는 받은 신호에 를 곱하므로 봉우리의 자리는 이다. 톤의 RF 주파수가 고정되어 있으면 LO를 올린 만큼 기저대역 봉우리가 내려간다.
표본화율은 보이는 범위 와 칸 간격 을 정한다. 도우미는 표본화율이 바뀌어도 송신 톤의 RF 주파수를 유지한다.
먼저 LO 오프셋만 바꾸며 기저대역 봉우리와 표의 RF 주파수를 비교한다. 다음에는 표본화율을 바꾸며 시간 축과 주파수 축의 범위를 본다.
await show.control(
lab.axes,
capture=True,
offset_khz=show.slider(-300, 300, step=100, value=0, unit='kHz', label='LO 오프셋'),
rate_msps=show.choice([4, 8], value=4, unit='MS/s', label='표본화율'),
)
LO를 바꿀 때와 표본화율을 바꿀 때 축과 봉우리는 각각 어떻게 달라지는가?
활동 3. 이득과 잘림
이득을 계속 올리면 톤도 계속 커질까? 선형인 수신 경로에서는 이득을 올린 만큼 톤도 커진다. ADC 범위를 넘으면 I와 Q의 꼭대기가 잘리고 그 관계가 무너진다. 꼭대기가 잘린 파형은 정현파가 아니므로 고조파(harmonic), 곧 원래 주파수의 정수배 성분을 담는다. I와 Q를 복소수로 묶으면 고조파마다 도는 방향이 달라 , , 처럼 양쪽에 선이 나타난다.
RF 앞단의 압축도 세기를 선형 예측보다 작게 만든다. 잘린 표본이 없다면 고조파만으로 ADC 잘림을 판정하지 않는다.
먼저 낮은 이득의 파형과 표를 기록한다. 이득을 올려 받기를 누르고 꼭대기, 선형일 때의 예상 세기, 잘린 표본 비율을 차례로 본다. 가장 높은 이득에서도 잘리지 않으면 그 이득과 세기를 기록한다. 수신 전용은 강의실 송신 Pluto의 감쇠가 규칙 안에서 줄어든 뒤 다시 받거나, 포화 관찰을 건너뛰고 “잘리지 않음”으로 남긴다.
await show.control(
lab.gain_view,
capture=True,
gain=show.slider(18, 69, step=3, value=30, unit='dB', label='수신 이득'),
)
이득을 올린 만큼 톤의 세기도 올랐는가? 파형의 잘림과 스펙트럼의 새 선을 함께 근거로 들어 설명한다.
송신 끄기
await sdr.tx_stop()
print('송신을 멈췄습니다.' if MODE == 'loopback' else '수신 전용: 송신하지 않았습니다.')
탭을 닫기 전에 실행한다. 도구 막대의 송신 멈춤도 같은 일을 한다.
강의 노트