FreeCalypso > hg > gsm-codec-lib
changeset 324:dc3b7caa59c4
libtwamr: integrate c_g_aver.c
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 18 Apr 2024 20:05:14 +0000 |
parents | dfd5f159574b |
children | 67c31802392b |
files | libtwamr/Makefile libtwamr/c_g_aver.c libtwamr/c_g_aver.h libtwamr/namespace.h |
diffstat | 4 files changed, 353 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/libtwamr/Makefile Thu Apr 18 19:47:13 2024 +0000 +++ b/libtwamr/Makefile Thu Apr 18 20:05:14 2024 +0000 @@ -2,8 +2,8 @@ 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 c1035pf.o c2_11pf.o c2_9pf.o c3_14pf.o c4_17pf.o \ - c8_31pf.o cor_h.o gmed_n.o graytab.o inv_sqrt.o oper_32b.o prmno.o \ - s10_8pf.o set_sign.o sqrt_l.o tls_flags.o window.o + c8_31pf.o c_g_aver.o cor_h.o gmed_n.o graytab.o inv_sqrt.o oper_32b.o \ + prmno.o s10_8pf.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/c_g_aver.c Thu Apr 18 20:05:14 2024 +0000 @@ -0,0 +1,260 @@ +/************************************************************************* +* +* 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 : c_g_aver.c +* Purpose : +* +******************************************************************************** +*/ + +/* +******************************************************************************** +* MODULE INCLUDE FILE AND VERSION ID +******************************************************************************** +*/ +#include "namespace.h" +#include "c_g_aver.h" + +#include "tw_amr.h" +#include "typedef.h" +#include "basic_op.h" +#include "no_count.h" +#include "cnst.h" +#include "memops.h" + +/* +******************************************************************************** +* LOCAL VARIABLES AND TABLES +******************************************************************************** +*/ +/*-----------------------------------------------------------------* + * Decoder constant parameters (defined in "cnst.h") * + *-----------------------------------------------------------------* + * L_FRAME : Frame size. * + * L_SUBFR : Sub-frame size. * + *-----------------------------------------------------------------*/ + +/* +******************************************************************************** +* PUBLIC PROGRAM CODE +******************************************************************************** +*/ +/* +************************************************************************** +* +* Function : Cb_gain_average_reset +* Purpose : Resets state memory +* +************************************************************************** +*/ +void Cb_gain_average_reset (Cb_gain_averageState *state) +{ + /* Static vectors to zero */ + Set_zero (state->cbGainHistory, L_CBGAINHIST); + + /* Initialize hangover handling */ + state->hangVar = 0; + state->hangCount= 0; +} + +/* +************************************************************************** +* +* Function : Cb_gain_average +* Purpose : +* Returns : The mix cb gains for MR475, MR515, MR59, MR67, MR102; gain_code other modes +* +************************************************************************** +*/ +Word16 Cb_gain_average ( + Cb_gain_averageState *st, /* i/o : State variables for CB gain avergeing */ + enum Mode mode, /* i : AMR mode */ + Word16 gain_code, /* i : CB gain Q1 */ + Word16 lsp[], /* i : The LSP for the current frame Q15 */ + Word16 lspAver[], /* i : The average of LSP for 8 frames Q15 */ + Word16 bfi, /* i : bad frame indication flag */ + Word16 prev_bf, /* i : previous bad frame indication flag */ + Word16 pdfi, /* i : potential degraded bad frame ind flag */ + Word16 prev_pdf, /* i : prev pot. degraded bad frame ind flag */ + Word16 inBackgroundNoise, /* i : background noise decision */ + Word16 voicedHangover /* i : # of frames after last voiced frame */ + ) +{ + /*---------------------------------------------------------* + * Compute mixed cb gain, used to make cb gain more * + * smooth in background noise for modes 5.15, 5.9 and 6.7 * + * states that needs to be updated by all * + *---------------------------------------------------------*/ + Word16 i; + Word16 cbGainMix, diff, tmp_diff, bgMix, cbGainMean; + Word32 L_sum; + Word16 tmp[M], tmp1, tmp2, shift1, shift2, shift; + + /* set correct cbGainMix for MR74, MR795, MR122 */ + cbGainMix = gain_code; move16 (); + + /*-------------------------------------------------------* + * Store list of CB gain needed in the CB gain * + * averaging * + *-------------------------------------------------------*/ + for (i = 0; i < (L_CBGAINHIST-1); i++) + { + st->cbGainHistory[i] = st->cbGainHistory[i+1]; move16 (); + } + st->cbGainHistory[L_CBGAINHIST-1] = gain_code; move16 (); + + /* compute lsp difference */ + for (i = 0; i < M; i++) { + tmp1 = abs_s(sub(lspAver[i], lsp[i])); /* Q15 */ + shift1 = sub(norm_s(tmp1), 1); /* Qn */ + tmp1 = shl(tmp1, shift1); /* Q15+Qn */ + shift2 = norm_s(lspAver[i]); /* Qm */ + tmp2 = shl(lspAver[i], shift2); /* Q15+Qm */ + tmp[i] = div_s(tmp1, tmp2); /* Q15+(Q15+Qn)-(Q15+Qm) */ + move16 (); + shift = sub(add(2, shift1), shift2); + test (); + if (shift >= 0) + { + tmp[i] = shr(tmp[i], shift); move16 (); /* Q15+Qn-Qm-Qx=Q13 */ + } + else + { + tmp[i] = shl(tmp[i], negate(shift)); move16 (); /* Q15+Qn-Qm-Qx=Q13 */ + } + } + + diff = tmp[0]; move16 (); + for (i = 1; i < M; i++) { + diff = add(diff, tmp[i]); /* Q13 */ + } + + /* Compute hangover */ + test (); + if (sub(diff, 5325) > 0) /* 0.65 in Q11 */ + { + st->hangVar = add(st->hangVar, 1); + } + else + { + st->hangVar = 0; move16 (); + } + + test (); + if (sub(st->hangVar, 10) > 0) + { + st->hangCount = 0; /* Speech period, reset hangover variable */ move16 (); + } + + /* Compute mix constant (bgMix) */ + bgMix = 8192; /* 1 in Q13 */ move16 (); + test (); + if ((sub(mode, MR67) <= 0) || (sub(mode, MR102) == 0)) + /* MR475, MR515, MR59, MR67, MR102 */ + { + /* if errors and presumed noise make smoothing probability stronger */ + test (); test (); test (); test (); test (); test(); test (); test (); test (); + if (((((pdfi != 0) && (prev_pdf != 0)) || (bfi != 0) || (prev_bf != 0)) && + (sub(voicedHangover, 1) > 0) && (inBackgroundNoise != 0) && + ((sub(mode, MR475) == 0) || + (sub(mode, MR515) == 0) || + (sub(mode, MR59) == 0)) )) + { + /* bgMix = min(0.25, max(0.0, diff-0.55)) / 0.25; */ + tmp_diff = sub(diff, 4506); /* 0.55 in Q13 */ + + /* max(0.0, diff-0.55) */ + test (); + if (tmp_diff > 0) + { + tmp1 = tmp_diff; move16 (); + } + else + { + tmp1 = 0; move16 (); + } + + /* min(0.25, tmp1) */ + test (); + if (sub(2048, tmp1) < 0) + { + bgMix = 8192; move16 (); + } + else + { + bgMix = shl(tmp1, 2); + } + } + else + { + /* bgMix = min(0.25, max(0.0, diff-0.40)) / 0.25; */ + tmp_diff = sub(diff, 3277); /* 0.4 in Q13 */ + + /* max(0.0, diff-0.40) */ + test (); + if (tmp_diff > 0) + { + tmp1 = tmp_diff; move16 (); + } + else + { + tmp1 = 0; move16 (); + } + + /* min(0.25, tmp1) */ + test (); + if (sub(2048, tmp1) < 0) + { + bgMix = 8192; move16 (); + } + else + { + bgMix = shl(tmp1, 2); + } + } + + test (); test (); + if ((sub(st->hangCount, 40) < 0) || (sub(diff, 5325) > 0)) /* 0.65 in Q13 */ + { + bgMix = 8192; /* disable mix if too short time since */ move16 (); + } + + /* Smoothen the cb gain trajectory */ + /* smoothing depends on mix constant bgMix */ + L_sum = L_mult(6554, st->cbGainHistory[2]); /* 0.2 in Q15; L_sum in Q17 */ + for (i = 3; i < L_CBGAINHIST; i++) + { + L_sum = L_mac(L_sum, 6554, st->cbGainHistory[i]); + } + cbGainMean = round(L_sum); /* Q1 */ + + /* more smoothing in error and bg noise (NB no DFI used here) */ + test (); test (); test (); test (); test(); test(); + if (((bfi != 0) || (prev_bf != 0)) && (inBackgroundNoise != 0) && + ((sub(mode, MR475) == 0) || + (sub(mode, MR515) == 0) || + (sub(mode, MR59) == 0)) ) + { + L_sum = L_mult(4681, st->cbGainHistory[0]); /* 0.143 in Q15; L_sum in Q17 */ + for (i = 1; i < L_CBGAINHIST; i++) + { + L_sum = L_mac(L_sum, 4681, st->cbGainHistory[i]); + } + cbGainMean = round(L_sum); /* Q1 */ + } + + /* cbGainMix = bgMix*cbGainMix + (1-bgMix)*cbGainMean; */ + L_sum = L_mult(bgMix, cbGainMix); /* L_sum in Q15 */ + L_sum = L_mac(L_sum, 8192, cbGainMean); + L_sum = L_msu(L_sum, bgMix, cbGainMean); + cbGainMix = round(L_shl(L_sum, 2)); /* Q1 */ + } + + st->hangCount = add(st->hangCount, 1); + return cbGainMix; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtwamr/c_g_aver.h Thu Apr 18 20:05:14 2024 +0000 @@ -0,0 +1,88 @@ +/* +******************************************************************************** +* +* 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 : c_g_aver.h +* Purpose : Background noise source charateristic detector (SCD) +* +******************************************************************************** +*/ +#ifndef c_g_aver_h +#define c_g_aver_h "$Id $" + +/* +******************************************************************************** +* INCLUDE FILES +******************************************************************************** +*/ +#include "tw_amr.h" +#include "typedef.h" +#include "cnst.h" + +/* +******************************************************************************** +* LOCAL VARIABLES AND TABLES +******************************************************************************** +*/ +#define L_CBGAINHIST 7 + +/* +******************************************************************************** +* DEFINITION OF DATA TYPES +******************************************************************************** +*/ +typedef struct{ + /* history vector of past synthesis speech energy */ + Word16 cbGainHistory[L_CBGAINHIST]; + + /* state flags */ + Word16 hangVar; /* counter; */ + Word16 hangCount; /* counter; */ + +} Cb_gain_averageState; + +/* +******************************************************************************** +* DECLARATION OF PROTOTYPES +******************************************************************************** +*/ +/* +************************************************************************** +* +* Function : Cb_gain_average_reset +* Purpose : Resets state memory +* Returns : 0 on success +* +************************************************************************** +*/ +void Cb_gain_average_reset (Cb_gain_averageState *st); + +/* +************************************************************************** +* +* Function : Cb_gain_average +* Purpose : Charaterice synthesis speech and detect background noise +* Returns : background noise decision; 0 = bgn, 1 = no bgn +* +************************************************************************** +*/ +Word16 Cb_gain_average ( + Cb_gain_averageState *st, /* i/o : State variables for CB gain avergeing */ + enum Mode mode, /* i : AMR mode */ + Word16 gain_code, /* i : CB gain Q1 */ + Word16 lsp[], /* i : The LSP for the current frame Q15 */ + Word16 lspAver[], /* i : The average of LSP for 8 frames Q15 */ + Word16 bfi, /* i : bad frame indication flag */ + Word16 prev_bf, /* i : previous bad frame indication flag */ + Word16 pdfi, /* i : potential degraded bad frame ind flag */ + Word16 prev_pdf, /* i : prev pot. degraded bad frame ind flag */ + Word16 inBackgroundNoise, /* i : background noise decision */ + Word16 voicedHangover /* i : # of frames after last voiced frame */ +); + +#endif
--- a/libtwamr/namespace.h Thu Apr 18 19:47:13 2024 +0000 +++ b/libtwamr/namespace.h Thu Apr 18 20:05:14 2024 +0000 @@ -90,6 +90,9 @@ #define window_160_80 AMR__window_160_80 #define window_232_8 AMR__window_232_8 +#define Cb_gain_average AMR__Cb_gain_average +#define Cb_gain_average_reset AMR__Cb_gain_average_reset + #define code_2i40_9bits AMR__code_2i40_9bits #define code_2i40_11bits AMR__code_2i40_11bits #define code_3i40_14bits AMR__code_3i40_14bits