Skip to content

Optimize CELT inverse transform#119

Merged
zshang-oai merged 1 commit into
mainfrom
codex/optimize-celt-inverse-transform
May 30, 2026
Merged

Optimize CELT inverse transform#119
zshang-oai merged 1 commit into
mainfrom
codex/optimize-celt-inverse-transform

Conversation

@zshang-oai

Copy link
Copy Markdown
Contributor

Summary

  • reuse CELT and hybrid decode scratch buffers across frames
  • replace the recursive inverse complex DFT with a preplanned mixed-radix inverse FFT
  • keep the transform in Go with precomputed CELT twiddles and bit-reversal tables

Performance

Production-like decode-only conformance harness: RFC8251 packets, 48 kHz stereo, verification hidden, OPUS_STRESS_REPEATS=1.

  • current main: about 799 packets/s median from the earlier run
  • this PR: about 20,424 packets/s median with -benchtime=3x -count=5
  • libopus/hraban reference: about 60,405 packets/s median from the earlier run

This PR is the first CELT optimization split. A follow-up CWRS/PVQ decode optimization is intentionally left out of this draft.

Validation

  • go test ./...
  • go test -tags conformance -run 'TestRFC6716Conformance/vectors/rate_48000/channels_2' -count=1 -parallel=1 .

@codecov

codecov Bot commented May 22, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.24806% with 10 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.87%. Comparing base (ee1d1de) to head (a89e0fe).

Files with missing lines Patch % Lines
internal/celt/synthesis.go 94.49% 4 Missing and 2 partials ⚠️
internal/celt/decoder.go 69.23% 4 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #119      +/-   ##
==========================================
+ Coverage   82.75%   82.87%   +0.11%     
==========================================
  Files          26       26              
  Lines        5626     5711      +85     
==========================================
+ Hits         4656     4733      +77     
- Misses        745      751       +6     
- Partials      225      227       +2     
Flag Coverage Δ
go 82.87% <92.24%> (+0.11%) ⬆️

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

github-actions Bot commented May 22, 2026

Copy link
Copy Markdown

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.8 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.9 76.0 70.4 76.2 86.0 93.0 43.7
12000 1 95.6 83.4 71.8 79.1 77.0 69.0 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.8 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_12000/channels_1/testvector06
TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector08: Opus quality metric: 81.6 %
=== CONT  TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector05
TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector09: Opus quality metric: 84.8 %
=== CONT  TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector04
TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector06: Opus quality metric: 69.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector03
TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector04: Opus quality metric: 79.1 %
=== CONT  TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector02
TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector05: Opus quality metric: 77.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector01
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector04: Opus quality metric: 75.3 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector12
TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector03: Opus quality metric: 71.8 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector11
TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector02: Opus quality metric: 83.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector10
TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector01: Opus quality metric: 95.6 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector09
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector12: Opus quality metric: 43.7 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector08
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector11: Opus quality metric: 93.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector07
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector10: Opus quality metric: 86.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector09: Opus quality metric: 76.2 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector08: Opus quality metric: 70.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector07: Opus quality metric: 76.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06: Opus quality metric: 67.9 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09: Opus quality metric: 75.5 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05: Opus quality metric: 75.2 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03: Opus quality metric: 66.1 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12: Opus quality metric: 43.4 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02: Opus quality metric: 57.6 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11: Opus quality metric: 91.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08
TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01: Opus quality metric: 93.3 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10: Opus quality metric: 85.9 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05: Opus quality metric: 75.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08: Opus quality metric: 70.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07: Opus quality metric: 76.0 %
=== CONT  TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03: Opus quality metric: 66.3 %
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06: Opus quality metric: 67.8 %
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04: Opus quality metric: 75.1 %
TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02: Opus quality metric: 59.7 %
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.8  | 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.9  | 76.0  | 70.4  | 76.2  | 86.0  | 93.0  | 43.7  |
| 12000    | 1  | 95.6  | 83.4  | 71.8  | 79.1  | 77.0  | 69.0  | 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.8  | 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 (123.01s)
    --- PASS: TestRFC6716Conformance/vectors (0.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector01 (2.22s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector01 (4.55s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector12 (6.56s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector11 (7.57s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector10 (8.32s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector09 (7.16s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector07 (5.66s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector08 (6.79s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector06 (6.35s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector03 (5.08s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector05 (6.87s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector04 (6.51s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector12 (3.28s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector02 (6.07s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector11 (3.85s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_2/testvector01 (7.52s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector10 (4.36s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector09 (3.74s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector08 (3.46s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector07 (2.91s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector06 (3.24s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector05 (3.49s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector04 (3.24s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector03 (2.59s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector02 (3.02s)
        --- PASS: TestRFC6716Conformance/vectors/rate_48000/channels_1/testvector01 (3.94s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector12 (4.23s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector11 (5.09s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector10 (5.59s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector09 (4.88s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector08 (4.58s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector07 (3.81s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector06 (4.25s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector04 (4.23s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector05 (4.62s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector03 (3.33s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector12 (2.16s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector02 (3.94s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector11 (2.65s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_2/testvector01 (5.08s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector08 (2.35s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector10 (3.02s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector09 (2.65s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector07 (1.97s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector06 (2.20s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector04 (2.16s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector05 (2.38s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector03 (1.68s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector02 (2.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_24000/channels_1/testvector01 (2.72s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector12 (3.71s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector11 (4.49s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector10 (4.96s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector09 (4.34s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector08 (4.03s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector07 (3.35s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector06 (3.69s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector05 (4.00s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector04 (3.66s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector03 (2.93s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector07 (1.66s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector12 (1.88s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_2/testvector02 (3.46s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector11 (2.35s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector10 (2.66s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector09 (2.40s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector07 (1.75s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector08 (2.07s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector06 (1.94s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector03 (1.48s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector04 (1.87s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector05 (2.07s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector02 (1.75s)
        --- PASS: TestRFC6716Conformance/vectors/rate_16000/channels_1/testvector01 (2.45s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector12 (3.51s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector11 (4.25s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector10 (4.71s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector09 (4.09s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector08 (3.80s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector07 (3.18s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector06 (3.57s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector05 (3.87s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector03 (2.72s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector04 (3.53s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector12 (1.78s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector02 (3.26s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector11 (2.24s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_2/testvector01 (4.25s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector10 (2.52s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector08 (1.97s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector09 (2.23s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector06 (1.85s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector04 (1.78s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector05 (1.99s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector04 (3.35s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector03 (1.38s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector02 (1.63s)
        --- PASS: TestRFC6716Conformance/vectors/rate_12000/channels_1/testvector01 (2.29s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector12 (3.40s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector11 (4.14s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector10 (4.53s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector09 (3.98s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector08 (3.64s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector07 (3.10s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector06 (3.40s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector09 (2.20s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector05 (3.67s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector03 (2.67s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector12 (1.72s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector02 (3.09s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector11 (2.18s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_2/testvector01 (4.12s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector10 (2.47s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector05 (1.92s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector08 (1.90s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector07 (1.61s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector03 (1.35s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector06 (1.79s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector04 (1.52s)
        --- PASS: TestRFC6716Conformance/vectors/rate_8000/channels_1/testvector02 (1.10s)
PASS
ok  	github.com/pion/opus	123.015s

Copilot AI left a comment

Copy link
Copy Markdown

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 focuses on improving CELT (and some hybrid) decode performance by reusing scratch buffers across frames and replacing the inverse complex DFT used in the IMDCT path with a planned mixed-radix inverse FFT implementation, while keeping the transform code in pure Go.

Changes:

  • Introduces persistent per-decoder scratch buffers to reduce per-frame allocations in CELT synthesis and postfiltering.
  • Replaces the inverse complex DFT inner step with a mixed-radix recursive inverse FFT using precomputed twiddle/rotation tables.
  • Reuses scratch buffers for hybrid SILK internal/resampled PCM buffers to reduce allocations in hybrid decode.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

File Description
internal/celt/synthesis.go Adds decoder scratch structs, precomputed inverse-transform plans, and replaces inverse complex DFT with a mixed-radix inverse FFT; switches synthesis to reuse scratch buffers.
internal/celt/decoder.go Adds a lazily allocated scratch buffer to the CELT decoder and updates decode paths to reuse it.
internal/celt/celt.go Introduces maxFrameSampleCount constant to size reusable CELT scratch buffers.
decoder.go Reuses hybrid SILK buffers across frames via a shared resize helper to avoid allocations.

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

Comment thread internal/celt/synthesis.go
@zshang-oai zshang-oai force-pushed the codex/optimize-celt-inverse-transform branch from b8af911 to a89e0fe Compare May 26, 2026 04:00
@zshang-oai zshang-oai marked this pull request as ready for review May 26, 2026 04:01
@zshang-oai zshang-oai requested review from JoTurk and Sean-Der May 26, 2026 04:01
@zshang-oai zshang-oai merged commit 2920812 into main May 30, 2026
20 checks passed
@zshang-oai zshang-oai deleted the codex/optimize-celt-inverse-transform branch May 30, 2026 06:23
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.

3 participants