# Closed Loop Audio Test Suite Simple Python-based testing system for PCB audio hardware validation. ## Features - **Automated Testing**: Latency, THD, and SNR measurements across multiple frequencies - **Metadata Tracking**: PCB version, revision, software version, timestamps, notes - **YAML Output**: Human-readable structured results - **Simple Workflow**: Run tests, view results, compare versions ## Quick Start ### 1. Install Dependencies ```bash pip install -r requirements.txt ``` ### 2. Run a Test ```bash python run_test.py \ --serial-number "SN001234" \ --software-version "a3f2b1c" \ --comment "Replaced capacitor C5" ``` ### 3. View Results ```bash # View specific test python view_results.py test_results/20260226_123456_results.yaml # List all tests python view_results.py --list # View latest test python view_results.py test_results/*.yaml | tail -1 ``` ## Test Metrics - **Latency**: Round-trip delay between input and output channels (ms) - **THD**: Total Harmonic Distortion for input and output (%) - **SNR**: Signal-to-Noise Ratio for input and output (dB) Tests run at multiple frequencies: 100 Hz, 250 Hz, 500 Hz, 1 kHz, 2 kHz, 4 kHz, 8 kHz ## Output Format Results are saved as YAML files in `test_results/`: ```yaml metadata: test_id: 20260226_123456 timestamp: '2026-02-26T12:34:56.789012' pcb_version: v2.1 pcb_revision: A software_version: a3f2b1c notes: Replaced capacitor C5 test_results: - frequency_hz: 1000 latency_ms: 2.345 thd_input_percent: 0.012 thd_output_percent: 0.034 snr_input_db: 92.5 snr_output_db: 89.2 ``` ## Configuration Edit `config.yaml` to customize: - Audio device settings - Test frequencies - Test duration - Output options ## Hardware Setup ``` Laptop <-> Audio Interface (Scarlett) <-> DUT <-> Audio Interface (Scarlett) <-> Laptop Output Channels 1&2 Input Channels 1&2 ``` The system auto-detects Focusrite Scarlett audio interfaces. ## File Structure ``` closed_loop_audio_test_suite/ ├── config.yaml # Test configuration ├── run_test.py # Main test runner ├── view_results.py # Results viewer ├── src/ │ └── audio_tests.py # Core test functions └── test_results/ # YAML output files └── YYYYMMDD_HHMMSS_results.yaml ``` ## Tips - Each test run creates a timestamped YAML file - Results are self-contained with full metadata - Compare tests by opening multiple YAML files - Archive old tests by moving YAML files to subdirectories