방향 찾기: CTE, IQ 표본, 안테나 전환
Bluetooth 5.1의 방향 찾기는 패킷 끝에 아무 정보도 없는 “한 음”을 길게 붙이는 데서 시작한다. 그 음을 여러 안테나로 번갈아 받으면, 안테나 위치 차이만큼 위상이 어긋나 보이고, 그 어긋남이 곧 각도다. 사양은 그 음의 모양(CTE), 언제 안테나를 바꾸고 언제 표본을 찍는지, 몇 개를 보고하는지까지만 정한다. 각도 계산은 호스트의 몫이고, 이 장은 가장 단순한 계산을 직접 해 본다.
- CTE의 길이, 보호·기준 구간, 전환·표본 슬롯을 그리고 IQ 표본 수를 셀 수 있다.
- AoA와 AoD에서 누가 안테나를 바꾸는지, 전환 패턴이 어떻게 반복되는지 안다.
- 기준 구간으로 톤의 회전을 재서 지우고, 안테나 사이 위상차로 각도를 구할 수 있다.
CTE의 모양
Constant Tone Extension(CTE)은 CRC 뒤에 붙는 화이트닝하지 않은 1의 연속이다. GFSK에서 1만 계속 보내면 반송파보다 일정하게 높은 주파수의 순수한 톤이 된다(LE 1M에서 편이 = 변조 지수 × 1 MHz ÷ 2라, 지수 0.5면 +250 kHz. 허용 범위 0.45~0.55면 225~275 kHz). CRC·MIC 계산에 들어가지 않고, 등시성 채널 패킷과 LE Coded PHY에는 붙지 않는다.
- 길이: 16~160 µs. 헤더의 CTEInfo에서 CTETime(8 µs 단위, 2~20)으로 알린다.
- 처음 4 µs 보호 구간, 다음 8 µs 기준 구간(첫 안테나로 1 µs마다 표본 8개).
- 그 뒤는 전환 슬롯과 표본 슬롯이 번갈아. 둘 다 2 µs(필수) 또는 1 µs(선택). 2 µs 표본 슬롯은 뒤쪽 1 µs에서 찍는 것이 권장된다.
- CTEType: 0 = AoA, 1 = AoD 1 µs 슬롯, 2 = AoD 2 µs 슬롯.
CTE 배치와 IQ 표본 수
CTE 위치·성질: [Vol 6] Part B §2.1.5 · 구조·슬롯: §2.5.1 · CTEInfo·CTEType(Table 2.42): §2.5.2 · 송신·IQ 표본 규칙: §2.5.3, §2.5.4 · 연결에서 CTE 요청: §5.1.12
누가 안테나를 바꾸나
| AoA (도착각) | AoD (출발각) | |
|---|---|---|
| 안테나 배열 | 받는 쪽(천장 로케이터 등) | 보내는 쪽(배열 비콘) |
| 전환 | 수신기가 표본 슬롯마다 | 송신기가, 수신기는 하나로 받음 |
| 각도 계산 | 로케이터(인프라) | 휴대폰 등 수신기(배열 배치를 알아야 함) |
패턴은 호스트가 HCI로 넣는다. 첫 안테나가 기준 구간, 둘째가 첫 표본 슬롯, 셋째가 둘째 슬롯… 패턴이 끝나면 처음부터 다시 쓰고, CTE가 먼저 끝나면 남은 항목은 버린다. 같은 안테나 ID가 여러 번 나와도 된다. 안테나는 보호 구간과 전환 슬롯에서만 바꾼다. 컨트롤러가 반드시 받아야 하는 패턴 길이는 안테나 2개면 1~4, 3개면 1~8, 4개 이상이면 1~12다.
눈을 감고 박수 소리가 어디서 나는지 아는 것은 두 귀에 소리가 아주 조금 다른 때에 닿기 때문이다. AoA는 귀가 여러 개인 로케이터가 “어느 귀에 먼저 닿았나”를 듣는 것이고, AoD는 소리를 내는 쪽이 입을 여러 개 갖고 차례로 내 주면 듣는 쪽이 하나의 귀로 계산하는 것이다. 다만 전파의 ‘먼저’는 시간이 아니라 위상으로 잰다.
안테나 전환 규칙과 패턴 길이(Table 5.1): [Vol 6] Part A §5.1 · 수신기 요구: §5.2 · HCI 안테나 전환 지원 기능: [Vol 6] Part B §4.6.20, §4.6.21
IQ 표본이 호스트에 오기까지
각도 계산은 호스트가 하므로, 컨트롤러가 찍은 IQ 표본은 HCI 이벤트로 올라온다. CTE를 받는 길은 둘이다. 연결 없이 주기적 광고에 붙은 CTE를 받거나(광고 쪽 AoD 비콘, 또는 태그가 보내는 AoA), 연결 안에서 상대에게 CTE를 달라고 요청한다.
| 보내는 쪽 (명령) | 받는 쪽 (명령 → 이벤트) | |
|---|---|---|
| 연결 없음 (주기적 광고) | Set Connectionless CTE Transmit Parameters 0x2051, … Enable 0x2052 | 주기적 광고에 동기 → Set Connectionless IQ Sampling Enable 0x2053 → Connectionless IQ Report 0x3E/0x15 |
| 연결 안 | Set Connection CTE Transmit Parameters 0x2055, CTE Response Enable 0x2057 | Set Connection CTE Receive Parameters 0x2054, CTE Request Enable 0x2056 → (LL_CTE_REQ/RSP) → Connection IQ Report 0x3E/0x16, 실패하면 CTE Request Failed 0x3E/0x17 |
안테나 전환 패턴은 받는 쪽(AoA) 또는 보내는 쪽(AoD) 명령의 Antenna_IDs[i]로 넣는다. 컨트롤러가 무엇을 할 수 있는지(지원하는 슬롯 길이, 안테나 수, 최대 패턴 길이, 최대 CTE 길이)는 LE Read Antenna Information 0x2058으로 먼저 묻는다.
IQ 보고 이벤트에는 표본 말고도 계산에 필요한 것이 함께 온다. 채널 번호(채널마다 파장이 조금 다르다), RSSI(0.1 dBm 단위)와 그것을 잰 안테나, CTE 종류와 슬롯 길이, 이벤트 카운터, 그리고 Packet_Status다. Packet_Status가 0x00이면 CRC가 맞은 패킷이다. 0x01·0x02는 CRC가 틀렸지만 CTE 위치를 짐작해 찍은 표본이라 버리는 편이 안전하고, 0xFF는 자원이 없어 못 찍었다는 뜻이다(표본 0개). 표본은 Sample_Count개(9~82)의 I와 Q가 각각 부호 있는 1바이트로 찍은 순서대로 오고, 0x80은 “유효한 표본 없음”이다.
IQ 보고 이벤트(0x15·0x16)의 파라미터, Sample_Count 9~82, 0x80, Packet_Status: [Vol 4] Part E §7.7.65.21·§7.7.65.22 · CTE 요청 실패 0x17: §7.7.65.23 · 명령 0x0051~0x0058: §7.8.80~§7.8.87
IQ 표본에서 각도로
IQ 표본은 그 순간 받은 신호의 진폭과 위상을 복소수 하나(I + jQ)로 적은 것이다. 같은 안테나에서도 톤이 반송파에서 벗어나 있으니 위상은 시간에 따라 계속 돈다(250 kHz면 1 µs에 90°). 그래서 계산은 두 단계다.
- 회전 지우기: 기준 구간 8개 표본은 같은 안테나라 위상 변화가 순전히 톤의 회전이다. 이웃 표본의 위상차 평균으로 1 µs당 회전 ω를 잰다. 실제 회전은 변조 지수 허용 범위(0.45~0.55)와 두 기기의 주파수 오차 때문에 정확히 90°가 아니므로 매번 재야 한다.
- 안테나 위상차: 표본 슬롯의 위상에서 ω × (경과 시간)을 빼면 안테나 위치 때문에 생긴 위상만 남는다. 간격 d의 일렬 배열에서 이웃 안테나 위상차 Δψ = 2π·d·sinθ ÷ λ, 따라서 θ = asin(Δψ·λ ÷ (2πd)). d = λ/2(2.44 GHz에서 약 6.1 cm)이면 θ = asin(Δψ ÷ π)이고, d가 이보다 크면 각도가 모호해진다.
LE 1M, 2 µs 슬롯이면 표본 슬롯은 4 µs마다 온다. 톤이 정확히 250 kHz라면 표본 슬롯 사이에 위상은 얼마나 돌까?
250 kHz × 4 µs.
4안테나 일렬 배열 AoA (이상적 신호)
IQ 표본 시점과 표본 창: [Vol 6] Part B §2.5.4 · 변조 지수 0.45~0.55: [Vol 6] Part A §3.1 · 각도 계산식은 배열 기하(사양 밖)
방향 두 개로 위치 구하기
AoA 로케이터 하나는 “태그가 어느 방향에 있는가”만 안다. 위치를 알려면 방향을 하나 더 얻으면 된다. 위치를 아는 로케이터 두 대가 같은 태그의 방향을 재면, 두 직선이 만나는 점이 태그다.
식으로 쓰면, 로케이터 사이 거리를 D, 기준선에서 잰 두 내각을 α, β라 할 때 태그는 기준선에서 y = D · tanα · tanβ ÷ (tanα + tanβ)만큼 떨어져 있고, 로케이터 1에서 기준선을 따라 x = y ÷ tanα에 있다. 그림의 예는 α = 60°, β = 180° − 120° = 60°이므로 y = 10 × 3 ÷ (2 × 1.732) = 8.66 m, x = 5 m다. 천장에 단 로케이터처럼 높이 h를 알면 방향 하나로도 된다. 연직에서 잰 각이 φ이면 바닥에서의 거리는 h · tanφ다. 다만 이런 계산을 하려면 방위각과 앙각을 함께 재는 2차원 배열이 필요하다. 이 계산과 배열의 기하는 사양 밖이다.
핵심 정리
- CTE = CRC 뒤의 화이트닝 없는 1의 연속, 16~160 µs(CTETime × 8 µs), LE Coded·등시성 채널에는 없음.
- 보호 4 µs, 기준 8 µs(표본 8개), 그다음 전환·표본 슬롯 1 µs 또는 2 µs. IQ 표본 9~82개.
- AoA는 수신기가, AoD는 송신기가 안테나를 바꾼다. 패턴은 첫 안테나가 기준 구간, 모자라면 처음부터 반복.
- 기준 구간으로 톤 회전을 재서 지우고, 이웃 안테나 위상차 Δψ = 2πd·sinθ/λ로 각도를 구한다. d ≤ λ/2여야 모호하지 않다.
- IQ 표본은 Connectionless IQ Report(0x3E/0x15)나 Connection IQ Report(0x3E/0x16)로 온다. I·Q는 부호 있는 1바이트씩 9~82쌍이고, Packet_Status가 0x00(CRC 맞음)인 것만 믿는다.
- 방향 하나는 직선 하나다. 로케이터 둘의 방향선이 만나는 점이 위치이고, 각도 오차는 거리에 비례하는 위치 오차가 된다.
확인 퀴즈
CTETime이 10이고 1 µs 슬롯이면 IQ 표본은 모두 몇 개?
AoD CTE를 받는 수신기는?
패턴이 1-2-3이고 표본 슬롯이 5개다. 다섯 번째 표본 슬롯의 안테나는?
λ/2 간격 배열에서 이웃 안테나 위상차가 90°였다. 각도는?
Connection IQ Report의 Packet_Status가 0x01이다. 이 표본은?