FreeCalypso > hg > gsm-codec-lib
annotate libgsmefr/autocorr.c @ 586:b21ea4ab586d
libgsmhr1: update for TW-TS-002 version 1.2.0
The component of libgsmhr1 being changed is RTP input functions;
the change is accepting FT=1 (invalid SID) frames both with and
without payload data bits.
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Mon, 10 Mar 2025 02:03:31 +0000 | 
| parents | 92dc7f0082a3 | 
| children | 
| rev | line source | 
|---|---|
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /************************************************************************* | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 * | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 * FUNCTION: autocorr | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 * | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 * PURPOSE: Compute autocorrelations of signal with windowing | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 * | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 * DESCRIPTION: | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 * - Windowing of input speech: s'[n] = s[n] * w[n] | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 * - Autocorrelations of input speech: | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 * r[k] = sum_{i=k}^{239} s'[i]*s'[i-k] k=0,...,10 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 * The autocorrelations are expressed in normalized double precision | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 * format. | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 * | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 *************************************************************************/ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 | 
| 55 
92dc7f0082a3
libgsmefr: autocorr.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 16 #include "gsm_efr.h" | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 #include "typedef.h" | 
| 55 
92dc7f0082a3
libgsmefr: autocorr.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 18 #include "namespace.h" | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 #include "basic_op.h" | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 #include "oper_32b.h" | 
| 55 
92dc7f0082a3
libgsmefr: autocorr.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 21 #include "no_count.h" | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 #include "cnst.h" | 
| 55 
92dc7f0082a3
libgsmefr: autocorr.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 23 #include "sig_proc.h" | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 Word16 Autocorr ( | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 Word16 x[], /* (i) : Input signal */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 Word16 m, /* (i) : LPC order */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 Word16 r_h[], /* (o) : Autocorrelations (msb) */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 Word16 r_l[], /* (o) : Autocorrelations (lsb) */ | 
| 55 
92dc7f0082a3
libgsmefr: autocorr.c compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: 
53diff
changeset | 30 const Word16 wind[] /* (i) : window for LPC analysis */ | 
| 53 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 ) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 Word16 i, j, norm; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 Word16 y[L_WINDOW]; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 Word32 sum; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 Word16 overfl, overfl_shft; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 /* Windowing of signal */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 for (i = 0; i < L_WINDOW; i++) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 y[i] = mult_r (x[i], wind[i]); move16 (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 /* Compute r[0] and test for overflow */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 overfl_shft = 0; move16 (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 do | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 overfl = 0; move16 (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 sum = 0L; move32 (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 for (i = 0; i < L_WINDOW; i++) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 sum = L_mac (sum, y[i], y[i]); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 /* If overflow divide y[] by 4 */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 test (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 if (L_sub (sum, MAX_32) == 0L) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 overfl_shft = add (overfl_shft, 4); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 overfl = 1; move16 (); /* Set the overflow flag */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 for (i = 0; i < L_WINDOW; i++) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 y[i] = shr (y[i], 2); move16 (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 70 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 72 test (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 while (overfl != 0); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 76 sum = L_add (sum, 1L); /* Avoid the case of all zeros */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 77 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 /* Normalization of r[0] */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 norm = norm_l (sum); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 sum = L_shl (sum, norm); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 L_Extract (sum, &r_h[0], &r_l[0]); /* Put in DPF format (see oper_32b) */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 /* r[1] to r[m] */ | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 85 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 86 for (i = 1; i <= m; i++) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 87 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 88 sum = 0; move32 (); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 89 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 for (j = 0; j < L_WINDOW - i; j++) | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 91 { | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 92 sum = L_mac (sum, y[j], y[j + i]); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 93 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 94 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 95 sum = L_shl (sum, norm); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 96 L_Extract (sum, &r_h[i], &r_l[i]); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 97 } | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 98 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 99 norm = sub (norm, overfl_shft); | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 100 | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 101 return norm; | 
| 
49dd1ac8e75b
libgsmefr: import most *.c files from ETSI source
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 102 } | 
