RP2350 + LTE-M1 타당성 분석¶
1. 입력 데이터 사양¶
| Data | Channels | Sample Rate | Bit Depth | Raw Data Rate |
|---|---|---|---|---|
| Audio (2 stereo mics) | 4ch (2 mic x 2ch) | 96 kHz | 24-bit | 1,152 KB/s |
| Sensors (vibration, magnetic, temp, humidity) | 4ch | 100 Hz | f32 | ~1.6 KB/s |
| Motor signals (brake 20ch RPM, current, voltage) | 22ch | ~100 Hz | f32 | ~8.8 KB/s |
| Total raw data rate | ~1,162.4 KB/s |
2. RP2350 리소스 분석¶
| Resource | Specification | Notes |
|---|---|---|
| CPU | Dual Cortex-M33 @ 150 MHz | ~300 MIPS total |
| SRAM | 520 KB | Includes stack, heap, static buffers |
| ADC | 12-bit, 500 ksps (shared) | NOT sufficient for 96kHz/24-bit audio |
| I2S | PIO-based | CAN handle 96kHz/24-bit with external ADC |
| SPI | Up to 62.5 MHz | SD card, external ADC connection |
| UART | 2ch | LTE-M1 modem AT commands |
| GPIO | 30 pins | Sensor, motor signal inputs |
| WDT | Hardware Watchdog Timer | Long-term stability |
| Flash | External QSPI (typically 2-16 MB) | Firmware + log storage |
핵심 제약 사항: 내장 ADC는 12-bit/500ksps로, 96kHz/24-bit 오디오를 캡처할 수 없다. 외장 I2S ADC(예: PCM1808, CS5343)가 필요하다.
3. 코덱 타당성¶
| Codec | MIPS/ch | 4ch Total | RP2350 Feasible? | Compression | Quality |
|---|---|---|---|---|---|
| Opus (music) | ~80 | 320 | NO (exceeds CPU) | 10:1+ | Excellent |
| Opus (voice) | ~30 | 120 | Marginal (1 full core) | 10:1+ | Good |
| IMA-ADPCM | ~1 | 4 | YES | 4:1 | Good |
| u-law/A-law | <1 | <4 | YES | 2:1 | Fair |
| Raw PCM | 0 | 0 | YES | 1:1 | Perfect |
| FLAC | ~30 | 120 | Marginal | 2:1 | Lossless |
| XAP | ~20 | 80 | YES | 10:1 | Excellent |
| XAP (DSP 가속) | ~14 | 56 | YES | 10:1 | Excellent |
결론: RP2350에서 권장하는 코덱은 XAP이다. 10:1 압축률에 음질도 우수하다. DSP 가속 인코딩(CMSIS-DSP 최적화 MDCT 및 FIR, Cortex-M33 DSP 확장)을 사용하면 XAP 4ch @96 kHz에 ~56 MIPS만 필요해 RP2350의 300 MIPS 예산 안에 충분히 들어온다. IMA-ADPCM은 극단적으로 단순한 경우의 대체 옵션으로 유효하다.
XAP 및 XMBP는 Xylolabs Inc.의 특허 출원 중인 기술이다.
DSP 가속: RP2350의 Cortex-M33에는 단일 사이클 32x32 MAC, 듀얼 16비트 SIMD(SMLAD), 포화 연산이 포함되어 있어 순수 C 대비 XAP 인코딩 비용을 ~30% 절감한다. Rust SDK features = ["cmsis-dsp"] 또는 C SDK XYLOLABS_USE_CMSIS_DSP=1로 활성화한다. 자세한 벤치마크는 docs/CODEC-ANALYSIS.ko.md 섹션 6 및 성능 프로파일을 참조한다.
4. 대역폭 분석¶
LTE-M1 최대 대역폭: 375 kbps = ~47 KB/s (이론값, 실측 ~30-40 KB/s)
| Data | Raw Rate | With ADPCM | Fits LTE-M1? |
|---|---|---|---|
| 4ch audio 96kHz/24-bit | 1,152 KB/s | 288 KB/s (4:1) | NO |
| 4ch audio 96kHz/16-bit | 768 KB/s | 192 KB/s | NO |
| 4ch audio 48kHz/16-bit | 384 KB/s | 96 KB/s | NO |
| 4ch audio 16kHz/16-bit | 128 KB/s | 32 KB/s | YES |
| 4ch audio 8kHz/16-bit | 64 KB/s | 16 KB/s | YES (margin) |
| Sensors 100Hz x 4ch | ~1.6 KB/s | ~1.6 KB/s | YES |
| Motor 100Hz x 22ch | ~8.8 KB/s | ~8.8 KB/s | YES |
5. 핵심 발견 사항¶
4채널 96kHz 오디오는 기존 압축 방식만으로는 LTE-M1으로 실시간 스트리밍이 불가능하다.
- Opus로 4ch x 64kbps = 32KB/s는 대역폭에 맞지만, RP2350은 Opus 인코딩이 불가능하다(~320 MIPS 필요)
- IMA-ADPCM 4:1 적용 시 288 KB/s -- LTE-M1 용량(47 KB/s)의 6배 초과
- 16kHz로 다운샘플링 시: 4ch x 16kHz x 4-bit ADPCM = 32 KB/s -- 대역폭 내 수용 가능
업데이트 (섹션 12): XAP 코덱이 이 제약을 해결한다. XAP는 80 kbps/ch에서 10:1 압축을 달성하며, RP2350에서 DSP 가속 시 ~56 MIPS만 필요하여 4ch @96kHz = 40 KB/s — LTE-M1 대역폭 내 수용 가능하다. 수정된 권장 사항은 섹션 12를 참조한다.
6. 권장 아키텍처¶
옵션 A: 다운샘플링 실시간 스트리밍¶
(연속 모니터링에 권장)
- 외장 I2S ADC로 96kHz에서 캡처
- RP2350에서 16kHz로 다운샘플링 (간단한 FIR 필터, ~5 MIPS/ch, 총 ~20 MIPS)
- IMA-ADPCM 4:1 압축 (~1 MIPS/ch, 총 ~4 MIPS)
- 오디오: 4ch x 16kHz x 4-bit = 32 KB/s
- 센서 + 모터: XMBP 프로토콜 = ~10 KB/s
- 합계: ~42 KB/s -- LTE-M1 대역폭 내 수용 가능
옵션 B: 주기적 고해상도 녹음¶
(음질 우선 시 권장)
- SD 카드에 96kHz/24-bit 원본으로 녹음 (1.15 MB/s -- SD로 충분히 처리 가능)
- 녹음 구간(10초 = 11.5 MB) 이후 ADPCM으로 2.9 MB까지 압축
- 압축 파일을 LTE-M1로 업로드 (10초 녹음당 약 62초 소요)
- 약 70초마다 10초 녹음 -- 14% 듀티 사이클
- 또는 5분마다 10초 녹음 -- 매우 여유로운 주기
옵션 C: 하이브리드 (양쪽 장점 결합)¶
(최종 권장안)
- Core 0: 연속 저해상도 모니터링 (16kHz ADPCM 스트림)
- Core 1: 센서/모터 데이터 수집 + 주기적 고해상도 버스트 (96kHz를 SD 카드에 저장 후 업로드)
- 서버에서 두 스트림을 수신하여 타임스탬프 기반으로 상관 분석
7. 장기 안정성 (1년 이상 운용)¶
| Item | Implementation | Notes |
|---|---|---|
| Watchdog | RP2350 hardware WDT, reset on hang | Periodic feed in main loop |
| Memory | Static allocation only, no heap fragmentation | No malloc/free |
| Network | Exponential backoff reconnect, session auto-resume | Modem reset after max retries |
| Power | PSM/eDRX for idle periods, voltage monitoring | Safe shutdown on low voltage |
| Logging | Error counts to flash, periodic health report | Health report to server |
| OTA updates | Firmware update via server command | A/B partition recommended |
| Temperature | RP2350 built-in temp sensor monitoring | Reduce clock on overheat |
8. 시간 동기화¶
- 세션 생성 시 서버가 기준 타임스탬프를 할당
- Pico는 모노토닉 카운터(부팅 이후 마이크로초 단위) 사용
- 세션 시작 시각 = 세션 생성 시점의 서버 타임스탬프
- 모든 샘플은 세션 시작 시점 기준 상대 시간 (RP2350 크리스탈 기준 드리프트 < 1ms/hour)
9. 10초 윈도우 정렬¶
- 서버가 수신된 데이터를 10초 단위 경계에 맞춰 정렬
- 같은 윈도우 내의 오디오와 센서 데이터는 상관 분석 가능
- Window ID = floor(server_timestamp / 10)
- 겹침 없음 (0%)
10. 메모리 예산¶
RP2350 SRAM: 총 520 KB
| Purpose | Size | Notes |
|---|---|---|
| I2S DMA double buffer (4ch) | ~32 KB | 96kHz x 24-bit x 4ch x 2 buf |
| Downsample FIR filter | ~4 KB | Filter coefficients + state |
| ADPCM encoding state | <1 KB | Per-channel state variables |
| XMBP packet buffer | ~8 KB | Sensor + motor batch |
| HTTP transmit buffer | ~4 KB | AT commands + headers |
| Sensor collection buffer | ~12 KB | 26ch x 100Hz x 500ms batch |
| Stack (2 cores) | ~16 KB | 8 KB per core |
| SD card buffer (Option B/C) | ~8 KB | FatFS + read/write buffer |
| Misc (session, URL, stats) | ~4 KB | |
| Total | ~89 KB | 520 KB 중 17% 사용 |
11. CPU 예산¶
RP2350: 2 x Cortex-M33 @ 150 MHz = 총 ~300 MIPS
옵션 A/C(연속 스트리밍) 기준:
| Task | Core | MIPS | Notes |
|---|---|---|---|
| I2S DMA management | 0 | ~2 | DMA hardware handles most |
| FIR downsample 4ch | 0 | ~20 | 96kHz to 16kHz, ~5 MIPS/ch |
| IMA-ADPCM encode 4ch | 0 | ~4 | ~1 MIPS/ch |
| Sensor ADC read 26ch | 1 | ~5 | 100Hz, lightweight |
| XMBP encoding | 1 | ~2 | Binary serialization |
| HTTP transmit (AT cmds) | 1 | ~10 | Includes UART I/O wait |
| WDT, logging, misc | 1 | ~3 | |
| Core 0 total | 0 | ~26 | 150 MIPS 중 17% |
| Core 1 total | 1 | ~20 | 150 MIPS 중 13% |
DSP 가속 적용 시 (Rust SDK features = ["cmsis-dsp"] 또는 C SDK XYLOLABS_USE_CMSIS_DSP=1): FIR 다운샘플링에 CMSIS-DSP arm_fir_q15(듀얼 16비트 SIMD)를 사용하면 ~20 MIPS에서 ~12 MIPS로 줄어든다. ADPCM은 포화 연산의 혜택을 받는다. Core 0 합계는 ~18 MIPS(12%)로 감소한다.
ADPCM 대신 XAP 사용 시 (옵션 D -- 96 kHz 직접 스트리밍):
| Task | Core | MIPS | Notes |
|---|---|---|---|
| I2S DMA management | 0 | ~2 | DMA hardware handles most |
| XAP encode 4ch @96 kHz (DSP) | 0 | ~56 | ~14 MIPS/ch with CMSIS-DSP |
| Sensor ADC read 26ch | 1 | ~5 | 100Hz, lightweight |
| XMBP encoding | 1 | ~2 | Binary serialization |
| HTTP transmit (AT cmds) | 1 | ~10 | Includes UART I/O wait |
| WDT, logging, misc | 1 | ~3 | |
| Core 0 total | 0 | ~58 | 150 MIPS 중 39% |
| Core 1 total | 1 | ~20 | 150 MIPS 중 13% |
XAP를 80 kbps/ch로 설정하면 4ch x 80 kbps = 40 KB/s로 다운샘플링 없이 LTE-M1에 적합하다. FIR 다운샘플 단계가 불필요해지며 96 kHz 전체 대역폭이 10:1 압축으로 보존된다.
12. 결론 및 권장 사항¶
- 96kHz/24-bit 4채널 오디오의 LTE-M1 실시간 스트리밍은 XAP로 가능하다.
- XAP 80 kbps/ch: 4ch = 40 KB/s -- LTE-M1 대역폭 내
- DSP 가속 XAP 인코딩은 RP2350 한 코어의 39%만 사용
-
다운샘플링 불필요 -- 96 kHz 전체 스펙트럼 보존
-
권장 솔루션: 옵션 C (하이브리드) + XAP
- 연속 모니터링: XAP 4ch @96 kHz (40 KB/s) + 센서 XMBP (10 KB/s) = 50 KB/s (LTE-M1 이론 최대 47 KB/s 초과 — 64 kbps 모드 또는 센서 데이터 축소 필요)
- 또는: XAP 4ch @96 kHz (32 KB/s @64 kbps) + 센서 XMBP (10 KB/s) = 42 KB/s (여유 있음)
-
주기적 고해상도: 96kHz 원시 데이터를 SD 카드에 저장하여 무손실 보관, 일괄 업로드
-
서버 측 필요 변경 사항:
- XAP 프레임 디코딩을 위한 XAP 디코더 통합 (또는 FFmpeg 7.1+ XAP 지원 사용)
- ADPCM WAV 포맷 수신 및 디코딩 지원 추가 (대체 경로)
-
보관 저장을 위한 XAP → FLAC/WAV 트랜스코딩 파이프라인
-
RP2350 리소스는 충분하다:
- 메모리: 89 KB / 520 KB (17%), XAP 인코더 상태 포함 시 ~121 KB (23%)
- CPU: DSP 가속 XAP 기준 코어당 39% 및 13%
- DSP 확장이 코덱 연산에 25-40% 속도 향상 (단일 사이클 MAC, SIMD, 포화 연산)
-
장기 안정성 확보 가능 (WDT, 정적 할당, PSM)
-
DSP 하드웨어 가속이 핵심이다:
- Cortex-M33 DSP 확장이 XAP 인코딩을 4ch @96 kHz 기준 ~80 MIPS에서 ~56 MIPS로 절감
- CMSIS-DSP 라이브러리가 최적화된 FFT, FIR, 벡터 루틴을 제공
-
플랫폼별 DSP 성능 상세 벤치마크는
docs/CODEC-ANALYSIS.md섹션 6 참조 -
구현 참고: Rust SDK가 RP2350 프로젝트의 권장 구현체이다. Embassy 기반 비동기 런타임은 제로 비용 추상화로 C 수준의 성능을 내면서 컴파일 타임 타입 안전성을 보장한다. 빌드 가능한 RP2350 Rust 예제는
sdk/examples/를 참고한다. -
번인 테스트를 통한 성능 검증: E2E 테스트 결과 XAP 인코딩이 프레임당 평균 9us로 RP2350의 10ms 프레임 예산 대비 99.3% 여유를 확인했다. 다중 장치(10대 동시) 및 스트레스(96kHz) 시나리오에서 0건의 실패로 통과했다.