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