chore: add gitignore, documentation, and LC3 conformance test software

- Add .gitignore for Python, virtual environments, testing artifacts, IDE files, and LC3 test outputs including SQAM audio files
- Add AGENTS.md with project context for LC3 implementation testing
- Add LC3.TS.p5.pdf test specification document
- Add LC3 conformance interoperability test software V1.0.8 with script readme and reference binary symlink
This commit is contained in:
2026-02-27 14:56:35 +01:00
commit 2845458d3f
49 changed files with 4252 additions and 0 deletions

125
README.md Normal file
View File

@@ -0,0 +1,125 @@
# LC3 Encoder Qualification
Tests the `lc3py` encoder from `bumble-auracast` against the LC3 TS p5 conformance suite.
**Scope: 15 ENC test cases, no 44.1 kHz** (lc3py does not support 44.1 kHz).
---
## 1 — System packages
```bash
# Enable 32-bit architecture (required for wine32 to run LC3.exe)
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y \
wine \
gcc \
sox \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-bad1.0-dev \
autoconf automake libtool
sudo apt-get install -y wine32
# One-time: initialize a 32-bit Wine prefix (LC3.exe is a 32-bit Windows binary)
WINEARCH=win32 WINEPREFIX=~/.wine32 wineboot
```
> The runner script (`run_enc_tests.py`) sets `WINEARCH=win32 WINEPREFIX=~/.wine32` automatically.
---
## 2 — Build gstPEAQ (one-time)
gstPEAQ v0.6.1 is the open-source PEAQ implementation used as the ODG metric tool.
```bash
cd /tmp
wget https://github.com/HSU-ANT/gstpeaq/archive/refs/tags/version-0.6.1.tar.gz -O gstpeaq-0.6.1.tar.gz
tar xzf gstpeaq-0.6.1.tar.gz
cd gstpeaq-version-0.6.1
# Patch build system to skip gtk-doc (not needed for the binary)
touch ChangeLog
sed -i 's/^GTK_DOC_CHECK/#GTK_DOC_CHECK/' configure.ac
echo "" > gtk-doc.make
sed -i '81s/CLEANFILES +=/CLEANFILES =/' doc/Makefile.am
sed -i 's/GTK_DOC_CHECK(1.10,--flavour no-tmpl)/: # GTK_DOC_CHECK disabled/' configure
autoreconf -i --force
./configure
make -C src # build only the binary, skip doc
```
The binary and plugin will be at:
- `/tmp/gstpeaq-version-0.6.1/src/peaq`
- `/tmp/gstpeaq-version-0.6.1/src/.libs/libgstpeaq.so`
> These paths are already set in `conf_lc3ts_p5_enc_10ms.cfg` and `conf_lc3ts_p5_enc_75ms.cfg`.
> If you build gstPEAQ elsewhere, update `peaq_bin` in both cfg files.
---
## 3 — Set up LC3 reference binary (one-time)
```bash
cd /home/pstruebi/repos/lc3_quali
SCRIPT_DIR=LC3_conformance_interoperability_test_software_V1.0.8_2024-07-01/LC3_Conformance_Interoperability_Script
mkdir -p $SCRIPT_DIR/LC3_bin_current
ln -sf $(pwd)/LC3_conformance_interoperability_test_software_V1.0.8_2024-07-01/LC3_Reference_Binary/LC3.exe \
$SCRIPT_DIR/LC3_bin_current/LC3.exe
```
---
## 4 — Install Python venv
```bash
cd /home/pstruebi/repos/lc3_quali
poetry install
```
---
## 5 — Run
```bash
poetry run python qualification/run_enc_tests.py
```
Results are written to `qualification/results/DD_MM_YY_HH_MM/`:
- **`SUMMARY.html`** — consultant-ready: all 15 TC IDs with PASS/FAIL
- `ENC_*_<ts>.html` — detail reports (ODG per SQAM item)
- `conformanceCheck_<ts>.log`
- `lc3_conformance_<ts>/` — audio comparison WAVs (`ref_ref.wav` vs `tst_ref.wav`)
---
## Test Cases (15 total)
### 10ms frame duration (7 cases)
| Test Case ID | kHz | kbps | Config |
|---|---|---|---|
| LC3/ENC/NB/BV-01-C | 8 | 24 | 10ms |
| LC3/ENC/WB/BV-01-C | 16 | 32 | 10ms |
| LC3/ENC/SSWB/BV-01-C | 24 | 48 | 10ms |
| LC3/ENC/SWB/BV-01-C | 32 | 64 | 10ms |
| LC3/ENC/FB/BV-01-C | 48 | 80 | 10ms |
| LC3/ENC/FB/BV-02-C | 48 | 96 | 10ms |
| LC3/ENC/FB/BV-03-C | 48 | 124 | 10ms |
### 7.5ms frame duration (8 cases)
| Test Case ID | kHz | kbps | Config |
|---|---|---|---|
| LC3/ENC/NB/BV-02-C | 8 | 27.734 | 7.5ms |
| LC3/ENC/WB/BV-02-C | 16 | 32 | 7.5ms |
| LC3/ENC/SSWB/BV-02-C | 24 | 48 | 7.5ms |
| LC3/ENC/SWB/BV-02-C | 32 | 64 | 7.5ms |
| LC3/ENC/SWB/BV-03-C | 32 | 61.867 | 7.5ms |
| LC3/ENC/FB/BV-07-C | 48 | 80 | 7.5ms |
| LC3/ENC/FB/BV-08-C | 48 | 96 | 7.5ms |
| LC3/ENC/FB/BV-09-C | 48 | 124.8 | 7.5ms |