annotate libtwamr/pitch_ol.c @ 581:e2d5cad04cbf

libgsmhr1 RxFE: store CN R0+LPC separately from speech In the original GSM 06.06 code the ECU for speech mode is entirely separate from the CN generator, maintaining separate state. (The main intertie between them is the speech vs CN state variable, distinguishing between speech and CN BFIs, in addition to the CN-specific function of distinguishing between initial and update SIDs.) In the present RxFE implementation I initially thought that we could use the same saved_frame buffer for both ECU and CN, overwriting just the first 4 params (R0 and LPC) when a valid SID comes in. However, I now realize it was a bad idea: the original code has a corner case (long sequence of speech-mode BFIs to put the ECU in state 6, then SID and CN-mode BFIs, then a good speech frame) that would be broken by that buffer reuse approach. We could eliminate this corner case by resetting the ECU state when passing through a CN insertion period, but doing so would needlessly increase the behavioral diffs between GSM 06.06 and our version. Solution: use a separate CN-specific buffer for CN R0+LPC parameters, and match the behavior of GSM 06.06 code in this regard.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Feb 2025 10:02:45 +0000
parents 01c4becb9fda
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
415
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * R99 Version 3.3.0
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * REL-4 Version 4.1.0
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * File : pitch_ol.c
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 * Purpose : Compute the open loop pitch lag.
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 /*
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 * MODULE INCLUDE FILE AND VERSION ID
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 #include "namespace.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 #include "pitch_ol.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 /*
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 * INCLUDE FILES
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 #include "typedef.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 #include "basic_op.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 #include "oper_32b.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 #include "no_count.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 #include "cnst.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 #include "inv_sqrt.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 #include "vad.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 #include "calc_cor.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 #include "hp_max.h"
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 /*
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 * LOCAL VARIABLES AND TABLES
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 #define THRESHOLD 27853
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 /*
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 * LOCAL PROGRAM CODE
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 /*************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 * FUNCTION: Lag_max
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 * PURPOSE: Find the lag that has maximum correlation of scal_sig[] in a
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 * given delay range.
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 * DESCRIPTION:
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 * The correlation is given by
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 * cor[t] = <scal_sig[n],scal_sig[n-t]>, t=lag_min,...,lag_max
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 * The functions outputs the maximum correlation after normalization
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 * and the corresponding lag.
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 *************************************************************************/
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 static Word16 Lag_max ( /* o : lag found */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 vadState *vadSt, /* i/o : VAD state struct */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 Word32 corr[], /* i : correlation vector. */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 Word16 scal_sig[], /* i : scaled signal. */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 Word16 scal_fac, /* i : scaled signal factor. */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 Word16 scal_flag, /* i : if 1 use EFR compatible scaling */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 Word16 L_frame, /* i : length of frame to compute pitch */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 Word16 lag_max, /* i : maximum lag */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 Word16 lag_min, /* i : minimum lag */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 Word16 *cor_max, /* o : normalized correlation of selected lag */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 Word32 *rmax, /* o : max(<s[i]*s[j]>) */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 Word32 *r0, /* o : residual energy */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 Flag dtx /* i : dtx flag; use dtx=1, do not use dtx=0 */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 )
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 Word16 i, j;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 Word16 *p;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 Word32 max, t0;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 Word16 max_h, max_l, ener_h, ener_l;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 Word16 p_max = 0; /* initialization only needed to keep gcc silent */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 max = MIN_32; move32 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 p_max = lag_max; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 for (i = lag_max, j = (PIT_MAX-lag_max-1); i >= lag_min; i--, j--)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 test ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 if (L_sub (corr[-i], max) >= 0)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 max = corr[-i]; move32 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 p_max = i; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 /* compute energy */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 t0 = 0; move32 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 p = &scal_sig[-p_max]; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 for (i = 0; i < L_frame; i++, p++)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 t0 = L_mac (t0, *p, *p);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 /* 1/sqrt(energy) */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 if (dtx)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 { /* no test() call since this if is only in simulation env */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 *rmax = max; move32();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 *r0 = t0; move32();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 /* check tone */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 if (!vadSt->use_vad2)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 vad_tone_detection (&vadSt->u.v1, max, t0);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 t0 = Inv_sqrt (t0); move32 (); /* function result */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 test();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 if (scal_flag)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 t0 = L_shl (t0, 1);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 /* max = max/sqrt(energy) */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 L_Extract (max, &max_h, &max_l);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 L_Extract (t0, &ener_h, &ener_l);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 t0 = Mpy_32 (max_h, max_l, ener_h, ener_l);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 test();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 if (scal_flag)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 t0 = L_shr (t0, scal_fac);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 *cor_max = extract_h (L_shl (t0, 15)); /* divide by 2 */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 else
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 *cor_max = extract_l(t0);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 return (p_max);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 /*
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 * PUBLIC PROGRAM CODE
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 ********************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 /*************************************************************************
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 * FUNCTION: Pitch_ol
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 * PURPOSE: Compute the open loop pitch lag.
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 * DESCRIPTION:
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 * The open-loop pitch lag is determined based on the perceptually
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 * weighted speech signal. This is done in the following steps:
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 * - find three maxima of the correlation <sw[n],sw[n-T]>,
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 * dividing the search range into three parts:
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 * pit_min ... 2*pit_min-1
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 * 2*pit_min ... 4*pit_min-1
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 * 4*pit_min ... pit_max
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 * - divide each maximum by <sw[n-t], sw[n-t]> where t is the delay at
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 * that maximum correlation.
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 * - select the delay of maximum normalized correlation (among the
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 * three candidates) while favoring the lower delay ranges.
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 *************************************************************************/
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 Word16 Pitch_ol ( /* o : open loop pitch lag */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 vadState *vadSt, /* i/o : VAD state struct */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 enum Mode mode, /* i : coder mode */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 Word16 signal[], /* i : signal used to compute the open loop pitch */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 /* signal[-pit_max] to signal[-1] should be known */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 Word16 pit_min, /* i : minimum pitch lag */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 Word16 pit_max, /* i : maximum pitch lag */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 Word16 L_frame, /* i : length of frame to compute pitch */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 Word16 idx, /* i : frame index */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 Flag dtx /* i : dtx flag; use dtx=1, do not use dtx=0 */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 )
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 Word16 i, j;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 Word16 max1, max2, max3;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 Word16 p_max1, p_max2, p_max3;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 Word16 scal_flag = 0;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 Word32 t0;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 Word32 r01, r02, r03;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 Word32 rmax1, rmax2, rmax3;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 Word16 corr_hp_max;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 Word32 corr[PIT_MAX+1], *corr_ptr;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 /* Scaled signal */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 Word16 scaled_signal[L_FRAME + PIT_MAX];
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 Word16 *scal_sig, scal_fac;
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 if (dtx && !vadSt->use_vad2)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 { /* no test() call since this if is only in simulation env */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 /* update tone detection */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 test(); test();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 if ((sub(mode, MR475) == 0) || (sub(mode, MR515) == 0))
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 vad_tone_detection_update (&vadSt->u.v1, 1);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 else
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 vad_tone_detection_update (&vadSt->u.v1, 0);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 scal_sig = &scaled_signal[pit_max]; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 t0 = 0L; move32 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 for (i = -pit_max; i < L_frame; i++)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 t0 = L_mac (t0, signal[i], signal[i]);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 /*--------------------------------------------------------*
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 * Scaling of input signal. *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 * *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 * if Overflow -> scal_sig[i] = signal[i]>>3 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 * else if t0 < 1^20 -> scal_sig[i] = signal[i]<<3 *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 * else -> scal_sig[i] = signal[i] *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 *--------------------------------------------------------*/
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 /*--------------------------------------------------------*
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 * Verification for risk of overflow. *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 *--------------------------------------------------------*/
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 test ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 if (L_sub (t0, MAX_32) == 0L) /* Test for overflow */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 for (i = -pit_max; i < L_frame; i++)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 scal_sig[i] = shr (signal[i], 3); move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 scal_fac = 3; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 else if (L_sub (t0, (Word32) 1048576L) < (Word32) 0)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 /* if (t0 < 2^20) */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 test ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 for (i = -pit_max; i < L_frame; i++)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 scal_sig[i] = shl (signal[i], 3); move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248 scal_fac = -3; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 else
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 test ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 for (i = -pit_max; i < L_frame; i++)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 scal_sig[i] = signal[i]; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 scal_fac = 0; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 /* calculate all coreelations of scal_sig, from pit_min to pit_max */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 corr_ptr = &corr[pit_max]; move32 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262 comp_corr (scal_sig, L_frame, pit_max, pit_min, corr_ptr);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 /*--------------------------------------------------------------------*
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265 * The pitch lag search is divided in three sections. *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 * Each section cannot have a pitch multiple. *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 * We find a maximum for each section. *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 * We compare the maximum of each section by favoring small lags. *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 * *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 * First section: lag delay = pit_max downto 4*pit_min *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271 * Second section: lag delay = 4*pit_min-1 downto 2*pit_min *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 * Third section: lag delay = 2*pit_min-1 downto pit_min *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 *--------------------------------------------------------------------*/
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 /* mode dependent scaling in Lag_max */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 test ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 if (sub(mode, MR122) == 0)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 scal_flag = 1; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 else
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 scal_flag = 0; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286 j = shl (pit_min, 2);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 p_max1 = Lag_max (vadSt, corr_ptr, scal_sig, scal_fac, scal_flag, L_frame,
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288 pit_max, j, &max1, &rmax1, &r01, dtx);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 i = sub (j, 1);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 j = shl (pit_min, 1);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 p_max2 = Lag_max (vadSt, corr_ptr, scal_sig, scal_fac, scal_flag, L_frame,
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 i, j, &max2, &rmax2, &r02, dtx);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 i = sub (j, 1);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 p_max3 = Lag_max (vadSt, corr_ptr, scal_sig, scal_fac, scal_flag, L_frame,
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 i, pit_min, &max3, &rmax3, &r03, dtx);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 if (dtx && !vadSt->use_vad2)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 { /* no test() call since this if is only in simulation env */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 test ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 if (sub(idx, 1) == 0)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 /* calculate max high-passed filtered correlation of all lags */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 hp_max (corr_ptr, scal_sig, L_frame, pit_max, pit_min, &corr_hp_max);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 /* update complex background detector */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 vad_complex_detection_update(&vadSt->u.v1, corr_hp_max);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 /*--------------------------------------------------------------------*
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 * Compare the 3 sections maximum, and favor small lag. *
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 *--------------------------------------------------------------------*/
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 test ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 if (sub (mult (max1, THRESHOLD), max2) < 0)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319 max1 = max2; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 p_max1 = p_max2; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321 if (dtx)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 rmax1 = rmax2; move32 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324 r01 = r02; move32 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 test ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328 if (sub (mult (max1, THRESHOLD), max3) < 0)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 p_max1 = p_max3; move16 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331 if (dtx)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333 rmax1 = rmax3; move32 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334 r01 = r03; move32 ();
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338 if (dtx && vadSt->use_vad2)
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339 {
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340 /* Save max correlation */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 vadSt->u.v2.L_Rmax = L_add(vadSt->u.v2.L_Rmax, rmax1);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342 /* Save max energy */
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343 vadSt->u.v2.L_R0 = L_add(vadSt->u.v2.L_R0, r01);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344 }
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346 return (p_max1);
01c4becb9fda libtwamr: integrate pitch_ol.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347 }