summaryrefslogtreecommitdiff
path: root/src/audio/ola.h
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-03-05 22:49:48 +0100
committerskal <pascal.massimino@gmail.com>2026-03-05 22:49:48 +0100
commitdb6fbf8b8eae8b96d129ac673cbf11d67926996a (patch)
tree97d28da56a77c17f5583a9342a77cb065b25f31f /src/audio/ola.h
parentb7fc4aa9a6bd15ce9780d46a425971d523c10b92 (diff)
fix(audio): correct OLA synthesis and extract shared ola_encode/ola_decode
- Remove erroneous Hann synthesis window from synth.cc (g_hann * tmp[j]). Hann analysis at 50% overlap satisfies w[n]+w[n+H]=1, so rectangular synthesis gives perfect reconstruction; applying Hann twice was wrong. - Extract ola_encode()/ola_decode()/ola_num_frames() into src/audio/ola.h+cc. spectool and test_wav_roundtrip now use the shared functions. synth.cc lazy-decode path stays inlined (see TODO for future refactor). - Drop dead <atomic> include and g_hann array from synth.cc. - Drop dead window.h include from spectool.cc. - Update PROJECT_CONTEXT.md, COMPLETED.md, TODO.md to reflect correct analysis-only Hann window and new ola.h API. handoff(Gemini): OLA synthesis bug fixed + ola.h factorized. synth.cc lazy-decode still inline (TODO item added). 34/35 tests pass; WavDumpBackendTest failure is pre-existing and unrelated. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'src/audio/ola.h')
-rw-r--r--src/audio/ola.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/audio/ola.h b/src/audio/ola.h
new file mode 100644
index 0000000..3dbc368
--- /dev/null
+++ b/src/audio/ola.h
@@ -0,0 +1,21 @@
+// This file is part of the 64k demo project.
+// Shared OLA encode/decode helpers (Hann analysis, rectangular synthesis).
+// Used by spectool, tests, and any batch PCM<->spec conversion.
+
+#pragma once
+#include "audio/dct.h"
+
+// Returns number of OLA frames for n_samples PCM input.
+static inline int ola_num_frames(int n_samples) {
+ return (n_samples > DCT_SIZE) ? (n_samples - DCT_SIZE) / OLA_HOP_SIZE + 1
+ : 1;
+}
+
+// Hann-windowed FDCT with 50% overlap (analysis).
+// spec must hold ola_num_frames(n_samples) * DCT_SIZE floats.
+void ola_encode(const float* pcm, int n_samples, float* spec, int num_frames);
+
+// IDCT-OLA with rectangular synthesis window (no synthesis window).
+// Hann at 50% overlap satisfies w[n]+w[n+H]=1 → perfect reconstruction.
+// pcm must hold num_frames * OLA_HOP_SIZE floats.
+void ola_decode(const float* spec, int num_frames, float* pcm);