diff options
Diffstat (limited to 'tools/editor/dct.js')
| -rw-r--r-- | tools/editor/dct.js | 168 |
1 files changed, 0 insertions, 168 deletions
diff --git a/tools/editor/dct.js b/tools/editor/dct.js deleted file mode 100644 index c081473..0000000 --- a/tools/editor/dct.js +++ /dev/null @@ -1,168 +0,0 @@ -const dctSize = 512; // Default DCT size, read from header - -// --- Utility Functions for Audio Processing --- - -// Hanning window for smooth audio transitions (JavaScript equivalent) -function hanningWindow(size) { - const window = new Float32Array(size); - const PI = Math.PI; - for (let i = 0; i < size; i++) { - window[i] = 0.5 * (1 - Math.cos((2 * PI * i) / (size - 1))); - } - return window; -} - -const hanningWindowArray = hanningWindow(dctSize); // Pre-calculate window - -// ============================================================================ -// FFT-based DCT/IDCT Implementation -// ============================================================================ - -// Bit-reversal permutation (in-place) -function bitReversePermute(real, imag, N) { - let temp_bits = N; - let num_bits = 0; - while (temp_bits > 1) { - temp_bits >>= 1; - num_bits++; - } - - for (let i = 0; i < N; i++) { - let j = 0; - let temp = i; - for (let b = 0; b < num_bits; b++) { - j = (j << 1) | (temp & 1); - temp >>= 1; - } - - if (j > i) { - const tmp_real = real[i]; - const tmp_imag = imag[i]; - real[i] = real[j]; - imag[i] = imag[j]; - real[j] = tmp_real; - imag[j] = tmp_imag; - } - } -} - -// In-place radix-2 FFT -function fftRadix2(real, imag, N, direction) { - const PI = Math.PI; - - for (let stage_size = 2; stage_size <= N; stage_size *= 2) { - const half_stage = stage_size / 2; - const angle = direction * 2.0 * PI / stage_size; - - let wr = 1.0; - let wi = 0.0; - const wr_delta = Math.cos(angle); - const wi_delta = Math.sin(angle); - - for (let k = 0; k < half_stage; k++) { - for (let group_start = k; group_start < N; group_start += stage_size) { - const i = group_start; - const j = group_start + half_stage; - - const temp_real = real[j] * wr - imag[j] * wi; - const temp_imag = real[j] * wi + imag[j] * wr; - - real[j] = real[i] - temp_real; - imag[j] = imag[i] - temp_imag; - real[i] = real[i] + temp_real; - imag[i] = imag[i] + temp_imag; - } - - const wr_old = wr; - wr = wr_old * wr_delta - wi * wi_delta; - wi = wr_old * wi_delta + wi * wr_delta; - } - } -} - -function fftForward(real, imag, N) { - bitReversePermute(real, imag, N); - fftRadix2(real, imag, N, +1); -} - -function fftInverse(real, imag, N) { - bitReversePermute(real, imag, N); - fftRadix2(real, imag, N, -1); - - const scale = 1.0 / N; - for (let i = 0; i < N; i++) { - real[i] *= scale; - imag[i] *= scale; - } -} - -// DCT-II via FFT using reordering method -function javascript_dct_fft(input, N) { - const PI = Math.PI; - - const real = new Float32Array(N); - const imag = new Float32Array(N); - - for (let i = 0; i < N / 2; i++) { - real[i] = input[2 * i]; - real[N - 1 - i] = input[2 * i + 1]; - } - - fftForward(real, imag, N); - - const output = new Float32Array(N); - for (let k = 0; k < N; k++) { - const angle = -PI * k / (2.0 * N); - const wr = Math.cos(angle); - const wi = Math.sin(angle); - - const dct_value = real[k] * wr - imag[k] * wi; - - if (k === 0) { - output[k] = dct_value * Math.sqrt(1.0 / N); - } else { - output[k] = dct_value * Math.sqrt(2.0 / N); - } - } - - return output; -} - -// IDCT (DCT-III) via FFT using reordering method -function javascript_idct_fft(input, N) { - const PI = Math.PI; - - const real = new Float32Array(N); - const imag = new Float32Array(N); - - for (let k = 0; k < N; k++) { - const angle = PI * k / (2.0 * N); - const wr = Math.cos(angle); - const wi = Math.sin(angle); - - let scaled; - if (k === 0) { - scaled = input[k] / Math.sqrt(1.0 / N); - } else { - scaled = input[k] / Math.sqrt(2.0 / N) * 2.0; - } - - real[k] = scaled * wr; - imag[k] = scaled * wi; - } - - fftInverse(real, imag, N); - - const output = new Float32Array(N); - for (let i = 0; i < N / 2; i++) { - output[2 * i] = real[i]; - output[2 * i + 1] = real[N - 1 - i]; - } - - return output; -} - -// Fast O(N log N) IDCT using FFT -function javascript_idct_512(input) { - return javascript_idct_fft(input, dctSize); -} |
