FreeCalypso > hg > gsm-codec-lib
comparison libtwamr/cor_h.c @ 315:5401aaf7acb0
libtwamr: integrate cor_h.c
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Thu, 18 Apr 2024 17:39:10 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 314:15c354f75110 | 315:5401aaf7acb0 |
|---|---|
| 1 /* | |
| 2 ***************************************************************************** | |
| 3 * | |
| 4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 | |
| 5 * R99 Version 3.3.0 | |
| 6 * REL-4 Version 4.1.0 | |
| 7 * | |
| 8 ****************************************************************************** | |
| 9 * | |
| 10 * File : cor_h.c | |
| 11 * Purpose : correlation functions for codebook search | |
| 12 * | |
| 13 ***************************************************************************** | |
| 14 */ | |
| 15 /* | |
| 16 ***************************************************************************** | |
| 17 * MODULE INCLUDE FILE AND VERSION ID | |
| 18 ***************************************************************************** | |
| 19 */ | |
| 20 #include "namespace.h" | |
| 21 #include "cor_h.h" | |
| 22 /* | |
| 23 ***************************************************************************** | |
| 24 * INCLUDE FILES | |
| 25 ***************************************************************************** | |
| 26 */ | |
| 27 #include "typedef.h" | |
| 28 #include "basic_op.h" | |
| 29 #include "no_count.h" | |
| 30 #include "inv_sqrt.h" | |
| 31 #include "cnst.h" | |
| 32 | |
| 33 /* | |
| 34 ***************************************************************************** | |
| 35 * PUBLIC PROGRAM CODE | |
| 36 ***************************************************************************** | |
| 37 */ | |
| 38 /************************************************************************* | |
| 39 * | |
| 40 * FUNCTION: cor_h_x() | |
| 41 * | |
| 42 * PURPOSE: Computes correlation between target signal "x[]" and | |
| 43 * impulse response"h[]". | |
| 44 * | |
| 45 * DESCRIPTION: | |
| 46 * The correlation is given by: | |
| 47 * d[n] = sum_{i=n}^{L-1} x[i] h[i-n] n=0,...,L-1 | |
| 48 * | |
| 49 * d[n] is normalized such that the sum of 5 maxima of d[n] corresponding | |
| 50 * to each position track does not saturate. | |
| 51 * | |
| 52 *************************************************************************/ | |
| 53 void cor_h_x ( | |
| 54 Word16 h[], /* (i): impulse response of weighted synthesis filter */ | |
| 55 Word16 x[], /* (i): target */ | |
| 56 Word16 dn[], /* (o): correlation between target and h[] */ | |
| 57 Word16 sf /* (i): scaling factor: 2 for 12.2, 1 for others */ | |
| 58 ) | |
| 59 { | |
| 60 cor_h_x2(h, x, dn, sf, NB_TRACK, STEP); | |
| 61 } | |
| 62 | |
| 63 /************************************************************************* | |
| 64 * | |
| 65 * FUNCTION: cor_h_x2() | |
| 66 * | |
| 67 * PURPOSE: Computes correlation between target signal "x[]" and | |
| 68 * impulse response"h[]". | |
| 69 * | |
| 70 * DESCRIPTION: | |
| 71 * See cor_h_x, d[n] can be normalized regards to sum of the | |
| 72 * five MR122 maxima or the four MR102 maxima. | |
| 73 * | |
| 74 *************************************************************************/ | |
| 75 void cor_h_x2 ( | |
| 76 Word16 h[], /* (i): impulse response of weighted synthesis filter */ | |
| 77 Word16 x[], /* (i): target */ | |
| 78 Word16 dn[], /* (o): correlation between target and h[] */ | |
| 79 Word16 sf, /* (i): scaling factor: 2 for 12.2, 1 for others */ | |
| 80 Word16 nb_track,/* (i): the number of ACB tracks */ | |
| 81 Word16 step /* (i): step size from one pulse position to the next | |
| 82 in one track */ | |
| 83 ) | |
| 84 { | |
| 85 Word16 i, j, k; | |
| 86 Word32 s, y32[L_CODE], max, tot; | |
| 87 | |
| 88 /* first keep the result on 32 bits and find absolute maximum */ | |
| 89 | |
| 90 tot = 5; move32 (); | |
| 91 | |
| 92 for (k = 0; k < nb_track; k++) | |
| 93 { | |
| 94 max = 0; move32 (); | |
| 95 for (i = k; i < L_CODE; i += step) | |
| 96 { | |
| 97 s = 0; move32 (); | |
| 98 for (j = i; j < L_CODE; j++) | |
| 99 s = L_mac (s, x[j], h[j - i]); | |
| 100 | |
| 101 y32[i] = s; move32 (); | |
| 102 | |
| 103 s = L_abs (s); | |
| 104 test (); | |
| 105 if (L_sub (s, max) > (Word32) 0L) | |
| 106 max = s; move32 (); | |
| 107 } | |
| 108 tot = L_add (tot, L_shr (max, 1)); | |
| 109 } | |
| 110 | |
| 111 j = sub (norm_l (tot), sf); | |
| 112 | |
| 113 for (i = 0; i < L_CODE; i++) | |
| 114 { | |
| 115 dn[i] = round (L_shl (y32[i], j)); move16 (); | |
| 116 } | |
| 117 } | |
| 118 | |
| 119 /************************************************************************* | |
| 120 * | |
| 121 * FUNCTION: cor_h() | |
| 122 * | |
| 123 * PURPOSE: Computes correlations of h[] needed for the codebook search; | |
| 124 * and includes the sign information into the correlations. | |
| 125 * | |
| 126 * DESCRIPTION: The correlations are given by | |
| 127 * rr[i][j] = sum_{n=i}^{L-1} h[n-i] h[n-j]; i>=j; i,j=0,...,L-1 | |
| 128 * | |
| 129 * and the sign information is included by | |
| 130 * rr[i][j] = rr[i][j]*sign[i]*sign[j] | |
| 131 * | |
| 132 *************************************************************************/ | |
| 133 | |
| 134 void cor_h ( | |
| 135 Word16 h[], /* (i) : impulse response of weighted synthesis | |
| 136 filter */ | |
| 137 Word16 sign[], /* (i) : sign of d[n] */ | |
| 138 Word16 rr[][L_CODE] /* (o) : matrix of autocorrelation */ | |
| 139 ) | |
| 140 { | |
| 141 Word16 i, j, k, dec, h2[L_CODE]; | |
| 142 Word32 s; | |
| 143 | |
| 144 /* Scaling for maximum precision */ | |
| 145 | |
| 146 s = 2; move32 (); | |
| 147 for (i = 0; i < L_CODE; i++) | |
| 148 s = L_mac (s, h[i], h[i]); | |
| 149 | |
| 150 j = sub (extract_h (s), 32767); | |
| 151 test (); | |
| 152 if (j == 0) | |
| 153 { | |
| 154 for (i = 0; i < L_CODE; i++) | |
| 155 { | |
| 156 h2[i] = shr (h[i], 1); move16 (); | |
| 157 } | |
| 158 } | |
| 159 else | |
| 160 { | |
| 161 s = L_shr (s, 1); | |
| 162 k = extract_h (L_shl (Inv_sqrt (s), 7)); | |
| 163 k = mult (k, 32440); /* k = 0.99*k */ | |
| 164 | |
| 165 for (i = 0; i < L_CODE; i++) | |
| 166 { | |
| 167 h2[i] = round (L_shl (L_mult (h[i], k), 9)); | |
| 168 move16 (); | |
| 169 } | |
| 170 } | |
| 171 | |
| 172 /* build matrix rr[] */ | |
| 173 s = 0; move32 (); | |
| 174 i = L_CODE - 1; | |
| 175 for (k = 0; k < L_CODE; k++, i--) | |
| 176 { | |
| 177 s = L_mac (s, h2[k], h2[k]); | |
| 178 rr[i][i] = round (s); move16 (); | |
| 179 } | |
| 180 | |
| 181 for (dec = 1; dec < L_CODE; dec++) | |
| 182 { | |
| 183 s = 0; move32 (); | |
| 184 j = L_CODE - 1; | |
| 185 i = sub (j, dec); | |
| 186 for (k = 0; k < (L_CODE - dec); k++, i--, j--) | |
| 187 { | |
| 188 s = L_mac (s, h2[k], h2[k + dec]); | |
| 189 rr[j][i] = mult (round (s), mult (sign[i], sign[j])); | |
| 190 move16 (); | |
| 191 rr[i][j] = rr[j][i]; move16 (); | |
| 192 } | |
| 193 } | |
| 194 } |
