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