XAP — Xylolabs Audio Protocol 명세서¶
특허 출원 중 — XAP (Xylolabs Audio Protocol) / XMBP (Xylolabs Metadata Binary Protocol)는 Xylolabs Inc.의 독점 기술이다. 특허 출원이 진행 중이다. 무단 사용, 복제 또는 배포를 금한다.
개정: 2026-03-27
목차¶
1. 개요¶
XAP (Xylolabs Audio Protocol)는 Xylolabs의 독점 MDCT 기반 스펙트럼 오디오 코덱이다. 자원이 제한된 IoT 및 산업용 모니터링 하드웨어에서 다채널 오디오의 실시간 압축을 위해 설계되었다.
주요 속성¶
| 속성 | 값 |
|---|---|
| 변환 | Modified Discrete Cosine Transform (MDCT) |
| 샘플링 레이트 | 8, 16, 24, 32, 48, 96 kHz |
| 채널 수 | 1–4 (독립 인코딩) |
| 프레임 지속시간 | 7.5 ms, 10 ms |
| 압축 비율 | 8:1–10:1 (비트레이트에 따라 다름) |
| 비트레이트 범위 | 채널당 16–320 kbps |
| 일반적인 비트레이트 | 채널당 64–80 kbps |
| 알고리즘 지연 | 7.5–10 ms (1 프레임) |
| CPU 요구사항 | 채널당 약 10 MIPS (DSP 가속 사용 시) |
| 채널당 RAM | 인코더 상태 약 8 KB |
| 코덱 ID (XMBP) | 0x03 |
설계 목표¶
XAP는 다음의 제약 조건을 갖는 산업용 오디오 모니터링 애플리케이션을 위해 설계되었다:
- MCU 인코딩, 서버 디코딩: 인코더는 운영 체제 없이 베어메탈 또는 RTOS 기반 MCU에서 동작한다. 디코더는 자원 제약 없이 서버에서 동작한다.
- LTE-M1 대역폭 예산: 96 kHz 4채널이 지속적인 업링크 약 30–40 KB/s 이내에 맞아야 한다. 채널당 64–80 kbps(총 32–40 KB/s)로 달성된다.
- 동적 메모리 할당 없음: 인코더는 정적으로 할당된 버퍼만 사용한다. 모든 상태는 하나의
XapEncoder구조체 안에 들어간다. - FPU/DSP 가속: XAP는 하드웨어 부동소수점 장치가 필요하며, ARM DSP 확장 또는 SIMD 명령어 세트로 크게 가속된다. FPU가 없는 플랫폼은 IMA-ADPCM을 사용해야 한다.
2. 인코더 아키텍처¶
2.1 신호 흐름¶
Interleaved PCM input (i16[])
|
v
De-interleave
(per-channel extraction)
|
v
MDCT Forward Transform
N samples --> N/2 spectral coefficients
|
v
Adaptive Quantization
(step size derived from mean absolute coefficient)
|
v
Coefficient Packing
(2-byte quant header + 8-bit quantized coefficients)
|
v
XAP Frame Output
(5-byte frame header + per-channel payloads)
각 채널은 독립적으로 인코딩된다. 인코더는 인터리브된 다채널 PCM 입력을 받아 각 채널의 샘플을 연속적인 모노 버퍼로 추출하고, MDCT를 적용한 다음, 결과로 생성된 스펙트럼 계수를 양자화하여 출력 프레임에 패킹한다.
2.2 MDCT 순변환¶
Modified Discrete Cosine Transform은 N개의 시간 영역 PCM 샘플을 N/2개의 주파수 영역 스펙트럼 계수로 변환한다. 기저 함수는 다음과 같다:
X[k] = sum_{n=0}^{N-1} x[n] * cos(pi/N * (n + 0.5 + N/4) * (k + 0.5))
where:
N = frame_samples (number of PCM samples per channel per frame)
k = coefficient index, 0 <= k < N/2
n = sample index, 0 <= n < N
이 변환은 프레임의 스펙트럼 에너지를 나타내는 N/2개의 실수값 계수를 생성한다.
사전 계산된 코사인 테이블¶
N <= 320인 프레임 크기(10 ms 기준 최대 32 kHz, 7.5 ms 기준 최대 24 kHz)에서는 인코더가 초기화 시 고정소수점 코사인 테이블을 사전 계산한다:
테이블 크기: (N/2) x N 개의 i32 항목. 최대 크기: 320 샘플 → 51,200 항목 → 200 KB.
사전 계산된 테이블을 사용하면 MDCT 내부 루프가 삼각함수 호출 없이 고정소수점 곱셈-누산으로 줄어들어 매우 낮은 상수 오버헤드로 O(N²) 곱셈이 수행된다. M-시리즈 호스트에서 측정된 인코딩 시간:
| 샘플링 레이트 | 프레임 샘플 수 | 테이블 사용 여부 | 인코딩 시간 (1ch, 10ms) |
|---|---|---|---|
| 8 kHz | 80 | 예 | 0.5 µs |
| 16 kHz | 160 | 예 | 1.1 µs |
| 24 kHz | 240 | 예 | 1.9 µs |
| 32 kHz | 320 | 예 (한계) | 3.0 µs |
| 48 kHz | 480 | 아니오 | 512.3 µs |
| 96 kHz | 960 | 아니오 | 1954.0 µs |
48 kHz에서 나타나는 170배의 불연속(소프트웨어 폴백 경로)은 MCU 타겟에서 DSP 가속 MDCT 경로를 통해 해소된다(5절 참조).
스택 할당 주의사항¶
XapEncoder는 200 KB 코사인 테이블을 포함한다. 임베디드 타겟에서는 스택이 아닌 static 변수에 인코더를 할당해야 한다. 테이블은 frame_samples <= 320일 때만 채워진다.
2.3 적응형 양자화¶
MDCT 이후 각 계수 X[k]는 적응형 스텝 크기를 사용하여 부호 있는 8비트 정수로 양자화된다:
스텝 크기 결정:
스텝 크기는 각 프레임의 신호 레벨에 맞게 적응하여 실제 계수 크기 전반에 걸쳐 가용 양자화 범위를 분배한다. 소리가 큰 프레임에는 더 큰 스텝 크기가, 조용한 프레임에는 더 작은 스텝 크기가 사용된다.
양자화:
양자화 후 표현 가능한 범위를 초과하는 계수는 [-128, 127]로 클리핑된다.
2.4 채널별 예산 할당¶
전체 프레임 페이로드는 5바이트 프레임 헤더를 뺀 후 채널 수로 균등하게 분배된다:
각 채널의 패킹된 출력은 정확히 per_ch_budget 바이트까지 제로 패딩되어 프레이밍 오버헤드 없이 스트리밍에 적합한 고정 크기 프레임을 생성한다.
3. 프레임 와이어 포맷¶
3.1 프레임 헤더 (5바이트)¶
모든 XAP 프레임은 빅엔디언 바이트 순서의 5바이트 고정 헤더로 시작한다:
Offset Size Field Type Description
------ ---- ----------- ------ ------------------------------------------
0 2 frame_samples u16 BE PCM samples per channel in this frame
2 1 channels u8 Number of channels (1–4)
3 2 frame_bytes u16 BE Total frame size including this header
0 1 2 3 4
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| frame_samples (u16 BE) | channels | frame_bytes (u16 BE)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
^-- continues byte 3..4 -->
3.2 채널별 페이로드¶
프레임 헤더 바로 다음에 페이로드는 channels개의 순차적인 채널 블록을 포함하며, 각각 정확히 per_ch_budget 바이트이다. 각 채널 블록 내부:
Offset Size Field Type Description
------ ---- ----------- ------ ------------------------------------------
0 2 step_size u16 BE Quantization step size for this channel
2 N coeffs[] i8[] Quantized MDCT coefficients (up to per_ch_budget - 2)
패킹되는 계수 바이트 수는 min(N/2, per_ch_budget - 2)이다. 패킹된 계수 수가 per_ch_budget - 2보다 적으면 나머지 바이트는 고정 프레임 크기를 유지하기 위해 제로 패딩된다.
3.3 전체 프레임 구조¶
[frame_samples: 2B][channels: 1B][frame_bytes: 2B] <- 5-byte header
[step_ch0: 2B][q0[0], q0[1], ..., q0[M-1]] <- channel 0 block (per_ch_budget bytes)
[step_ch1: 2B][q1[0], q1[1], ..., q1[M-1]] <- channel 1 block (per_ch_budget bytes)
...
[step_chN: 2B][qN[0], qN[1], ..., qN[M-1]] <- channel N block (per_ch_budget bytes)
where M = per_ch_budget - 2 (coefficient bytes per channel)
3.4 XMBP에서의 코덱 ID¶
XMBP (Xylolabs Metadata Batch Protocol) 엔벨로프 안에 실려 전송될 때, XAP 오디오 스트림은 코덱 식별자 0x03을 사용한다. XMBP 스트림 헤더가 페이로드를 XAP 인코딩된 오디오로 식별하며, 수신자는 각 프레임에 대해 XAP 디코더를 호출한다. XMBP 엔벨로프의 전체 와이어 포맷은 XMBP-SPECIFICATION.md를 참조한다.
4. 설정¶
4.1 XapConfig 필드¶
XapConfig 구조체는 모든 인코더 동작을 제어한다:
pub struct XapConfig {
/// Sample rate in Hz.
/// Supported: 8000, 16000, 24000, 32000, 48000, 96000
pub sample_rate: u32,
/// Frame duration in microseconds.
/// Supported: 7500 (7.5 ms) or 10000 (10 ms)
pub frame_duration: u32,
/// Target bitrate in bits/sec per channel.
/// 0 = auto (~8:1 compression ratio).
/// Valid range when non-zero: 16000–320000 bps
pub bitrate: u32,
/// Number of audio channels. Range: 1–4.
pub channels: u8,
}
4.2 지원 샘플링 레이트¶
| 샘플링 레이트 | 프레임 샘플 수 (7.5 ms) | 프레임 샘플 수 (10 ms) | 코사인 테이블 사용 |
|---|---|---|---|
| 8,000 Hz | 60 | 80 | 예 |
| 16,000 Hz | 120 | 160 | 예 |
| 24,000 Hz | 180 | 240 | 예 |
| 32,000 Hz | 240 | 320 | 예 (한계) |
| 44,100 Hz | — | — | 지원하지 않음 |
| 48,000 Hz | 360 | 480 | 아니오 (런타임 cosf) |
| 96,000 Hz | 720 | 960 | 아니오 (런타임 cosf) |
44.1 kHz는 지원하지 않는다. 96 kHz까지의 다른 모든 표준 전문 레이트는 지원된다.
4.3 비트레이트와 압축¶
| 비트레이트 (채널당) | 압축 비율 | 일반적인 용도 |
|---|---|---|
| 16–32 kbps | 약 12:1–24:1 | 대역폭이 매우 제한된 경우 |
| 64 kbps | 약 10:1 | 표준 산업용 모니터링 (권장) |
| 80 kbps | 약 8:1 | 방송 수준 품질 |
| 128 kbps | 약 5:1 | 고음질 모니터링 |
| 320 kbps | 약 2:1 | 무손실에 가까운 품질 |
bitrate = 0이면 인코더는 PCM 프레임 크기 기준 약 8:1 압축을 목표로 한다.
비트레이트에서 프레임 바이트 계산:
4.4 기본 설정¶
XapEncoder::new_default(sample_rate) 생성자의 SDK 기본값:
XapConfig {
sample_rate: <caller-supplied>,
frame_duration: 10_000, // 10 ms
bitrate: 64_000, // 64 kbps per channel
channels: 1,
}
SDK 레벨 Config 기본값은 audio_sample_rate = 16_000, audio_channels = 4, audio_batch_ms = 500을 사용한다.
5. 플랫폼 요구사항¶
5.1 필수: 하드웨어 FPU¶
XAP는 하드웨어 부동소수점 장치가 필요하다. MDCT 계산은 단정밀도 부동소수점 연산(f32)을 사용한다. FPU가 없는 플랫폼은 IMA-ADPCM을 사용해야 한다.
최소 지원 코어: ARM Cortex-M4F 또는 동급 (단정밀도 FPU + DSP 확장).
FPU가 없는 플랫폼(Cortex-M0+, Cortex-M3, F 확장 없는 RISC-V)은 XAP를 실행할 수 없다. 해당 타겟에서는 features = ["adpcm"]을 사용한다.
5.2 권장: DSP 확장¶
DSP 확장(ARM SMLAD/SMLAL 포화 MAC, 또는 Xtensa PIE SIMD)은 MDCT 계산 비용을 크게 줄여준다:
| DSP 아키텍처 | 플랫폼 | 메커니즘 | XAP 속도 향상 |
|---|---|---|---|
| ARMv8-M DSP (Cortex-M33) | RP2350, nRF9160 | 듀얼 16x16 MAC (SMLAD), 포화 산술 |
약 30% |
| Cortex-M4F FPU+DSP | STM32F411, STM32WB55, nRF52840 | 하드웨어 float MAC + arm_rfft_fast_f32 (MDCT 3–5배) |
약 35–40% |
| Xtensa PIE SIMD (ESP32-S3) | ESP32-S3 | 128비트 SIMD: 명령어당 4x f32 또는 8x i16 | 약 60% |
| 없음 | RP2040, ESP32-C3, STM32F103 | 소프트웨어 곱셈만 | 0% (XAP 불가) |
5.3 자원 표¶
일반적인 설정에 대한 인코더 상태 및 버퍼 요구사항 (인코더 인스턴스당):
| 설정 | XAP 인코더 상태 | 코사인 테이블 | 링 버퍼 | XMBP 프레임 | 합계 |
|---|---|---|---|---|---|
| 1ch @16kHz, 10ms | 약 1 KB | 10 KB | 4 KB | 2 KB | 약 17 KB |
| 4ch @16kHz, 10ms | 약 4 KB | 10 KB | 16 KB | 4 KB | 약 34 KB |
| 4ch @48kHz, 10ms | 약 4 KB | — | 32 KB | 8 KB | 약 44 KB |
| 4ch @96kHz, 10ms | 약 4 KB | — | 64 KB | 8 KB | 약 76 KB |
코사인 테이블(최대 200 KB, N <= 320)은 XapEncoder 구조체에 내장된다. 48 kHz 이상(N > 320)에서는 코사인 테이블이 할당되지 않으며, 인코더는 호스트에서 런타임 계산으로 폴백하거나 MCU 타겟에서 DSP 가속 FFT를 사용한다.
5.4 DSP 가속 세부사항¶
ARM Cortex-M33/M4F — CMSIS-DSP¶
Cargo 기능 cmsis-dsp 또는 C 정의 XYLOLABS_USE_CMSIS_DSP=1로 활성화:
- MDCT 순방향 경로는
SMLAD(Cortex-M33 고정소수점) 또는arm_rfft_fast_f32(Cortex-M4F 부동소수점)를 사용하는 듀얼 MAC 내부 루프로 디스패치된다. - 듀얼 16x16 곱셈-누산을 사용하여 반복당 두 샘플을 처리한다.
- 포화 산술(
QADD,SSAT)로 분기 기반 계수 클리핑을 없앤다. - 속도 향상: MDCT 계산 시간 30–40% 단축 (4ch @96kHz에서 30–60 MIPS 절감).
Xtensa LX7 — ESP32-S3 PIE SIMD¶
Cargo 기능 esp32-simd 또는 C 정의 XYLOLABS_USE_ESP32S3_SIMD=1로 활성화:
- MDCT 내부 루프는 128비트 벡터 레지스터를 사용하여 반복당 4개 샘플을 처리한다.
- 실제 하드웨어에서 ESP32-S3 PIE (Processor Instruction Extensions) 벡터 연산에 매핑된다.
- 하드웨어 AES/SHA가 메인 CPU에서 TLS를 오프로드하여 코덱에 추가 사이클을 확보한다.
- 속도 향상: 전체 XAP CPU 사용률 최대 60% 감소 (4ch @96kHz에서 MDCT 50 → 20 MIPS).
6. 플랫폼 호환성 매트릭스¶
번인 테스트 측정 MIPS 프로파일 및 플랫폼 데이터시트를 기반으로 평가되었다. CPU%는 최대 지원 오디오 설정(코덱 + I/O + 전송 + 센서 + 유지보수)에 대한 전체 시스템 사용률을 나타낸다.
| 타겟 | 코어 | 클록 | SRAM | DSP/FPU | 최대 오디오 설정 | CPU% | RAM% | 판정 |
|---|---|---|---|---|---|---|---|---|
| RP2350 (Pico 2) | Cortex-M33 | 150 MHz | 520 KB | M33 DSP+FPU | 4ch @96kHz XAP | 46.0% | 16.9% | COMFORTABLE |
| ESP32-S3 | Xtensa LX7 | 240 MHz | 512 KB + 8 MB PSRAM | PIE SIMD+FPU | 4ch @96kHz XAP | 17.7% | 24.2% | COMFORTABLE |
| STM32F411 | Cortex-M4F | 100 MHz | 128 KB | M4F DSP+FPU | 4ch @48kHz XAP | 40.0% | 34.4% | FEASIBLE |
| nRF52840 | Cortex-M4F | 64 MHz | 256 KB | M4F DSP+FPU | 2ch @48kHz XAP | 42.2% | 21.9% | FEASIBLE |
| nRF9160 | Cortex-M33 | 64 MHz | 256 KB | M33 DSP+FPU | 2ch @48kHz XAP | 44.5% | 21.9% | FEASIBLE |
| STM32WB55 | Cortex-M4F | 64 MHz | 256 KB | M4F DSP+FPU | 2ch @48kHz XAP | 42.2% | 17.2% | FEASIBLE |
| RP2040 (Pico) | Cortex-M0+ | 133 MHz | 264 KB | 없음 | ADPCM 4ch @96kHz | 3.0% | 12.1% | ADPCM ONLY |
| ESP32-C3 | RISC-V | 160 MHz | 400 KB | M ext만 | ADPCM 4ch @96kHz | 2.5% | 8.0% | ADPCM ONLY |
| STM32F103 | Cortex-M3 | 72 MHz | 20 KB | 없음 | ADPCM 2ch @24kHz | 1.4% | 80.0% | SENSOR ONLY |
판정 정의:
| 판정 | CPU 사용률 | 의미 |
|---|---|---|
| COMFORTABLE | 50% 미만 | OTA 업데이트, 추가 처리, 또는 향후 기능을 위한 충분한 여유가 있다. |
| FEASIBLE | 50–70% | 신중한 태스크 스케줄링으로 안정적인 운영이 가능하다. |
| TIGHT | 70–85% | 동작은 가능하지만 최악의 경우 인터럽트 지연 시 지터가 발생할 수 있다. |
| MARGINAL | 85–100% | 부하 시 프레임 드롭 위험. 프로덕션에 권장하지 않는다. |
| ADPCM ONLY | N/A | DSP/FPU 없음. XAP 인코더를 실행할 수 없다. IMA-ADPCM 4:1 압축만 가능하다. |
| SENSOR ONLY | N/A | 극도의 SRAM 제약. 최소 ADPCM(1–2ch)과 센서 텔레메트리만 가능하다. |
6.1 상세 CPU 예산 — RP2350 (4ch XAP @96kHz)¶
150 MHz 듀얼코어 Cortex-M33. 코어 0: I2S DMA + XAP 인코딩. 코어 1: XMBP + HTTP + 센서.
| 구성요소 | 기준 MIPS | DSP 적용 MIPS | 150 MHz 대비 % |
|---|---|---|---|
| I2S DMA 처리 | 2 | 2 | 1.3% |
| XAP MDCT 순변환 | 50 | 35 | 23.3% |
| XAP 양자화+패킹 | 15 | 10 | 6.7% |
| XMBP 배치 인코딩 | 5 | 5 | 3.3% |
| HTTP 전송 | 10 | 10 | 6.7% |
| 센서 샘플링 (26ch) | 5 | 5 | 3.3% |
| 워치독 + 유지보수 | 2 | 2 | 1.3% |
| 합계 | 89 | 69 | 46.0% |
| 가용 여유 | 61 | 81 | 54.0% |
6.2 상세 CPU 예산 — ESP32-S3 (4ch XAP @96kHz)¶
240 MHz 듀얼코어 Xtensa LX7 (총 480 MIPS).
| 구성요소 | 기준 MIPS | PIE 적용 MIPS | 480 MHz 대비 % |
|---|---|---|---|
| I2S DMA 처리 | 2 | 2 | 0.4% |
| XAP MDCT 순변환 | 50 | 20 | 4.2% |
| XAP 양자화+패킹 | 15 | 6 | 1.3% |
| WiFi 스택 (FreeRTOS) | 30 | 30 | 6.3% |
| XMBP 배치 인코딩 | 5 | 5 | 1.0% |
| HTTP/TLS 전송 | 20 | 12 | 2.5% |
| 센서 샘플링 (26ch) | 5 | 5 | 1.0% |
| PSRAM DMA 관리 | 3 | 3 | 0.6% |
| 워치독 + 유지보수 | 2 | 2 | 0.4% |
| 합계 | 132 | 85 | 17.7% |
| 가용 여유 | 348 | 395 | 82.3% |
7. 오디오 품질 특성¶
7.1 비트레이트별 지각적 품질¶
| 비트레이트 (채널당) | 품질 수준 | 설명 |
|---|---|---|
| 16–32 kbps | 기본 | 인식 가능한 오디오. 고주파수에서 상당한 스펙트럼 아티팩트 발생. 음성 모니터링에 적합하다. |
| 48 kbps | 양호 | 광대역 모니터링에 허용 가능. 12 kHz 이상에서 경미한 아티팩트 발생. |
| 64 kbps | 투명에 가까움 | 대부분의 산업용 모니터링 애플리케이션에서 지각적으로 투명하다. 권장 기본값. |
| 80 kbps | 방송 수준 | 블라인드 테스트에서 원본과 구별 불가. 48 kHz까지 전 스펙트럼 충실도 달성. |
| 128+ kbps | 고음질 | 레퍼런스 품질. 전체 스펙트럼 콘텐츠 보존. |
7.2 지연¶
XAP는 정확히 1 프레임의 알고리즘 지연을 발생시킨다:
| 프레임 지속시간 | 알고리즘 지연 |
|---|---|
| 7.5 ms | 7.5 ms |
| 10 ms | 10 ms |
인코더에는 룩어헤드 또는 오버랩 버퍼가 없다. 엔드투엔드 지연은 프레임 지속시간과 네트워크 전송 시간의 합으로 결정된다. 실시간 모니터링 대시보드의 경우, 인코딩 윈도우가 길어 MCU 인터럽트 지터에 대한 여유가 더 크므로 10 ms 프레임 지속시간을 권장한다.
7.3 채널 스케일링¶
XAP는 프레임당 오버헤드 분산으로 인해 채널 수에 대해 선형 이하로 스케일된다:
| 채널 수 @16kHz | 인코딩 시간 (호스트) | 채널당 | 스케일링 인수 |
|---|---|---|---|
| 1 | 1.0 µs | 1.0 µs | 1.00x |
| 2 | 1.9 µs | 1.0 µs | 1.90x |
| 3 | 2.8 µs | 0.9 µs | 2.80x |
| 4 | 3.7 µs | 0.9 µs | 3.70x |
채널당 약 8%의 선형 이하 효율 향상은 분산된 프레임 헤더 쓰기 및 디인터리브 오버헤드에서 비롯된다. 채널당 MDCT 비용이 지배적이다.
8. SDK 통합¶
8.1 Rust SDK¶
Cargo.toml의 xylolabs-sdk 의존성에 xap 기능을 추가한다. DSP 가속 타겟의 경우 적절한 DSP 기능도 함께 활성화한다:
# RP2350 / nRF9160 (Cortex-M33) — CMSIS-DSP fixed-point path
xylolabs-sdk = { path = "../../crates/xylolabs-sdk", features = ["xap", "cmsis-dsp"] }
# STM32F411 / nRF52840 / STM32WB55 (Cortex-M4F) — CMSIS-DSP floating-point path
xylolabs-sdk = { path = "../../crates/xylolabs-sdk", features = ["xap", "cmsis-dsp"] }
# ESP32-S3 (Xtensa LX7 with PIE) — PIE SIMD floating-point path
xylolabs-sdk = { path = "../../crates/xylolabs-sdk", features = ["xap", "esp32-simd"] }
# Platforms without DSP/FPU (RP2040, ESP32-C3, STM32F103) — ADPCM only
xylolabs-sdk = { path = "../../crates/xylolabs-sdk", default-features = false, features = ["adpcm"] }
인코더 사용법:
use xylolabs_sdk::codec::xap::{XapEncoder, XapConfig};
let encoder = XapEncoder::new(XapConfig {
sample_rate: 16_000,
frame_duration: 10_000, // 10 ms
bitrate: 64_000, // 64 kbps
channels: 4,
}).expect("invalid XAP configuration");
// Encode one frame of interleaved PCM
let mut out = vec![0u8; encoder.frame_bytes() as usize];
let written = encoder.encode_frame(&pcm_samples, &mut out);
8.2 C SDK¶
config.h의 컴파일 타임 정의를 사용하여 코덱과 DSP 경로를 선택한다. DSP 가속은 컴파일러 플래그에서 자동 감지된다:
#define XYLOLABS_CODEC_XAP 1 /* enable XAP encoder */
#define XYLOLABS_USE_CMSIS_DSP 1 /* Cortex-M4F / M33 targets */
/* or */
#define XYLOLABS_USE_ESP32S3_SIMD 1 /* ESP32-S3 targets */
자동 감지가 불충분할 때 CMake로 명시적으로 재정의한다:
8.3 서버측 디코더¶
Xylolabs 서버에는 XAP 인코딩된 오디오 스트림이 포함된 수신 XMBP 배치에서 PCM을 재구성하는 XAP 디코더 라이브러리가 포함되어 있다. 디코더는 자원 제약 없이 동작하며 인제스트 파이프라인에서 프레임이 도착하는 대로 처리한다. 서버측 디코딩 지연은 일반적인 서버 하드웨어에서 프레임당 약 5 µs이다.
서버측 설정은 필요하지 않다. 디코더는 XAP 프레임 헤더에서 직접 프레임 파라미터(frame_samples, channels, frame_bytes, step_size)를 읽으며, XAP는 프레임 레벨에서 자기 기술적이다.
9. IMA-ADPCM과의 비교¶
XAP와 IMA-ADPCM은 Xylolabs SDK에서 지원하는 두 가지 코덱이다. 이 표는 트레이드오프를 요약한다:
| 속성 | XAP | IMA-ADPCM |
|---|---|---|
| 알고리즘 | MDCT 스펙트럼 변환 | 샘플 단위 델타 양자화 |
| 압축 비율 | 8:1–10:1 | 4:1 (고정) |
| 비트레이트 범위 | 채널당 16–320 kbps | sample_rate × 0.5 bytes/s로 고정 |
| 64 kbps에서의 지각적 품질 | 투명에 가까움 | 보통 — 청취 가능한 양자화 노이즈 |
| 스펙트럼 충실도 | 전 스펙트럼 보존 | 부하 시 고주파수 롤오프 |
| 알고리즘 지연 | 7.5–10 ms (1 프레임) | 샘플 레벨 (실효 0.1 ms 미만) |
| CPU (DSP 사용 시) | 채널당 약 10 MIPS | 채널당 1 MIPS 미만 |
| CPU (DSP 미사용 시) | 실행 불가 | 채널당 1 MIPS 미만 |
| 채널당 RAM | 약 8 KB | 1 KB 미만 |
| FPU 필수 여부 | 예 | 아니오 |
| DSP 권장 여부 | 예 | 아니오 |
| 지원 플랫폼 | M4F, M33, Xtensa LX7 | 모든 플랫폼 |
| 구현 복잡도 | 높음 (MDCT + 양자화) | 낮음 (룩업 테이블만) |
| 일반적인 사용 사례 | 산업용 모니터링, 전 스펙트럼 오디오 | 레거시 센서, CPU 제약 MCU |
| 정수만 사용하는 산술 | 아니오 (FPU 필요) | 예 (순수 정수) |
선택 지침:
- MCU에 FPU(Cortex-M4F 이상)가 있고 대역폭 효율이 중요한 경우 XAP를 사용한다. XAP는 ADPCM의 절반 대역폭으로 동일한 오디오 품질을 달성한다.
- FPU가 없는 플랫폼(RP2040, ESP32-C3, STM32F103), 또는 오디오에 대한 CPU 예산이 채널당 2 MIPS 미만이거나, 채널당 RAM이 2 KB 미만이어야 하는 경우 IMA-ADPCM을 사용한다.
- 혼합 배포의 경우, XMBP 프로토콜은 동일한 스트림 엔드포인트에서 두 코덱을 모두 지원한다. 서버 디코더는 XMBP 스트림 헤더의 코덱 식별자를 기반으로 자동 선택한다.
10. 관련 문서¶
| 문서 | 설명 |
|---|---|
| XMBP-SPECIFICATION.md | Xylolabs Metadata Batch Protocol 와이어 포맷. XAP 프레임은 XMBP 오디오 스트림 페이로드로 전송된다. |
| CODEC-ANALYSIS.md | 5개 MCU 플랫폼에서 16개 이상의 오디오 코덱 비교 분석. XAP 선정에 대한 상세한 근거를 포함한다. |
| PERFORMANCE-EVALUATION.md | 벤치마크 데이터: 프레임당 인코딩 시간, 채널 스케일링, DSP 영향, MCU 실현 가능성 매트릭스. |
| PERFORMANCE-PROFILE.md | DSP 가속 매트릭스, 타겟별 CPU/메모리 예산, CMSIS-DSP 통합 가이드. |
| PLATFORM-PICO.md | RP2350 (Pico 2) 하드웨어 설정, 빌드 설정, XAP 통합. |
| PLATFORM-STM32.md | STM32F103/F411/WB55/WBA55 설정 및 CMSIS-DSP 설정. |
| PLATFORM-ESP32.md | ESP32-S3/C3 WiFi, ESP-IDF 통합, PIE SIMD 설정. |
| PLATFORM-NRF.md | nRF52840/nRF9160 BLE/LTE-M 설정 및 CMSIS-DSP 통합. |
| FEASIBILITY-RP2350.md | 상세 실현 가능성 분석: RP2350에서 4ch @96kHz XAP, CPU/메모리 예산 분석. |
11. 법적 고지¶
XAP (Xylolabs Audio Protocol)는 Xylolabs Inc.의 독점 기술이다.
XAP 인코딩 알고리즘, 프레임 포맷, 적응형 양자화 방식, 플랫폼별 DSP 가속 경로를 포함하는 특허 출원이 제출되었다. 모든 권리가 보유된다.
Xylolabs Inc.의 서면 라이선스 없이 XAP 또는 그 일부를 제3자 제품 또는 서비스에 무단으로 사용, 복제, 역공학, 배포 또는 통합하는 것은 엄격히 금지된다.
라이선스 문의: legal@xylolabs.com
상표: "Xylolabs", "XAP", "XMBP"는 Xylolabs Inc.의 상표이다.
Xylolabs Inc. — XAP 명세서 — 개정 2026-03-27