REMI Lab강의 노트

Wireless Embedded Systems E05

6장 SDR과 ADALM-Pluto

한 번에 N개: 캡처와 USB

Pluto가 받은 표본은 끊김 없이 PC까지 올까?

초당 바이트 수

표본 하나는 I와 Q 두 개의 16비트 정수, 곧 4바이트이다. fs=20f_s=20 MS/s로 받으면 초당 80 MB가 생긴다. ADI는 Pluto의 USB 2.0이 표본을 하나도 잃지 않고 계속 보낼 수 있는 속도로 초당 4 MS를 밝힌다. 바이트로는 16 MB/s이다. 이것은 보장하는 값이지 한계가 아니다. 그보다 빠르면 PC와 USB 상태에 따라 표본을 잃을 수 있고, 실습실 PC에서 어디까지 되는지는 실습에서 잰다.

캡처: 한 번에 N개

그래서 높은 표본화율에서는 연속으로 흘려보내는 대신 한 번에 N개를 받는다. Pluto가 NN개를 fsf_s로 이어서 받아 메모리의 버퍼 하나에 채우고, 그 버퍼를 USB로 옮긴다. 이것을 캡처라고 부른다. 장치 안의 버퍼를 먼저 채운 뒤에 옮기므로, USB가 느려도 한 캡처 안의 표본은 이어져 있을 것으로 본다. 61.44 MS/s까지 캡처 안이 끊김 없는지는 실습에서 확인한다. 캡처와 캡처 사이에는 틈이 있다. 실습 쪽의 rx(n)과 pyadi-iio의 rx()도 이렇게 캡처 하나를 돌려준다.

캡처 하나는 3장에서 본 관측과 같다. 길이는 T=N/fsT=N/f_s이고, DFT 칸 간격은 Δf=fs/N=1/T\Delta f=f_s/N=1/T이다. fs=20f_s=20 MS/s로 N=216=65,536N=2^{16}=65{,}536개를 받으면 T=3.28T=3.28 ms, Δf=305\Delta f=305 Hz이다.

버퍼를 채우는 시간과 USB로 옮기는 시간은 어떻게 다를까? ▶로 한 단계씩 넘기며 먼저 표본이 버퍼에 차는 것을 보고, 그다음 USB로 옮기는 동안 받기가 멈추는 것을 본다. 그림은 캡처가 끝난 블록을 초당 4 MS로 옮기고, 옮기는 동안에는 받지 않으며, 분석과 그리기에는 시간이 들지 않는다고 가정한다.

합성 시간선이다. 한 단계는 받기 또는 옮기기의 4분의 1이며, 두 구간의 실제 시간은 다르다. 옮기는 시간은 ADI가 표본을 잃지 않는다고 밝힌 연속 전송 속도 초당 4 MS(16 MB/s)로 계산했다. 이 과목의 실습 쪽 드라이버는 장치 안 버퍼(커널 블록)를 하나만 두므로, 한 블록을 옮기는 동안 다음 캡처를 받지 않는다. 관측 비율은 이 가정에서 나온 값이지 위아래 한계가 아니다. 블록이 더 빨리 옮겨지면 커지고, 분석과 그리기 시간을 넣으면 작아진다. 실제 틈은 실습실 PC에서 잰다.

해 보기

  1. fs=20f_s=20 MS/s, N=216N=2^{16}에서 본다.
    관찰

    3.277 ms 동안 받고 16.384 ms 동안 옮긴다. 그림의 가정대로면 전체 시간의 16.7 %를 관측한다.

  2. fsf_s를 4 MS/s로 낮춘다.
    관찰

    받는 시간과 옮기는 시간이 16.384 ms로 같다. ADI가 표본을 잃지 않는다고 밝힌 속도가 이것이다. 이 표본화율 이하에서는 버퍼 여러 개로 받기와 옮기기를 겹쳐 끊김 없이 흘려보낼 수 있다. 버퍼를 하나만 두는 실습 쪽은 그렇게 하지 않는다.

  3. fs=20f_s=20 MS/s로 두고 NN을 2202^{20}으로 늘린다.
    관찰

    TT가 16배인 52.4 ms가 되고 Δf\Delta f는 16분의 1인 19.1 Hz가 된다. 그림의 가정에서 관측하는 비율은 fsf_s만으로 정해져 16.7 %로 그대로이다.

실습이 '설정 → 캡처 → 분석'인 이유

이 과목의 실습 쪽 스펙트럼 화면은 캡처를 초당 몇 번 되풀이해 그린다. 한 번 그린 스펙트럼은 캡처 하나의 것이고, 캡처 사이의 틈에 지나간 짧은 신호(예를 들어 짧은 Wi-Fi 패킷)는 화면에 나오지 않을 수 있다.

그래서 실습은 모두 같은 순서로 짠다. 먼저 LO, fsf_s, RF 대역폭, 이득을 설정하고, NN개를 캡처한 다음, 그 기록을 Python으로 분석한다. 3장의 NN, fsf_s, Δf\Delta f 관계가 캡처 하나에 그대로 쓰인다. 설정을 바꾼 직후의 첫 캡처에는 이전 설정으로 받은 표본이 섞여 나올 수 있다. 그래서 실습 쪽 드라이버는 설정을 바꾼 뒤의 첫 캡처를 버린다. 캡처마다 실제로 적용된 설정값도 다시 읽어 함께 기록한다.