blob: 1fb2a4a08eaea9aede62caecdf457b2f995ca0e4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
// 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);
// Single-frame OLA-IDCT decoder.
// spec_frame: single DCT_SIZE spectral frame.
// overlap: OLA_OVERLAP buffer (read/write). Must be zero-initialized for first frame.
// out_hop: OLA_HOP_SIZE buffer for the resulting time-domain samples.
void ola_decode_frame(const float* spec_frame, float* overlap, float* out_hop);
|