FreeCalypso > hg > gsm-codec-lib
changeset 315:5401aaf7acb0
libtwamr: integrate cor_h.c
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 18 Apr 2024 17:39:10 +0000 |
parents | 15c354f75110 |
children | ebd064c52fe3 |
files | libtwamr/Makefile libtwamr/cor_h.c libtwamr/cor_h.h libtwamr/namespace.h |
diffstat | 4 files changed, 257 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/libtwamr/Makefile Thu Apr 18 16:58:25 2024 +0000 +++ b/libtwamr/Makefile Thu Apr 18 17:39:10 2024 +0000 @@ -1,8 +1,8 @@ CC= gcc CFLAGS= -O2 OBJS= a_refl.o agc.o autocorr.o az_lsp.o b_cn_cod.o basicop2.o bgnscd.o \ - bitno.o bits2prm.o gmed_n.o inv_sqrt.o oper_32b.o prmno.o set_sign.o \ - sqrt_l.o tls_flags.o window.o + bitno.o bits2prm.o cor_h.o gmed_n.o inv_sqrt.o oper_32b.o prmno.o \ + set_sign.o sqrt_l.o tls_flags.o window.o LIB= libtwamr.a INSTALL_PREFIX= /usr/local
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtwamr/cor_h.c Thu Apr 18 17:39:10 2024 +0000 @@ -0,0 +1,194 @@ +/* +***************************************************************************** +* +* GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 +* R99 Version 3.3.0 +* REL-4 Version 4.1.0 +* +****************************************************************************** +* +* File : cor_h.c +* Purpose : correlation functions for codebook search +* +***************************************************************************** +*/ +/* +***************************************************************************** +* MODULE INCLUDE FILE AND VERSION ID +***************************************************************************** +*/ +#include "namespace.h" +#include "cor_h.h" +/* +***************************************************************************** +* INCLUDE FILES +***************************************************************************** +*/ +#include "typedef.h" +#include "basic_op.h" +#include "no_count.h" +#include "inv_sqrt.h" +#include "cnst.h" + +/* +***************************************************************************** +* PUBLIC PROGRAM CODE +***************************************************************************** +*/ +/************************************************************************* + * + * FUNCTION: cor_h_x() + * + * PURPOSE: Computes correlation between target signal "x[]" and + * impulse response"h[]". + * + * DESCRIPTION: + * The correlation is given by: + * d[n] = sum_{i=n}^{L-1} x[i] h[i-n] n=0,...,L-1 + * + * d[n] is normalized such that the sum of 5 maxima of d[n] corresponding + * to each position track does not saturate. + * + *************************************************************************/ +void cor_h_x ( + Word16 h[], /* (i): impulse response of weighted synthesis filter */ + Word16 x[], /* (i): target */ + Word16 dn[], /* (o): correlation between target and h[] */ + Word16 sf /* (i): scaling factor: 2 for 12.2, 1 for others */ +) +{ + cor_h_x2(h, x, dn, sf, NB_TRACK, STEP); +} + +/************************************************************************* + * + * FUNCTION: cor_h_x2() + * + * PURPOSE: Computes correlation between target signal "x[]" and + * impulse response"h[]". + * + * DESCRIPTION: + * See cor_h_x, d[n] can be normalized regards to sum of the + * five MR122 maxima or the four MR102 maxima. + * + *************************************************************************/ +void cor_h_x2 ( + Word16 h[], /* (i): impulse response of weighted synthesis filter */ + Word16 x[], /* (i): target */ + Word16 dn[], /* (o): correlation between target and h[] */ + Word16 sf, /* (i): scaling factor: 2 for 12.2, 1 for others */ + Word16 nb_track,/* (i): the number of ACB tracks */ + Word16 step /* (i): step size from one pulse position to the next + in one track */ +) +{ + Word16 i, j, k; + Word32 s, y32[L_CODE], max, tot; + + /* first keep the result on 32 bits and find absolute maximum */ + + tot = 5; move32 (); + + for (k = 0; k < nb_track; k++) + { + max = 0; move32 (); + for (i = k; i < L_CODE; i += step) + { + s = 0; move32 (); + for (j = i; j < L_CODE; j++) + s = L_mac (s, x[j], h[j - i]); + + y32[i] = s; move32 (); + + s = L_abs (s); + test (); + if (L_sub (s, max) > (Word32) 0L) + max = s; move32 (); + } + tot = L_add (tot, L_shr (max, 1)); + } + + j = sub (norm_l (tot), sf); + + for (i = 0; i < L_CODE; i++) + { + dn[i] = round (L_shl (y32[i], j)); move16 (); + } +} + +/************************************************************************* + * + * FUNCTION: cor_h() + * + * PURPOSE: Computes correlations of h[] needed for the codebook search; + * and includes the sign information into the correlations. + * + * DESCRIPTION: The correlations are given by + * rr[i][j] = sum_{n=i}^{L-1} h[n-i] h[n-j]; i>=j; i,j=0,...,L-1 + * + * and the sign information is included by + * rr[i][j] = rr[i][j]*sign[i]*sign[j] + * + *************************************************************************/ + +void cor_h ( + Word16 h[], /* (i) : impulse response of weighted synthesis + filter */ + Word16 sign[], /* (i) : sign of d[n] */ + Word16 rr[][L_CODE] /* (o) : matrix of autocorrelation */ +) +{ + Word16 i, j, k, dec, h2[L_CODE]; + Word32 s; + + /* Scaling for maximum precision */ + + s = 2; move32 (); + for (i = 0; i < L_CODE; i++) + s = L_mac (s, h[i], h[i]); + + j = sub (extract_h (s), 32767); + test (); + if (j == 0) + { + for (i = 0; i < L_CODE; i++) + { + h2[i] = shr (h[i], 1); move16 (); + } + } + else + { + s = L_shr (s, 1); + k = extract_h (L_shl (Inv_sqrt (s), 7)); + k = mult (k, 32440); /* k = 0.99*k */ + + for (i = 0; i < L_CODE; i++) + { + h2[i] = round (L_shl (L_mult (h[i], k), 9)); + move16 (); + } + } + + /* build matrix rr[] */ + s = 0; move32 (); + i = L_CODE - 1; + for (k = 0; k < L_CODE; k++, i--) + { + s = L_mac (s, h2[k], h2[k]); + rr[i][i] = round (s); move16 (); + } + + for (dec = 1; dec < L_CODE; dec++) + { + s = 0; move32 (); + j = L_CODE - 1; + i = sub (j, dec); + for (k = 0; k < (L_CODE - dec); k++, i--, j--) + { + s = L_mac (s, h2[k], h2[k + dec]); + rr[j][i] = mult (round (s), mult (sign[i], sign[j])); + move16 (); + rr[i][j] = rr[j][i]; move16 (); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtwamr/cor_h.h Thu Apr 18 17:39:10 2024 +0000 @@ -0,0 +1,58 @@ +/* +***************************************************************************** +* +* GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 +* R99 Version 3.3.0 +* REL-4 Version 4.1.0 +* +***************************************************************************** +* +* File : cor_h.h +* Purpose : correlation functions for codebook search +* +***************************************************************************** +*/ +/* +***************************************************************************** +* MODULE INCLUDE FILE AND VERSION ID +***************************************************************************** +*/ +#ifndef cor_h_h +#define cor_h_h "@(#)$Id $" +/* +***************************************************************************** +* INCLUDE FILES +***************************************************************************** +*/ +#include "typedef.h" +#include "cnst.h" + +/* +***************************************************************************** +* DECLARATION OF PROTOTYPES +***************************************************************************** +*/ +void cor_h_x ( + Word16 h[], /* (i) : impulse response of weighted synthesis filter */ + Word16 x[], /* (i) : target */ + Word16 dn[], /* (o) : correlation between target and h[] */ + Word16 sf /* (i) : scaling factor: 2 for 12.2, 1 for 7.4 */ +); + +void cor_h_x2 ( + Word16 h[], /* (i) : impulse response of weighted synthesis filter */ + Word16 x[], /* (i) : target */ + Word16 dn[], /* (o) : correlation between target and h[] */ + Word16 sf, /* (i) : scaling factor: 2 for 12.2, 1 for 7.4 */ + Word16 nb_track,/* (i) : the number of ACB tracks */ + Word16 step /* (i) : step size from one pulse position to the next + in one track */ +); + +void cor_h ( + Word16 h[], /* (i) : impulse response of weighted synthesis filter */ + Word16 sign[], /* (i) : sign of d[n] */ + Word16 rr[][L_CODE] /* (o) : matrix of autocorrelation */ +); + +#endif
--- a/libtwamr/namespace.h Thu Apr 18 16:58:25 2024 +0000 +++ b/libtwamr/namespace.h Thu Apr 18 17:39:10 2024 +0000 @@ -74,6 +74,9 @@ #define sqrt_l_exp AMR__sqrt_l_exp #define set_sign AMR__set_sign #define set_sign12k2 AMR__set_sign12k2 +#define cor_h AMR__cor_h +#define cor_h_x AMR__cor_h_x +#define cor_h_x2 AMR__cor_h_x2 #define Bits2prm AMR__Bits2prm #define Prm2bits AMR__Prm2bits