1f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/* ------------------------------------------------------------------
2f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *
4f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * you may not use this file except in compliance with the License.
6f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * You may obtain a copy of the License at
7f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *
8f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber *
10f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * express or implied.
14f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * See the License for the specific language governing permissions
15f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * and limitations under the License.
16f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber * -------------------------------------------------------------------
17f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber */
18f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*
19f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
20f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Pathname: long_term_prediction.c
21f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
22f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
23f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REVISION HISTORY
24f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
25f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Made changes based on comments and experiment results.
26f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
27f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: Passed in buffer sizes based on review comments and prototype
28f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              agreements.
29f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
30f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: 1. Passed in "weight_index" instead of "weight".
31f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              2. Added weight table.
32f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
33f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description: 1. Removed some passed in buffer size variables since they are
34f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                 not used for long window.
35f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber              2. Modified comments format.
36f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
37f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:
38f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Modified casting to ensure proper operations for different platforms
39f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
40f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:
41f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Implemented circular buffer techniques, which save 4096 memmoves per
42f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    frame.
43f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
44f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:
45f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Implemented some optimizations found during the code review of this
46f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    module.  The optimizations related to the rules on the range of
47f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ltp_buffer_index and num_samples, which allows for a simpler
48f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    code construct to be used in the processing of the predicted samples.
49f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
50f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:
51f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Add max calculation on the filter implementation, this to eliminate
52f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    function buffer_adaptation() on the time to frequency transformation.
53f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Function interface changed. It now return the amount of shifting needed
54f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    to garb only the top 16 MSB.
55f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
56f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:
57f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     Replace clearing memory with for-loop with pvmemset function
58f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
59f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Description:
60f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
61f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
62f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber INPUT AND OUTPUT DEFINITIONS
63f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
64f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Inputs:
65f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    win_seq = type of window sequence (WINDOW_SEQUENCE).
66f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
67f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    weight_index = index (Int) of LTP coefficient table for all windows in
68f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                   current frame.
69f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
70f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    delay = buffer (Int) containing delays for each window.
71f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
72f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    buffer = history buffer (Int16) containing the reconstructed time domain
73f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             signals of previous frames.
74f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
75f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    buffer_offset = value (Int) that indicates the location of the first
76f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    element in the LTP circular buffer.  (Either 0 or 1024)
77f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
78f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    time_quant    = filterbank buffer (Int32) This buffer is used by the
79f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    filterbank, but it's first 1024 elements are equivalent
80f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    to the last 1024 elements in the conventionally
81f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    implemented LTP buffer.  Using this buffer directly avoids
82f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    costly duplication of memory.
83f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
84f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    predicted_samples = buffer (Int32) with length of 2048 to hold
85f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        predicted time domain signals.
86f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
87f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    buffer_index = index into buffer where the first sample of data from
88f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                   the frame (t-2) (two frames ago) resides.  (Int)
89f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
90f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    frame_length = length of one frame, type of Int.
91f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
92f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Local Stores/Buffers/Pointers Needed:
93f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    None
94f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
95f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Global Stores/Buffers/Pointers Needed:
96f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    None
97f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
98f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Outputs:
99f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Amount of shifting needed to grab the top 16 MSB from teh predicted buffer
100f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
101f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Pointers and Buffers Modified:
102f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    predicted_samples contents are the newly calculated predicted time
103f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    domain signals
104f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
105f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Local Stores Modified:
106f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    None
107f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
108f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Global Stores Modified:
109f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    None
110f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
111f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
112f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber FUNCTION DESCRIPTION
113f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
114f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber Long term prediction (LTP) is used to reduce the redundancy of a signal
115f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber between successive coding frames. This function performs prediction by
116f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber applying 1-tap IIR filtering to calculate the predicted time domain
117f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber signals of current frame from previous reconstructed frames stored in
118f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber time domain history buffer.
119f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
120f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber The equation used for IIR filter is as following.
121f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
122f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            y(n) = weight * x(n - delay)
123f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
124f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    where   y(n) ----- predicted time domain signals
125f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            x(n) ----- reconstructed time domain signals
126f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            weight ----- LTP coefficient
127f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            delay ----- optimal delay from 0 to 2047
128f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
129f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
130f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REQUIREMENTS
131f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
132f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber None
133f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
134f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
135f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber REFERENCES
136f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
137f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (1) ISO/IEC 14496-3:1999(E)
138f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     Part 3: Audio
139f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        Subpart 4.6.6   Long Term Prediction (LTP)
140f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
141f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber (2) MPEG-2 NBC Audio Decoder
142f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     "This software module was originally developed by Nokia in the course
143f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     of development of the MPEG-2 AAC/MPEG-4 Audio standard ISO/IEC13818-7,
144f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     14496-1, 2 and 3. This software module is an implementation of a part
145f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     of one or more MPEG-2 AAC/MPEG-4 Audio tools as specified by the MPEG-2
146f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     aac/MPEG-4 Audio standard. ISO/IEC  gives users of the MPEG-2aac/MPEG-4
147f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     Audio standards free license to this software module or modifications
148f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     thereof for use in hardware or software products claiming conformance
149f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     to the MPEG-2 aac/MPEG-4 Audio  standards. Those intending to use this
150f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     software module in hardware or software products are advised that this
151f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     use may infringe existing patents. The original developer of this
152f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     software module, the subsequent editors and their companies, and ISO/IEC
153f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     have no liability for use of this software module or modifications
154f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     thereof in an implementation. Copyright is not released for non MPEG-2
155f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     aac/MPEG-4 Audio conforming products. The original developer retains
156f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     full right to use the code for the developer's own purpose, assign or
157f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     donate the code to a third party and to inhibit third party from using
158f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     the code for non MPEG-2 aac/MPEG-4 Audio conforming products. This
159f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     copyright notice must be included in all copies or derivative works.
160f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     Copyright (c)1997.
161f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
162f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
163f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PSEUDO-CODE
164f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
165f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pPredicted_samples = &predicted_samples[0];
166f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
167f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    weight = codebook[weight_index];
168f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
169f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    IF (win_seq != EIGHT_SHORT_SEQUENCE)
170f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    THEN
171f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
172f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        block_length = frame_length << 1;
173f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
174f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        lag = delay[0];
175f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
176f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        j = block_length - lag;
177f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
178f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        IF (lag < frame_length)
179f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        THEN
180f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
181f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            num_samples = frame_length + lag;
182f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
183f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ELSE
184f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
185f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            num_samples = block_length;
186f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
187f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDIF
188f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
189f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pBuffer = &buffer[j];
190f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
191f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        FOR (i = num_samples; i>0; i--)
192f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
193f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *pPredicted_samples = weight * (*pBuffer);
194f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            pPredicted_samples = pPredicted_samples + 1;
195f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            pBuffer = pBuffer + 1;
196f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
197f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDFOR
198f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
199f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        FOR (i = block_length - num_samples; i>0; i--)
200f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
201f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *pPredicted_samples = 0;
202f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            pPredicted_samples = pPredicted_samples + 1;
203f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
204f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDFOR
205f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
206f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ELSE
207f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
208f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        FOR (wnd = 0; wnd < short_window_num; wnd++)
209f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
210f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            IF (win_prediction_used[wnd] != FALSE)
211f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            THEN
212f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
213f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                delay[wnd] = delay[0] + ltp_short_lag[wnd];
214f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
215f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                lag = delay[wnd];
216f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
217f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                j = wnd*short_block_length - lag;
218f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
219f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                IF (lag < short_frame_length)
220f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                THEN
221f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
222f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    num_samples = short_frame_length + lag;
223f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
224f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ELSE
225f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
226f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    num_samples = short_block_length;
227f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
228f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ENDIF
229f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
230f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pBuffer = &buffer[j];
231f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
232f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                FOR (i = num_samples; i>0; i--)
233f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
234f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *pPredicted_samples = weight * (*pBuffer);
235f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pPredicted_samples = pPredicted_samples + 1;
236f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pBuffer = pBuffer + 1;
237f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
238f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ENDFOR
239f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
240f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                FOR (i = short_block_length - num_samples; i>0; i--)
241f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
242f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    *pPredicted_samples = 0;
243f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                    pPredicted_samples = pPredicted_samples + 1;
244f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
245f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                ENDFOR
246f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
247f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ELSE
248f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
249f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                CALL pv_memset(
250f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        pPredicted_samples,
251f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        0,
252f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                        sizeof(*pPredicted_samples)*short_block_length);
253f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                MODIFYING (predicted_samples[]);
254f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
255f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                pPredicted_samples = pPredicted_samples + short_block_length;
256f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
257f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ENDIF [ IF (win_prediction_used[wnd] != FALSE) ]
258f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
259f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ENDFOR [ FOR (wnd=0; wnd<short_window_num; wnd++) ]
260f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
261f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ENDIF [ IF (win_seq != EIGHT_SHORT_SEQUENCE) ]
262f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
263f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    RETURN
264f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
265f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
266f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber RESOURCES USED
267f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber   When the code is written for a specific target processor the
268f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     the resources used should be documented below.
269f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
270f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
271f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber          stack usage for each subroutine called]
272f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
273f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
274f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         name] (see [filename].ext)
275f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
276f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber DATA MEMORY USED: x words
277f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
278f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber PROGRAM MEMORY USED: x words
279f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
280f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
281f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber           used to represent cycle count for each subroutine
282f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber           called]
283f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
284f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
285f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        name] (see [filename].ext)
286f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
287f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber------------------------------------------------------------------------------
288f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber*/
289f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
290f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
291f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
292f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; INCLUDES
293f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
294f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "pv_audio_type_defs.h"
295f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "e_window_sequence.h"
296f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "ltp_common_internal.h"
297f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "long_term_prediction.h"
298f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "aac_mem_funcs.h"
299f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "pv_normalize.h"
300f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber#include "window_block_fxp.h"
301f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
302f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
303f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
304f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; MACROS
305f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Define module specific macros here
306f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
307f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
308f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
309f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; DEFINES
310f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Include all pre-processor statements here. Include conditional
311f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; compile variables also.
312f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
313f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
314f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
315f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL FUNCTION DEFINITIONS
316f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Function Prototype declaration
317f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
318f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
319f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
320f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
321f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Variable declaration - defined here and used outside this module
322f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
323f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/* Purpose: Codebook for LTP weight coefficients. Stored in Q15 format */
324f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huberconst UInt codebook[CODESIZE] =
325f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber{
326f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    18705,  /* 0 */
327f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    22827,  /* 1 */
328f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    26641,  /* 2 */
329f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    29862,  /* 3 */
330f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    32273,  /* 4 */
331f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    34993,  /* 5 */
332f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    39145,  /* 6 */
333f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    44877   /* 7 */
334f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber};
335f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
336f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
337f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL FUNCTION REFERENCES
338f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare functions defined elsewhere and referenced in this module
339f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
340f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
341f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
342f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
343f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; Declare variables used in this module but defined elsewhere
344f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
345f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
346f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber/*----------------------------------------------------------------------------
347f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber; FUNCTION CODE
348f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber----------------------------------------------------------------------------*/
349f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas HuberInt long_term_prediction(
350f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    WINDOW_SEQUENCE     win_seq,
351f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const Int           weight_index,
352f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const Int           delay[],
353f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const Int16         buffer[],
354f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const Int           buffer_offset,
355f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const Int32         time_quant[],
356f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int32         predicted_samples[],    /* Q15 */
357f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const Int           frame_length)
358f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber{
359f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*----------------------------------------------------------------------------
360f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ; Define all local variables
361f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ----------------------------------------------------------------------------*/
362f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*
363f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * Window index
364f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
365f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * Int wnd;
366f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
367f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * will be enabled when short window information is available.
368f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
369f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
370f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /* Pointer to time domain history buffer */
371f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
372f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const Int16 *pBuffer;
373f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
374f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    const Int32 *pTimeQuant = time_quant;
375f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
376f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /* Pointer to array containing predicted samples */
377f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int32 *pPredicted_samples;
378f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
379f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int32   test;
380f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int32   datum;
381f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
382f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /* IIR coefficient with Q15 format */
383f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    UInt    weight;
384f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
385f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /* Length of one block (two frames) */
386f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     block_length;
387f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
388f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     shift;
389f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     k;
390f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     ltp_buffer_index;
391f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     jump_point;
392f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     lag;
393f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int     num_samples;
394f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
395f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    Int32   max = 0;
396f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
397f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*----------------------------------------------------------------------------
398f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ; Function body here
399f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ----------------------------------------------------------------------------*/
400f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /* Initialize pointers */
401f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    pPredicted_samples = &predicted_samples[0];
402f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
403f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    weight = codebook[weight_index];
404f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
405f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /****************************************/
406f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /* LTP decoding process for long window */
407f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /****************************************/
408f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
409f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    if (win_seq != EIGHT_SHORT_SEQUENCE)
410f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
411f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /****************************************************/
412f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* Prediction based on previous time domain signals */
413f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /****************************************************/
414f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        block_length = frame_length << 1;
415f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
416f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* Calculate time lag for 1-tap IIR filter */
417f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        lag = delay[0];
418f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
419f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ltp_buffer_index = block_length - lag;
420f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
421f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* Calculate number of samples used in IIR filter */
422f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        if (lag < frame_length)
423f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
424f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            num_samples = frame_length + lag;
425f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
426f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        else
427f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
428f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            num_samples = block_length;
429f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
430f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
431f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
432f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /*
433f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * Calculate the predicted time domain signals from the
434f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * reconstructed time domain signals of previous frames.
435f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
436f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
437f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* The data is stored in TWO buffers, either as...
438f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
439f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *                                       [   t ==  0  ]
440f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
441f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * [   t == -1   ][   t == -2   ]
442f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
443f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * OR...
444f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *                                       [   t ==  0  ]
445f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
446f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * [   t == -2   ][   t == -1   ]
447f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
448f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
449f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
450f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * In the first case, all of the buffers are non-contiguous,
451f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * and each must be handled separately.  Code for this first case
452f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * will function correctly for both cases.
453f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
454f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * In the second case, the buffers storing t == -2, and t == -1
455f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * data are contiguous, and an optimization could take advantage
456f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * of this, at the cost of an increase in code size for this function.
457f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
458f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
459f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* Decrement block_length by num_samples.  This is important
460f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * for the loop at the end of the "ACCESS DATA IN THE LTP BUFFERS"
461f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * section that sets all remaining samples in the block to zero.
462f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
463f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
464f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        block_length -= num_samples;
465f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
466f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
467f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
468f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
469f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
470f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
471f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /*
472f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         ************************************ ACCESS DATA IN THE LTP BUFFERS
473f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
474f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
475f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /*
476f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * This section of the code handles the t == -2
477f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * buffer, which corresponds to 0 <= ltp_buffer_index < 1024
478f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
479f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * BUFFER t == -2
480f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
481f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * [0][][][][][][][][][][][...][][][][][][][][][][][][1023]
482f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
483f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
484f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
485f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        jump_point = (frame_length - ltp_buffer_index);
486f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
487f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        if (jump_point > 0)
488f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
489f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            pBuffer = &(buffer[ltp_buffer_index + buffer_offset]);
490f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
491f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            for (k = jump_point; k > 0; k--)
492f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            {
493f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                /* Q15 = Q15 * Q0 */
494f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                test = (Int32) weight * (*(pBuffer++));
495f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                *(pPredicted_samples++) =  test;
496f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber                max                   |= (test >> 31) ^ test;
497f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            }
498f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
499f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            num_samples -= jump_point;
500f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
501f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            ltp_buffer_index += jump_point;
502f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
503f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
504f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /*
505f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * This section of the code handles the t == -1
506f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * buffer, which corresponds to 1024 <= ltp_buffer_index < 2048
507f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
508f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * BUFFER t == -1
509f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
510f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * [1024][][][][][][][][][][][...][][][][][][][][][][][][2047]
511f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
512f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
513f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
514f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        jump_point = 2 * frame_length - ltp_buffer_index;
515f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
516f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pBuffer = &(buffer[ltp_buffer_index - buffer_offset]);
517f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
518f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        if (num_samples < jump_point)
519f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
520f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            jump_point = num_samples;
521f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
522f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
523f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        for (k = jump_point; k > 0; k--)
524f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
525f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            /* Q15 = Q15 * Q0 */
526f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            test = (Int32) weight * (*(pBuffer++));
527f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *(pPredicted_samples++) =  test;
528f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            max                   |= (test >> 31) ^ test;
529f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
530f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
531f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        num_samples -= jump_point;
532f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
533f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        ltp_buffer_index += jump_point;
534f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
535f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /*
536f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * This section of the code handles the t == 0
537f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * buffer, which corresponds to 2048 <= ltp_buffer_index < 3072
538f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
539f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * BUFFER t == 0
540f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
541f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         * [2048][][][][][][][][][][][...][][][][][][][][][][][][3071]
542f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         *
543f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber         */
544f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        for (k = num_samples; k > 0; k--)
545f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        {
546f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
547f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            datum = *(pTimeQuant++) >> SCALING;
548f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
549f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            /*
550f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * Limit the values in the 32-bit filterbank's buffer to
551f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * 16-bit resolution.
552f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             *
553f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * Value's greater than 32767 or less than -32768 are saturated
554f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             * to 32767 and -32768, respectively.
555f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber             */
556f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
557f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            test                    = (Int32)datum * weight;
558f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            *(pPredicted_samples++) =  test;
559f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            max                    |= (test >> 31) ^ test;
560f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
561f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        }
562f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
563f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        /* Set any remaining samples in the block to 0. */
564f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
565f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        pv_memset(
566f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            pPredicted_samples,
567f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            0,
568f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber            block_length*sizeof(*pPredicted_samples));
569f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
570f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    } /* if (win_seq != EIGHT_SHORT_SEQUENCE) */
571f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
572f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
573f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*****************************************/
574f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /* LTP decoding process for short window */
575f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*****************************************/
576f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
577f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*
578f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * For short window LTP, since there is no "ltp_short_lag"
579f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * information being passed, the following code for short
580f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * window LTP will be applied in the future when those
581f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     * information are available.
582f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
583f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
584f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*
585f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *----------------------------------------------------------------------------
586f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *  else
587f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *  {
588f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *      for (wnd = 0; wnd < short_window_num; wnd++)
589f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *      {
590f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *          if (win_prediction_used[wnd] != FALSE)
591f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *          {
592f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              delay[wnd] = delay[0] + ltp_short_lag[wnd];
593f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
594f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              lag = delay[wnd];
595f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
596f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              j = wnd*short_block_length - lag;
597f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
598f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              if (lag < short_frame_length)
599f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              {
600f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *                  num_samples = short_frame_length + lag;
601f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              }
602f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              else
603f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              {
604f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *                  num_samples = short_block_length;
605f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              }
606f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
607f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              pBuffer = &buffer[j];
608f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
609f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              for(i = num_samples; i>0; i--)
610f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              {
611f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *                  *(pPredicted_samples++) = weight * (*(pBuffer++));
612f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              }
613f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
614f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              for(i = short_block_length - num_samples; i>0; i--)
615f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              {
616f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *                  *(pPredicted_samples++) = 0;
617f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              }
618f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *          }
619f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *          else
620f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *          {
621f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              pv_memset(
622f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *                  pPredicted_samples,
623f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *                  0,
624f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *                  sizeof(*pPredicted_samples)*short_block_length);
625f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *
626f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *              pPredicted_samples += short_block_length;
627f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *          }
628f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *      }
629f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *  }
630f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     *----------------------------------------------------------------------------
631f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber     */
632f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
633f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    shift = 16 - pv_normalize(max);
634f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
635f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    if (shift < 0)
636f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    {
637f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber        shift = 0;
638f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    }
639f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
640f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    /*----------------------------------------------------------------------------
641f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ; Return nothing or data or data pointer
642f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    ----------------------------------------------------------------------------*/
643f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber    return (shift);
644f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber} /* long_term_prediction */
645f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
646f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
647f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
648f44de515d3b6098a0b585865c1a0c7b20d3075a6Andreas Huber
649