summaryrefslogtreecommitdiff
path: root/src/audio/window.cc
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-03-02 09:38:46 +0100
committerskal <pascal.massimino@gmail.com>2026-03-02 09:38:46 +0100
commitbb8197075161f9c9ded51beab913150b43954e2c (patch)
treec3835a0cb2133be28e5cc695b487395250fd1ea0 /src/audio/window.cc
parentb2ca699723b1695bd712ec68635a947c6ca3fd42 (diff)
feat(audio): OLA-IDCT synthesis with Hann window to eliminate clicks
Add v2 spectrogram format (SPEC_VERSION_V2_OLA) using overlap-add IDCT with 50% overlap (hop=256, OLA_OVERLAP=256) and Hann windowing. - dct.h: OLA_HOP_SIZE=256, OLA_OVERLAP=256 - synth.h: SPEC_VERSION_V1/V2_OLA constants; version field on Spectrogram - window.h/cc: hann_window_512() alongside existing hamming_window_512() - synth.cc: g_hann[] precomputed at init; OLA path in synth_render when ola_mode=true (IDCT -> Hann -> add overlap tail -> save new tail -> output OLA_HOP_SIZE samples); v1 path unchanged for backward compat - tracker.cc: MP3 encoder now uses sliding 512-sample Hann window with OLA_HOP_SIZE advance per frame; sets version=SPEC_VERSION_V2_OLA; .spec files propagate header->version; generated notes stay v1 Existing .spec files must be regenerated to benefit from click-free OLA. handoff(Claude): OLA done. .spec files need regen via MP3 tool to activate v2.
Diffstat (limited to 'src/audio/window.cc')
-rw-r--r--src/audio/window.cc8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/audio/window.cc b/src/audio/window.cc
index b68c747..bcdd768 100644
--- a/src/audio/window.cc
+++ b/src/audio/window.cc
@@ -12,3 +12,11 @@ void hamming_window_512(float* window) {
0.54f - 0.46f * cosf(2.0f * PI * (float)i / (float)(WINDOW_SIZE - 1));
}
}
+
+void hann_window_512(float* window) {
+ const float PI = 3.14159265358979323846f;
+ for (int i = 0; i < WINDOW_SIZE; ++i) {
+ window[i] =
+ 0.5f - 0.5f * cosf(2.0f * PI * (float)i / (float)(WINDOW_SIZE - 1));
+ }
+}