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