Skip to content

[3/4] Optimize SILK LPC synthesis#116

Closed
zshang-oai wants to merge 1 commit into
mainfrom
codex/reduce-silk-lpc-synthesis
Closed

[3/4] Optimize SILK LPC synthesis#116
zshang-oai wants to merge 1 commit into
mainfrom
codex/reduce-silk-lpc-synthesis

Conversation

@zshang-oai
Copy link
Copy Markdown
Contributor

@zshang-oai zshang-oai commented May 20, 2026

Summary

Reduce the remaining low-risk LPC synthesis overhead in the SILK decode hot path. This now sits directly on main after #115 merged.

Major changes

  • Reuse the steady-state LPC synthesis path for the first SILK subframe by building a small contiguous history buffer from the previous-frame LPC tail plus the current subframe output.
  • Replace the two-array normalized/reversed LPC weight preparation with one reversed normalized coefficient array, because both optimized paths walk history oldest-to-newest.
  • Add a fixed-width 16-tap Go fast path for wideband LPC synthesis, keeping the generic loop for the 10-tap narrowband/mediumband case.
  • Name the first-subframe scratch bound from the SILK LPC-order and subframe-size limits instead of leaving the old 96 as an implicit assumption.

Why

After #114 and #115 remove the larger allocation and copy costs, the remaining SILK decode profile still spends visible time in the branchy first-subframe LPC reconstruction and in the generic 16-tap loop used by wideband frames.

This keeps the same floating-point decoder behavior, but removes per-tap history branching on the first subframe and lets the common 16-tap case run without the generic inner loop.

Validation

Ran:

GOCACHE=/private/tmp/opus-go-build-pr116-rebase GOLANGCI_LINT_CACHE=/private/tmp/opus-golangci-lint-pr116-rebase golangci-lint run
GOCACHE=/private/tmp/opus-go-build-pr116-rebase go test ./...

End-to-end stress harness only, no focused microbenchmark.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 20, 2026

Codecov Report

❌ Patch coverage is 95.34884% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.80%. Comparing base (ee1d1de) to head (a19859e).

Files with missing lines Patch % Lines
internal/silk/decoder.go 95.34% 1 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #116      +/-   ##
==========================================
+ Coverage   82.75%   82.80%   +0.04%     
==========================================
  Files          26       26              
  Lines        5626     5652      +26     
==========================================
+ Hits         4656     4680      +24     
- Misses        745      746       +1     
- Partials      225      226       +1     
Flag Coverage Δ
go 82.80% <95.34%> (+0.04%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 21, 2026

RFC 6716 / 8251 conformation

Status: pass

The action extracts the RFC 6716 reference implementation, applies the RFC 8251 decoder update patch, and then builds the patched reference tools.

Legend: numeric cells are opus_compare quality percentages; FAIL means the vector did not pass.

Inputs use the shared RFC 6716 / RFC 8251 bitstream corpus; accepted references follow RFC 8251 Section 11.

rate ch 01 02 03 04 05 06 07 08 09 10 11 12
8000 1 91.4 59.7 66.3 75.1 75.0 67.7 76.0 70.0 75.5 85.9 91.0 43.4
8000 2 93.3 57.6 66.1 75.3 75.2 67.8 76.0 70.4 76.2 86.0 93.0 43.7
12000 1 95.6 83.4 71.8 79.1 77.0 68.9 85.1 81.6 84.8 88.1 94.9 66.0
12000 2 96.0 83.3 71.3 79.2 77.3 69.1 85.1 81.8 85.2 87.0 95.8 66.1
16000 1 95.3 91.4 88.1 81.6 77.2 68.9 89.9 86.2 78.8 89.5 96.3 56.5
16000 2 94.7 90.7 88.1 80.6 77.6 69.1 89.8 87.6 78.9 87.5 96.4 56.7
24000 1 96.7 92.0 83.2 85.9 77.5 68.4 93.9 92.4 89.2 95.4 97.9 68.5
24000 2 96.8 90.6 82.8 86.1 77.8 68.7 93.9 93.5 92.1 87.7 98.1 68.6
48000 1 98.4 92.1 87.7 85.9 77.4 68.3 98.1 96.2 95.9 96.0 98.4 88.8
48000 2 99.8 90.6 87.8 86.1 77.7 68.6 99.6 93.7 94.4 87.7 99.7 88.9
Run output
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector08
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector10: Opus quality metric: 86.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector07
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector09: Opus quality metric: 76.2 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector08: Opus quality metric: 70.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector07: Opus quality metric: 76.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector04
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector11: Opus quality metric: 93.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector04: Opus quality metric: 75.3 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02: Opus quality metric: 57.6 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08: Opus quality metric: 70.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06: Opus quality metric: 67.8 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05: Opus quality metric: 75.2 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12: Opus quality metric: 43.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10: Opus quality metric: 85.9 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09: Opus quality metric: 75.5 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01: Opus quality metric: 93.3 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11: Opus quality metric: 91.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03: Opus quality metric: 66.3 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07: Opus quality metric: 76.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector04
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04: Opus quality metric: 75.1 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector11
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05: Opus quality metric: 75.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06: Opus quality metric: 67.7 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector01
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02: Opus quality metric: 90.7 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector12
TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector04: Opus quality metric: 86.1 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02: Opus quality metric: 59.7 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector09
TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector12: Opus quality metric: 56.5 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector10
TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector11: Opus quality metric: 96.3 %
=== CONT  TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector03
TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector10: Opus quality metric: 89.5 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector08
TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector09: Opus quality metric: 78.8 %
=== CONT  TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector03
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector03: Opus quality metric: 88.1 %
TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector01: Opus quality metric: 94.7 %
TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector03: Opus quality metric: 87.8 %
TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector08: Opus quality metric: 86.2 %
Opus conformance matrix
Legend: numeric cells are opus_compare quality percentages; FAIL means the vector did not pass.
Inputs use the shared RFC 6716 / RFC 8251 bitstream corpus; accepted references follow RFC 8251 Section 11.
+----------+----+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| rate     | ch | 01    | 02    | 03    | 04    | 05    | 06    | 07    | 08    | 09    | 10    | 11    | 12    |
+----------+----+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| 8000     | 1  | 91.4  | 59.7  | 66.3  | 75.1  | 75.0  | 67.7  | 76.0  | 70.0  | 75.5  | 85.9  | 91.0  | 43.4  |
| 8000     | 2  | 93.3  | 57.6  | 66.1  | 75.3  | 75.2  | 67.8  | 76.0  | 70.4  | 76.2  | 86.0  | 93.0  | 43.7  |
| 12000    | 1  | 95.6  | 83.4  | 71.8  | 79.1  | 77.0  | 68.9  | 85.1  | 81.6  | 84.8  | 88.1  | 94.9  | 66.0  |
| 12000    | 2  | 96.0  | 83.3  | 71.3  | 79.2  | 77.3  | 69.1  | 85.1  | 81.8  | 85.2  | 87.0  | 95.8  | 66.1  |
| 16000    | 1  | 95.3  | 91.4  | 88.1  | 81.6  | 77.2  | 68.9  | 89.9  | 86.2  | 78.8  | 89.5  | 96.3  | 56.5  |
| 16000    | 2  | 94.7  | 90.7  | 88.1  | 80.6  | 77.6  | 69.1  | 89.8  | 87.6  | 78.9  | 87.5  | 96.4  | 56.7  |
| 24000    | 1  | 96.7  | 92.0  | 83.2  | 85.9  | 77.5  | 68.4  | 93.9  | 92.4  | 89.2  | 95.4  | 97.9  | 68.5  |
| 24000    | 2  | 96.8  | 90.6  | 82.8  | 86.1  | 77.8  | 68.7  | 93.9  | 93.5  | 92.1  | 87.7  | 98.1  | 68.6  |
| 48000    | 1  | 98.4  | 92.1  | 87.7  | 85.9  | 77.4  | 68.3  | 98.1  | 96.2  | 95.9  | 96.0  | 98.4  | 88.8  |
| 48000    | 2  | 99.8  | 90.6  | 87.8  | 86.1  | 77.7  | 68.6  | 99.6  | 93.7  | 94.4  | 87.7  | 99.7  | 88.9  |
+----------+----+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
--- PASS: TestRFC6716Conformance (413.15s)
    --- PASS: TestRFC6716Conformance/vectors (0.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector12 (7.06s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector02 (9.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector01 (10.17s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector12 (13.88s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector01 (25.29s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector08 (24.92s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector07 (7.10s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector10 (23.68s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector09 (24.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector11 (41.07s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector10 (12.06s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector11 (20.55s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector09 (12.50s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector08 (12.58s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector07 (8.97s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector04 (4.96s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector03 (3.92s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector06 (12.48s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector02 (4.66s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector05 (13.46s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector12 (10.41s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector01 (12.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector10 (19.59s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector09 (20.95s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector08 (21.40s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector07 (14.97s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector11 (37.37s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector03 (4.97s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector04 (6.36s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector02 (5.91s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector06 (21.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector12 (5.30s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector05 (23.45s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector10 (10.07s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector01 (21.29s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector09 (10.82s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector11 (18.87s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector07 (7.53s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector08 (10.88s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector04 (3.25s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector03 (2.57s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector06 (10.89s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector02 (3.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector05 (11.73s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector12 (9.59s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector01 (10.88s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector10 (18.76s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector09 (20.15s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector08 (20.61s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector11 (36.47s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector07 (14.22s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector04 (5.49s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector06 (20.65s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector05 (22.49s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector04 (2.69s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector07 (17.76s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector05 (26.76s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector06 (10.57s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector04 (2.80s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector03 (2.25s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector02 (2.65s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector05 (11.40s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector06 (24.88s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector12 (9.30s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector01 (10.40s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector10 (18.33s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector09 (19.85s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector08 (20.43s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector07 (14.11s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector11 (36.29s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector03 (4.13s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector04 (5.23s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector02 (4.86s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector06 (20.72s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector12 (4.72s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector05 (22.50s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector10 (9.38s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector09 (10.18s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector01 (20.23s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector11 (18.15s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector07 (7.05s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector08 (10.25s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector06 (10.39s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03 (4.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector03 (2.11s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector02 (2.47s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector05 (11.23s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector12 (9.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector01 (10.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector10 (18.04s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector09 (19.61s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector08 (20.04s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector07 (13.79s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector11 (35.88s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector04 (4.98s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02 (4.70s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08 (10.22s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06 (20.30s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05 (22.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12 (4.65s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10 (9.20s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09 (10.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01 (19.92s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11 (18.10s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03 (2.01s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07 (7.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04 (2.57s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05 (11.20s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06 (10.26s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02 (5.19s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector04 (9.77s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02 (2.39s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector12 (4.91s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector11 (18.16s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector10 (9.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector09 (10.28s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector03 (4.44s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector01 (20.21s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector03 (7.63s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector08 (8.13s)
PASS
ok  	github.com/pion/opus	413.155s

@zshang-oai zshang-oai force-pushed the codex/reduce-silk-decode-hot-path branch from f861bef to 7a0a95c Compare May 21, 2026 03:25
@zshang-oai zshang-oai closed this May 21, 2026
@zshang-oai zshang-oai force-pushed the codex/reduce-silk-lpc-synthesis branch from 3845541 to 7a0a95c Compare May 21, 2026 03:26
@zshang-oai zshang-oai reopened this May 21, 2026
@zshang-oai zshang-oai requested a review from Copilot May 21, 2026 04:30
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR further optimizes the SILK decoder LPC synthesis hot path by removing remaining per-sample branching in the first-subframe case and adding a specialized wideband (16-tap) steady-state implementation.

Changes:

  • Replaces dual normalized/reversed LPC coefficient prep with a single reversed+normalized coefficient array.
  • Reworks first-subframe LPC synthesis to reuse the steady-state path by constructing a contiguous history+output buffer.
  • Adds an unrolled 16-tap steady-state LPC synthesis fast path for wideband frames while keeping the generic loop for 10-tap cases.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/silk/decoder.go Outdated
@zshang-oai zshang-oai force-pushed the codex/reduce-silk-lpc-synthesis branch from 02c9e11 to a19859e Compare May 21, 2026 20:16
@zshang-oai zshang-oai changed the title [3/3] Optimize SILK LPC synthesis [3/4] Optimize SILK LPC synthesis May 21, 2026
@zshang-oai zshang-oai changed the base branch from codex/reduce-silk-decode-hot-path to main May 21, 2026 20:16
@zshang-oai zshang-oai force-pushed the codex/reduce-silk-lpc-synthesis branch from 02c9e11 to a19859e Compare May 21, 2026 20:16
@zshang-oai zshang-oai closed this May 21, 2026
@zshang-oai zshang-oai reopened this May 21, 2026
@zshang-oai zshang-oai marked this pull request as draft May 21, 2026 21:47
@zshang-oai
Copy link
Copy Markdown
Contributor Author

Abandoning this draft; the measured gain on the production-like 48 kHz stereo conformance decode workload is too small to carry forward.

@zshang-oai zshang-oai closed this May 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants