# Real-World Capture Analysis - Gap Between Synthetic and Real Performance **Date**: 2026-02-15 **Benchmark**: Real Flipper Zero Community Captures vs Synthetic Test Signals ## Executive Summary **CRITICAL FINDING**: The RF device identification system achieves **0% accuracy on real-world captures** vs **33% on synthetic signals**. This represents a complete failure to generalize from synthetic to real-world data. ## Performance Comparison | Metric | Synthetic | Real-World | Delta | |--------|-----------|------------|-------| | Top-1 Accuracy | 33.3% (4/12) | **0.0%** (0/11) | **-33.3%** | | Top-3 Accuracy | 50.0% (6/12) | **0.0%** (0/11) | **-50.0%** | | High Confidence (>80%) | 66.7% | **9.1%** | -57.6% | | No Matches Found | 8.3% (1/12) | **45.5%** (5/11) | +37.2% | ## Root Causes ### 1. **Decoded vs RAW File Format** (5/11 failures = 45%) **Problem**: Many real Flipper captures are **already decoded**, not RAW. **Evidence**: - All 3 ceiling fan files: `Protocol: Holtek_HT12X` (decoded) - RGB LED remote: Already decoded - LiftMaster Security+ 2.0: Already decoded **Example** (`ceiling_fan_real.sub`): ``` Filetype: Flipper SubGhz Key File Version: 1 Frequency: 315000000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Holtek_HT12X # <-- Already decoded! Bit: 12 Key: 00 00 00 00 00 00 00 BF TE: 470 ``` **Impact**: Our system **only processes RAW_Data**. Decoded files have `has_raw_data=False`, so the pattern decoder immediately returns empty results. **Fix Required**: Add support for decoded .sub files: 1. Parse `Protocol`, `Bit`, `Key`, `TE` fields 2. Match against database by protocol name + timing element 3. Synthesize timing from TE (timing element) if needed --- ### 2. **Real Signal Noise & Complexity** (3/11 failures = 27%) **Problem**: Real captures have: - Variable signal quality - Multi-packet transmissions - Long pulse trains (LaCrosse: 131 pulses total) - Interference and jitter beyond our 15% tolerance **Evidence**: - `lacrosse_tx141_real.sub`: 131 pulses, very long RAW_Data - Top match: "Schou 72543 Day Rain Gauge" (69.1%) - WRONG - Expected "LaCrosse TX141-BV2" not found in top 100 **Analysis**: Real LaCrosse signals are much longer and noisier than our 40-bit synthetic version. --- ### 3. **Missing Protocols in Database** (3/11 failures = 27%) **Problem**: Expected protocols not in our 299-protocol database: - "Acurite 02077M" → Not in database (we have Acurite 609TXC, but not 02077M variant) - "GE Doorbell 19297" → Not in database - "Byron Doorbell DB421E" → Not in database (Byron got Princeton at 92.9%) **Evidence**: ``` Byron doorbell → Princeton (92.9% confidence) GE doorbell → Conrad S3318P sensor (76.9% confidence) ``` **Impact**: Even with perfect timing extraction, we can't match protocols that don't exist in the database. --- ### 4. **Protocol Name Matching Too Strict** (1/11 = 9%) **Problem**: `nexus_th_real.sub` matched "Nexus Temperature-Humidity" but at **rank 34**. **Top 5 Results**: 1. Oregon Scientific Weather Sensor (76.9%) 2. Oregon Scientific v3.0 (75.9%) 3. Oregon Scientific v2.1 (74.2%) 4. Ambient Weather F007TH (63.5%) 5. Digitech XC-0324 (58.4%) ... 34. Nexus Temperature-Humidity **Analysis**: Nexus is getting matched, but Oregon protocols score higher. This suggests: - Timing similarity between Nexus and Oregon - Preamble detection favoring Oregon - Need protocol-family grouping (Nexus vs Oregon shouldn't compete directly) --- ## Detailed Failure Analysis ### Weather Sensors (0/3 correct) #### 1. LaCrosse TX141-BV2 Real Capture - **Expected**: LaCrosse TX141-BV2 - **Got**: Schou 72543 Day Rain Gauge (69.1%) - **Rank**: Not found **Issue**: Real capture has 131 pulses vs synthetic 40 bits. Likely multiple transmissions in one capture. #### 2. Acurite 02077M - **Expected**: Acurite 02077M - **Got**: LaCrosse Technology View LTV-R1 (76.5%) - **Rank**: Not found **Issue**: Acurite 02077M not in database. We have Acurite 609TXC but not this model. #### 3. Nexus Temperature-Humidity - **Expected**: Nexus Temperature-Humidity - **Got**: Oregon Scientific Weather Sensor (76.9%) - **Rank**: 34 **Issue**: Protocol exists but ranks low. Oregon and Nexus are similar protocols competing. --- ### Garage Doors (0/2 correct) #### 1. LiftMaster 433MHz - **Expected**: LiftMaster - **Got**: AlectoV1 Weather Sensor (49.4%) - **Rank**: Not found **Issue**: LiftMaster not in database. Low confidence (49%) suggests poor timing match. #### 2. LiftMaster Security+ 2.0 - **Expected**: LiftMaster Security+ 2.0 - **Got**: No matches (0%) - **Rank**: Not found **Issue**: **Decoded file format**. No RAW_Data to process. Security+ 2.0 uses rolling codes. --- ### Doorbells (0/2 correct) #### 1. GE Doorbell 19297 - **Expected**: GE Doorbell - **Got**: Conrad S3318P sensor (76.9%) - **Rank**: Not found **Issue**: GE Doorbell not in database. Misidentified as temperature sensor. #### 2. Byron Doorbell DB421E - **Expected**: Byron Doorbell - **Got**: Princeton (92.9%) - **Rank**: Not found **Issue**: Byron not in database. High confidence match to Princeton suggests similar timing (Princeton-like protocol). --- ### LED/Fan Controllers (0/4 correct) #### All 4 files: No matches (0%) **Issue**: **All are decoded format**, not RAW. Our system cannot process them. **Files**: - `rgb_led_remote_real.sub` - Decoded - `ceiling_fan_real.sub` - Decoded (Holtek_HT12X) - `ceiling_fan2_real.sub` - Decoded (Holtek_HT12X) - `ceiling_fan_light_real.sub` - Decoded (Holtek_HT12X) --- ## Recommendations ### Priority 1: Support Decoded .sub Files (Fixes 45% of failures) **Implementation**: ```python def parse_sub_file(filepath): """Parse both RAW and decoded .sub files""" metadata = SignalMetadata() with open(filepath) as f: # ... existing parsing ... # If no RAW_Data but has Protocol field if not metadata.has_raw_data and metadata.protocol: # This is a decoded file # Extract: Protocol, Bit, Key, TE # Match by protocol name + TE timing metadata.is_decoded = True metadata.timing_element = te_value return metadata ``` **Database Matching**: - For decoded files, match primarily by `Protocol` field name - Use `TE` (timing element) as secondary confirmation - Skip RAW pattern analysis --- ### Priority 2: Add Missing Protocols (Fixes 27% of failures) **Protocols to Add**: 1. **Acurite 02077M** - Weather station (433.92 MHz) 2. **GE Doorbell 19297** - Doorbell (433.92 MHz) 3. **Byron DB421E** - Doorbell (433.92 MHz) 4. **LiftMaster** (generic 433 MHz) - Garage door 5. **Holtek HT12X** - LED/Fan remote encoder chip **Source**: Import from real captures or RTL_433 database updates. --- ### Priority 3: Improve Real Signal Robustness (Fixes 27% of failures) **Issues**: - Long multi-packet captures (131 pulses vs 40 bits) - Variable signal quality - Packet repetition detection needed **Fixes**: 1. **Packet Segmentation**: Split long RAW_Data into individual transmissions 2. **Repetition Detection**: Find repeating patterns, score best match 3. **Noise Filtering**: Increase jitter tolerance from 15% to 25% for real data 4. **Confidence Calibration**: Lower thresholds for real-world data --- ### Priority 4: Protocol Family Grouping (Fixes 9% of failures) **Issue**: Nexus ranks #34, beaten by Oregon Scientific variants. **Fix**: - Group similar protocols (Nexus, Oregon Scientific, Acurite all use similar encoding) - Score by protocol family first, then by specific model - Boost exact name matches over family matches --- ## Performance Expectations After Fixes | Fix | Impact | Expected Accuracy | |-----|--------|-------------------| | Support decoded files | +45% (5/11) | 45% | | Add missing protocols | +27% (3/11) | 72% | | Improve robustness | +18% (2/11) | 90% | | Family grouping | +9% (1/11) | 100% | **Realistic Target**: 60-70% top-1 accuracy after implementing Priority 1 and 2. --- ## Synthetic vs Real: Why the Gap? ### Synthetic Signals (33% accuracy) - ✅ Perfect timing (no jitter beyond 5-15%) - ✅ Single packet per file - ✅ Known protocol parameters - ✅ All RAW format - ❌ Unrealistic simplicity ### Real Captures (0% accuracy) - ❌ 45% are decoded (not RAW) - ❌ 27% use protocols not in database - ❌ Variable signal quality - ❌ Multi-packet transmissions - ❌ Real-world interference - ✅ Actual device behavior **Conclusion**: Our system was optimized for synthetic signals that don't represent real-world usage. --- ## Next Steps 1. **Immediate**: Implement decoded .sub file support (Priority 1) 2. **Short-term**: Add missing protocols from real captures (Priority 2) 3. **Medium-term**: Improve noise tolerance and packet segmentation (Priority 3) 4. **Long-term**: Collect more real captures for training/validation --- **Generated**: 2026-02-15 **Benchmark Version**: Iteration 6 (post-precision tuning) **Database Size**: 299 protocols (RTL_433 imported) **Real Captures Source**: UberGuidoZ/Flipper repository