OLD | NEW |
(Empty) | |
| 1 /* Copyright (C) 2002 Jean-Marc Valin |
| 2 File: vq.c |
| 3 Vector quantization |
| 4 |
| 5 Redistribution and use in source and binary forms, with or without |
| 6 modification, are permitted provided that the following conditions |
| 7 are met: |
| 8 |
| 9 - Redistributions of source code must retain the above copyright |
| 10 notice, this list of conditions and the following disclaimer. |
| 11 |
| 12 - Redistributions in binary form must reproduce the above copyright |
| 13 notice, this list of conditions and the following disclaimer in the |
| 14 documentation and/or other materials provided with the distribution. |
| 15 |
| 16 - Neither the name of the Xiph.org Foundation nor the names of its |
| 17 contributors may be used to endorse or promote products derived from |
| 18 this software without specific prior written permission. |
| 19 |
| 20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 21 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 22 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 23 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR |
| 24 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| 25 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 26 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 27 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| 28 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| 29 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 30 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 31 */ |
| 32 |
| 33 #ifdef HAVE_CONFIG_H |
| 34 #include "config.h" |
| 35 #endif |
| 36 |
| 37 #include "vq.h" |
| 38 #include "stack_alloc.h" |
| 39 #include "arch.h" |
| 40 |
| 41 #ifdef _USE_SSE |
| 42 #include <xmmintrin.h> |
| 43 #include "vq_sse.h" |
| 44 #elif defined(SHORTCUTS) && (defined(ARM4_ASM) || defined(ARM5E_ASM)) |
| 45 #include "vq_arm4.h" |
| 46 #elif defined(BFIN_ASM) |
| 47 #include "vq_bfin.h" |
| 48 #endif |
| 49 |
| 50 |
| 51 int scal_quant(spx_word16_t in, const spx_word16_t *boundary, int entries) |
| 52 { |
| 53 int i=0; |
| 54 while (i<entries-1 && in>boundary[0]) |
| 55 { |
| 56 boundary++; |
| 57 i++; |
| 58 } |
| 59 return i; |
| 60 } |
| 61 |
| 62 int scal_quant32(spx_word32_t in, const spx_word32_t *boundary, int entries) |
| 63 { |
| 64 int i=0; |
| 65 while (i<entries-1 && in>boundary[0]) |
| 66 { |
| 67 boundary++; |
| 68 i++; |
| 69 } |
| 70 return i; |
| 71 } |
| 72 |
| 73 |
| 74 #ifndef OVERRIDE_VQ_NBEST |
| 75 /*Finds the indices of the n-best entries in a codebook*/ |
| 76 void vq_nbest(spx_word16_t *in, const spx_word16_t *codebook, int len, int entri
es, spx_word32_t *E, int N, int *nbest, spx_word32_t *best_dist, char *stack) |
| 77 { |
| 78 int i,j,k,used; |
| 79 used = 0; |
| 80 for (i=0;i<entries;i++) |
| 81 { |
| 82 spx_word32_t dist=0; |
| 83 for (j=0;j<len;j++) |
| 84 dist = MAC16_16(dist,in[j],*codebook++); |
| 85 #ifdef FIXED_POINT |
| 86 dist=SUB32(SHR32(E[i],1),dist); |
| 87 #else |
| 88 dist=.5f*E[i]-dist; |
| 89 #endif |
| 90 if (i<N || dist<best_dist[N-1]) |
| 91 { |
| 92 for (k=N-1; (k >= 1) && (k > used || dist < best_dist[k-1]); k--) |
| 93 { |
| 94 best_dist[k]=best_dist[k-1]; |
| 95 nbest[k] = nbest[k-1]; |
| 96 } |
| 97 best_dist[k]=dist; |
| 98 nbest[k]=i; |
| 99 used++; |
| 100 } |
| 101 } |
| 102 } |
| 103 #endif |
| 104 |
| 105 |
| 106 |
| 107 |
| 108 #ifndef OVERRIDE_VQ_NBEST_SIGN |
| 109 /*Finds the indices of the n-best entries in a codebook with sign*/ |
| 110 void vq_nbest_sign(spx_word16_t *in, const spx_word16_t *codebook, int len, int
entries, spx_word32_t *E, int N, int *nbest, spx_word32_t *best_dist, char *stac
k) |
| 111 { |
| 112 int i,j,k, sign, used; |
| 113 used=0; |
| 114 for (i=0;i<entries;i++) |
| 115 { |
| 116 spx_word32_t dist=0; |
| 117 for (j=0;j<len;j++) |
| 118 dist = MAC16_16(dist,in[j],*codebook++); |
| 119 if (dist>0) |
| 120 { |
| 121 sign=0; |
| 122 dist=-dist; |
| 123 } else |
| 124 { |
| 125 sign=1; |
| 126 } |
| 127 #ifdef FIXED_POINT |
| 128 dist = ADD32(dist,SHR32(E[i],1)); |
| 129 #else |
| 130 dist = ADD32(dist,.5f*E[i]); |
| 131 #endif |
| 132 if (i<N || dist<best_dist[N-1]) |
| 133 { |
| 134 for (k=N-1; (k >= 1) && (k > used || dist < best_dist[k-1]); k--) |
| 135 { |
| 136 best_dist[k]=best_dist[k-1]; |
| 137 nbest[k] = nbest[k-1]; |
| 138 } |
| 139 best_dist[k]=dist; |
| 140 nbest[k]=i; |
| 141 used++; |
| 142 if (sign) |
| 143 nbest[k]+=entries; |
| 144 } |
| 145 } |
| 146 } |
| 147 #endif |
OLD | NEW |