annotate libtwamr/lsfwt.c @ 478:936a08cc73ce

doc/AMR-library-API: describe the decoder
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 19 May 2024 21:32:31 +0000
parents 8861f41e4507
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
370
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 ********************************************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * R99 Version 3.3.0
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * REL-4 Version 4.1.0
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 ********************************************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * File : lsfwt.c
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 * Purpose : Compute LSF weighting factors
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 ********************************************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 */
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 /*
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 ********************************************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 * MODULE INCLUDE FILE AND VERSION ID
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 ********************************************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 */
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 #include "namespace.h"
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 #include "lsfwt.h"
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 /*
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 ********************************************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 * INCLUDE FILES
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 ********************************************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 */
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 #include "typedef.h"
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 #include "basic_op.h"
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 #include "no_count.h"
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 #include "cnst.h"
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 /*
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 ********************************************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 * PUBLIC PROGRAM CODE
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 ********************************************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 */
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 /****************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 * FUNCTION Lsf_wt *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 ****************************************************
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 * Compute LSF weighting factors *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 * d[i] = lsf[i+1] - lsf[i-1] *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 * The weighting factors are approximated by two line segment. *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 * First segment passes by the following 2 points: *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 * d[i] = 0Hz wf[i] = 3.347 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 * d[i] = 450Hz wf[i] = 1.8 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 * Second segment passes by the following 2 points: *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 * d[i] = 450Hz wf[i] = 1.8 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 * d[i] = 1500Hz wf[i] = 1.0 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 * if( d[i] < 450Hz ) *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 * wf[i] = 3.347 - ( (3.347-1.8) / (450-0)) * d[i] *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 * else *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 * wf[i] = 1.8 - ( (1.8-1.0) / (1500-450)) * (d[i] - 450) *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 * if( d[i] < 1843) *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 * wf[i] = 3427 - (28160*d[i])>>15 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 * else *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 * wf[i] = 1843 - (6242*(d[i]-1843))>>15 *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 * *
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 *--------------------------------------------------------------------------*/
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 void Lsf_wt (
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 Word16 *lsf, /* input : LSF vector */
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 Word16 *wf) /* output: square of weighting factors */
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 {
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 Word16 temp;
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 Word16 i;
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 /* wf[0] = lsf[1] - 0 */
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 wf[0] = lsf[1]; move16 ();
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 for (i = 1; i < 9; i++)
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 {
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 wf[i] = sub (lsf[i + 1], lsf[i - 1]); move16 ();
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 }
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 /* wf[9] = 0.5 - lsf[8] */
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 wf[9] = sub (16384, lsf[8]);move16 ();
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 for (i = 0; i < 10; i++)
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 {
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 temp = sub (wf[i], 1843);
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 test ();
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 if (temp < 0)
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 {
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 wf[i] = sub (3427, mult (wf[i], 28160)); move16 ();
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 }
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 else
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 {
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 wf[i] = sub (1843, mult (temp, 6242)); move16 ();
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 }
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 wf[i] = shl (wf[i], 3); move16 ();
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 }
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 return;
8861f41e4507 libtwamr: integrate lsfwt.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 }