From 791cfe1f0a4e09a0639ca30a2be1ae68974413a2 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Fri, 21 May 2010 15:44:06 -0400 Subject: [PATCH] Increasing the temporal resolution of transients Apply a one-level Haar transform (or Hadamard) on each short MDCT to nearly double the time-domain resolution. --- libcelt/bands.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/libcelt/bands.c b/libcelt/bands.c index 7fbbca41..034806ff 100644 --- a/libcelt/bands.c +++ b/libcelt/bands.c @@ -452,6 +452,19 @@ static void deinterleave_vector(celt_norm *X, int N0, int stride) RESTORE_STACK; } +static void haar1(celt_norm *X, int N0, int stride) +{ + int i, j; + N0 >>= 1; + for (i=0;i1 && level==0) { + if ((N_B&1) == 0) + { + spread <<= 1; + N_B >>= 1; + do_haar = 1; + if (encode) + haar1(X, N_B0, spread0); + if (lowband) + haar1(lowband, N_B0, spread0); + spread0 = spread; + } if (encode) - deinterleave_vector(X, N_B, spread); + deinterleave_vector(X, N_B, spread0); if (lowband) - deinterleave_vector(lowband, N_B, spread); + deinterleave_vector(lowband, N_B, spread0); } /* If we need more than 32 bits, try splitting the band in two. */ @@ -752,6 +779,12 @@ static void quant_band(int encode, const CELTMode *m, int i, celt_norm *X, celt_ interleave_vector(X, N_B, spread0); if (lowband) interleave_vector(lowband, N_B, spread0); + if (do_haar) + { + haar1(X, N_B0, spread0>>1); + if (lowband) + haar1(lowband, N_B0, spread0>>1); + } } if (lowband_out && !stereo)