From 41af42154017e323707018d5f46feaea538da7b8 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Fri, 30 Nov 2007 18:35:37 +1100 Subject: [PATCH] Oops, forgot to add the Ghost/ceft vq files --- libcelt/vq.c | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++ libcelt/vq.h | 48 +++++++++++ 2 files changed, 268 insertions(+) create mode 100644 libcelt/vq.c create mode 100644 libcelt/vq.h diff --git a/libcelt/vq.c b/libcelt/vq.c new file mode 100644 index 000000000..7be914482 --- /dev/null +++ b/libcelt/vq.c @@ -0,0 +1,220 @@ +/* (C) 2007 Jean-Marc Valin, CSIRO +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +/* Algebraic pulse-base quantiser. The signal x is replaced by the sum of the pitch + a combination of pulses such that its norm is still equal to 1 */ +void alg_quant(float *x, int N, int K, float *p) +{ + float y[N]; + int i,j; + float xy = 0; + float yy = 0; + float yp = 0; + float Rpp=0; + float gain=0; + for (j=0;j0) + tmp_yp = yp + p[j]; + else + tmp_yp = yp - p[j]; + g = (sqrt(tmp_yp*tmp_yp + tmp_yy - tmp_yy*Rpp) - tmp_yp)/tmp_yy; + score = 2*g*tmp_xy - g*g*tmp_yy; + if (score>max_val) + { + max_val = score; + best_id = j; + best_xy = tmp_xy; + best_yy = tmp_yy; + best_yp = tmp_yp; + gain = g; + } + } + + xy = best_xy; + yy = best_yy; + yp = best_yp; + if (x[best_id]>0) + y[best_id] += 1; + else + y[best_id] -= 1; + } + + for (i=0;imaxL) + { + L2 = maxL; + maxL *= N; + } + for (m=0;m0) + tmp_yp = yp[m] + p[j]; + else + tmp_yp = yp[m] - p[j]; + g = (sqrt(tmp_yp*tmp_yp + tmp_yy - tmp_yy*Rpp) - tmp_yp)/tmp_yy; + score = 2*g*tmp_xy - g*g*tmp_yy; + + if (score>best_scores[L-1]) + { + int k, n; + int id = L-1; + while (id > 0 && score > best_scores[id-1]) + id--; + + for (k=L-1;k>id;k--) + { + nxy[k] = nxy[k-1]; + nyy[k] = nyy[k-1]; + nyp[k] = nyp[k-1]; + //fprintf(stderr, "%d %d \n", N, k); + for (n=0;n0) + ny[id][j] += 1; + else + ny[id][j] -= 1; + best_scores[id] = score; + } + + } + + } + int k,n; + for (k=0;k