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: trans4m_freq_2_time_fxp.c 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Function: trans4m_freq_2_time_fxp 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY 26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber changed to decrement loop 29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber change wnd_shape from structure to passing parameters 30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber modified window tables from UInt to UInt16 to assure proper operation 31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber without dubious typecast 32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber changed logic to hit most common states first. 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber modified Time_data from Int to Int32 to hold 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber possible overflow before saturation process. 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Increase processing on some loop by using more pointers 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber changed interface to avoid passing a pointer for wnd_shape_prev_bk, this 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber element is not change in this function because of this function use 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber in the LTP module 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Added rounding to multiplication 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Update input description and eliminate unneeded comments 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber LONG_START_WINDOW was using SHORT_WINDOW instead of 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HALF_SHORT_WINDOW, causing a for loop to exceed its count 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Modified structure of code so exp is not tested before it 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber is initialized. Also, new structure avoids double-testing 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of exp_freq = ALL_ZEROS_BUFFER. 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber The result of a shift is undefined if the right operand is greater than 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber or equal to the number of bits in the left expression's type 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber To avoid undefined shift by 32, a check of the shift has been 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber added, so the function proceeds only when the exponent is less 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber than 32. By design the shift up is related to the global gain, 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and controlled by the encoder, so saturation is not allowed. 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber In both short and long window, processing is skip if an all zero 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber input buffer or excessive down shift is detected. 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Changes according to code review comments. Also, modified if-else 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber structure so the imdct_fxp is not called with an all zero input buffer 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Replaced function buffer_normalization by buffer_adaptation, to ease 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber use of 16 bits. Function buffer_normalization becomes obsolete. 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Modified call to imdct_fxp to reflect extended precision use. Added 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber routine buffer_adaptation to extract 16 MSB and keep highest. 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber precision. Modify casting to ensure proper operations for different 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber platforms 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Eliminate double access to memory by loading data directly to the 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber time array. Also reduced cycle count and added precision by combining 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber downshifting in only one operation. Added adaptive rounding factor. 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Change exponent threshold when operations are waived. It is use to be 32 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber but by combining downshifting, this new threshold is now 16. This may 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber avoid unneeded calculations for extremely small numbers. 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Per review comments: 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber - Added comments to clarify buffer_adaptation function 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber - Deleted reference to include file "buffer_normalization.h" 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber - Modified IF-ELSE so long_windows case is considered first 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber - Eliminated extra IF when computing the rounding, so when exp ==0 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber less cycles are used shifting than in an extra if-else 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber - Corrected negative shift when computing rounding factor 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber - Added condition when exp > 16 (for long windows) 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Modified IF-ELSE structure so now ALL_ZEROS_BUFFER condition is share 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber with exp > 16 condition. This avoid code duplication for both cases. 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber - Modified function interface to add output_buffer 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber - Eliminated the 32 bit version of the current output, calculations 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber are placed directly in output_buffer. In this way the buffer 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Time_data needs only to be 1024 Int32, instead of 2048 (per channel). 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Also, added the limit macro inside the function (this reduces access 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber to memory). 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber - Updated Pseudo - Code 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Per review comments: 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Corrected line sizes and mispelling, added comments and swap 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber order or switch statement for ONLY_LONG_SEQUENCE. 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Eliminated adaptive rounding due to potential saturation. 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Eliminated use of buffer adaptation by shifting this functionality inside 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the imdct_fxp() routine. Also modified the call to imdct_fxp to accomodate 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber new function interface. 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Modified macro limit() to save cycles when testing the most common case: 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber no saturation. 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Changed new function interface for imdct_fxp(). 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Replaced for-loop with memset and memcopy. 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who: Date: 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs: 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Frequency_data = vector with spectral information, size 2048 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type Int32 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Time_data = buffer with data from previous Frequency to Time 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber conversion, used for overlap and add, size 1024 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type Int32 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Output_buffer = place holder for current output, size 1024 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type Int16 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber wnd_seq = window sequence 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type WINDOW_SEQUENCE 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber wnd_shape_prev_bk = previous window shape type 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type Int 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber wnd_shape_this_bk = current window shape type 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type Int 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format = Q format for the input frequency data 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type Int 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer[] = scratch memory for computing FFT 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type Int32 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed: 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed: 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs: 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified: 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Output_buffer 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Time_data 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Frequency_data 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pWnd_shape_prev_bk 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified: 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified: 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe time/frequency representation of the signal is mapped onto the time 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberdomain by feeding it into the filterbank module. This module consists of 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberan inverse modified discrete cosine transform (IMDCT), and a window and an 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberoverlap-add function. In order to adapt the time/frequency resolution of the 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfilterbank to the characteristics of the input signal, a block switching tool 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberis also adopted. N represents the window length, where N is a function of the 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberwindow_sequence. For each channel, the N/2 time-frequency values are 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubertransformed into the N time domain values via the IMDCT. After applying the 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberwindow function, for each channel, the first half of the sequence is added to 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberthe second half of the previous block windowed sequence to reconstruct the 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberoutput samples for each channel outi,n. 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe adaptation of the time-frequency resolution of the filterbank to the 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubercharacteristics of the input signal is done by shifting between transforms 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberwhose input lengths are either 2048 or 256 samples. By enabling the block 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberswitching tool, the following transitions are meaningful: 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfrom ONLY_LONG_SEQUENCE to { LONG_START_SEQUENCE 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ONLY_LONG_SEQUENCE 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfrom LONG_START_SEQUENCE to { LONG_STOP_SEQUENCE 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EIGHT_SHORT_SEQUENCE 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfrom LONG_STOP_SEQUENCE to { LONG_START_SEQUENCE 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ONLY_LONG_SEQUENCE 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfrom EIGHT_SHORT_SEQUENCE to { LONG_STOP_SEQUENCE 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber EIGHT_SHORT_SEQUENCE 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberWindow shape decisions are made by the encoder on a frame-by-frame-basis. 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe window selected is applicable to the second half of the window function 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberonly, since the first half is constrained to use the appropriate window 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubershape from the preceding frame. 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe 2048 time-domain values x'(i)(n), (i window, n sample) to be windowed are 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberthe last 1024 values of the previous window_sequence concatenated with 1024 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervalues of the current block. The formula below shows this fact: 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | x(i-1)(n+1024) for 0 < n < 1024 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber x'(i)(n) { 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | x(i)(n) for 1024 < n < 2048 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberBuffer Time_data data from previous Frequency to Time conversion, used 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfor overlap and add 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberOnce the window shape is selected, the window_shape syntax element is 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberinitialized. Together with the chosen window_sequence all information needed 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberfor windowing exist. 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberWith the window halves described below all window_sequences can be assembled. 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberFor window_shape == 1, the window coefficients are given by the Kaiser - 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberBessel derived (KBD) window. 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberOtherwise, for window_shape == 0, a sine window is employed. 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe window length N can be 2048 or 256 for the KBD and the sine window. 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberAll four window_sequences explained below have a total length of 2048 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubersamples. 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberFor all kinds of window_sequences the window_shape of the left half of 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberthe first transform window is determined by the window shape of the previous 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberblock. 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberIn the case of EIGHT_SHORT_SEQUENCE the processing is done in-place and 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberin descendent order to avoid using extra memory. 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe ordering is as follows: 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pn: Previous data for window n 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Cn: Current data for window n 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 128 freq. 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber samples 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FREQ ++++++ 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberIN =========================== 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \ 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber \ 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber -> 256 time 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber samples 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber P8 C8 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 8 #######++++++ 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber P7 C7 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 7 #######++++++ 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : : 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : : 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber P2 C2 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2 #######++++++ 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber P1 C1 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1 #######++++++ 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber TIME 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberOUT ============================================================== 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This module shall implement a scheme to switch between window types 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber [1] ISO 14496-3:1999, pag 111 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF ( wnd_seq == EIGHT_SHORT_SEQUENCE) 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR ( i=0; i<LONG_WINDOW; i++) 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Time_data[LONG_WINDOW + i] = 0; 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR ( wnd=NUM_SHORT_WINDOWS-1; wnd>=0; wnd--) 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = &Frequency_data[ wnd*SHORT_WINDOW]; 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CALL IMDCT( pFreqInfo, SHORT_BLOCK1); 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MODIFYING(pFreqInfo) 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (wnd == 0) 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window[wnd_shape_prev_bk][0]; 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSE 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window[wnd_shape_this_bk][0]; 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window[wnd_shape->this_bk][SHORT_WINDOW_m_1]; 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR( i=0, j=SHORT_WINDOW; i<SHORT_WINDOW; i++, j--) 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo[ i] *= pShort_Window_1[i]; 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo[SHORT_WINDOW+i] *= pShort_Window_2[j]; 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR( i=0; i<SHORT_BLOCK1; i++) 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Time_data[W_L_STOP_1 + SHORT_WINDOW*wnd + i] += pFreqInfo[i]; 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR ( i=0; i<LONG_WINDOW; i++) 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = Time_data[i]; 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Output_buffer[i] = Time_data[i]; 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Time_data[i] = temp; 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSE 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CALL IMDCT( Frequency_data, LONG_BLOCK1) 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MODIFYING(Frequency_data) 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SWITCH ( wnd_seq) 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CASE ( ONLY_LONG_SEQUENCE) 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLong_Window_1 = &Long_Window[wnd_shape_prev_bk][0]; 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLong_Window_2 = 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Long_Window[wnd_shape_this_bk][LONG_WINDOW_m_1]; 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (i=0; i<LONG_WINDOW; i++) 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Frequency_data[ i] *= *pLong_Window_1++; 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Frequency_data[LONG_WINDOW+i] *= *pLong_Window_2--; 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BREAK 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CASE ( LONG_START_SEQUENCE) 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLong_Window_1 = &Long_Window[wnd_shape_prev_bk][0]; 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR ( i=0; i<LONG_WINDOW; i++) 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Frequency_data[ i] *= *pLong_Window_1++; 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR ( i=0; i<SHORT_WINDOW; i++) 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Frequency_data[W_L_START_1 + i] *= *pShort_Window_1--; 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR ( i=W_L_START_2; i<LONG_BLOCK1; i++) 373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Frequency_data[W_L_START_2 + i] = 0; 374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BREAK 377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CASE ( LONG_STOP_SEQUENCE ) 380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR ( i=0; i<W_L_STOP_1; i++) 382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Frequency_data[ i] = 0; 383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window[wnd_shape_prev_bk][0]; 386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR ( i=0; i<SHORT_WINDOW; i++) 388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Frequency_data[W_L_STOP_1+ i] *= *pShort_Window_1++; 389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLong_Window_1 = 392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Long_Window[wnd_shape_this_bk][LONG_WINDOW_m_1]; 393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR ( i=0; i<LONG_WINDOW; i++) 395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Frequency_data[LONG_WINDOW + i] *= *pLong_Window_1--; 396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BREAK 399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR ( i=0; i<LONG_WINDOW; i++) 404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Output_buffer[i] = Frequency_data[i] + Time_data[i]; 405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Time_data[i] = Frequency_data[LONG_WINDOW+i]; 406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED 416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber When the code is written for a specific target processor the 417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the resources used should be documented below. 418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent 420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stack usage for each subroutine called] 421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [stack usage variable] = stack usage for [subroutine 423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words 426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words 428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable 430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber used to represent cycle count for each subroutine 431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber called] 432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [cycle count variable] = cycle count for [subroutine 434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES 442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h" 445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "aac_mem_funcs.h" 446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "window_block_fxp.h" 447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "imdct_fxp.h" 448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h" 450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS 454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; limit(x) saturates any number that exceeds a 16-bit representation into a 455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; 16 bit number. 456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define ROUNDING_SCALED (ROUNDING<<(16 - SCALING)) 459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if defined(PV_ARM_V5) 462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int16 sat(Int32 y) 465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 x; 467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 z; 468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber __asm 469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber mov x, ROUNDING_SCALED 471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber mov y, y, lsl #(15-SCALING) 472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber qdadd z, x, y 473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber mov y, z, lsr #16 474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return((Int16)y); 476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define limiter( y, x) y = sat(x); 479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#elif defined(PV_ARM_GCC_V5) 483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int16 sat(Int32 y) 486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 x; 488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 ra = (Int32)y; 489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber register Int32 z = ROUNDING_SCALED; 490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber asm volatile( 493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %1, lsl #5\n\t" // (15-SCALING) assembler does not take symbols 494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "qdadd %0, %2, %0\n\t" 495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "mov %0, %0, lsr #16" 496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "=&r*i"(x) 497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber : "r"(ra), 498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "r"(z)); 499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return ((Int16)x); 501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define limiter( y, x) y = sat(x); 504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#elif defined(PV_ARM_MSC_EVC_V5) 507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define limiter( y, x) z = x<< (15-SCALING); \ 510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber y = _DAddSatInt( ROUNDING_SCALED, z)>>16; 511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else 514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define limiter( y, x) z = ((x + ROUNDING )>>SCALING); \ 516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((z>>15) != (z>>31)) \ 517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { \ 518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber z = (z >> 31) ^ INT16_MAX; \ 519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } \ 520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber y = (Int16)(z); 521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES 527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional 528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also. 529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS 533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration 534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL VARIABLE DEFINITIONS 539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module 540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES 544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module 545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL VARIABLES REFERENCES 549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere 550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere 555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid trans4m_freq_2_time_fxp_1( 565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 Frequency_data[], 566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 Time_data[], 567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 Output_buffer[], 568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber WINDOW_SEQUENCE wnd_seq, 569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int wnd_shape_prev_bk, 570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int wnd_shape_this_bk, 571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int Q_format, 572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 abs_max_per_window[], 573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 freq_2_time_buffer[]) 574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int exp; 577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int shift; 578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int i; 580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int wnd; 581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if !(defined( PV_ARM_GCC_V5)||(PV_ARM_V5)) 582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 z; 583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pFreqInfo; 586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp; 587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 test; 588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pFreq_2_Time_data_1; 590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pFreq_2_Time_data_2; 591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 *pLong_Window_1; 593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 *pLong_Window_2; 594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 *pShort_Window_1; 595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 *pShort_Window_2; 596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pOverlap_and_Add_Buffer_1; 598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pOverlap_and_Add_Buffer_2; 599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pOutput_buffer; 601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pOutput_buffer_2; 602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 * Long_Window_fxp[NUM_WINDOW_SHAPES]; 604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 * Short_Window_fxp[NUM_WINDOW_SHAPES]; 605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Long_Window_fxp[0] = Long_Window_sine_fxp; 607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Long_Window_fxp[1] = Long_Window_KBD_fxp; 608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Short_Window_fxp[0] = Short_Window_sine_fxp; 609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Short_Window_fxp[1] = Short_Window_KBD_fxp; 610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (wnd_seq != EIGHT_SHORT_SEQUENCE) 613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = (Int16 *)Frequency_data; 616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp = imdct_fxp( 619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)pFreqInfo, 620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer, 621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber LONG_BLOCK1, 622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format, 623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber abs_max_per_window[0]); 624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The C Programming Language, Second Edition, Kernighan & Ritchie, 629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * page 206. 630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * "The result [of a shift] is undefined if the right operand is 631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * negative, or greater than or equal to the number of bits in the 632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * left expression's type" 633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * => avoid shift by 32 or 16 634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp < 16) 637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = pFreqInfo; 640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber switch (wnd_seq) 642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case ONLY_LONG_SEQUENCE: 645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber default: 646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer = Output_buffer; 648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = Time_data; 650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 *pLong_Window_2 = &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1]; 653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pFreq2T = (Int32 *)pFreqInfo; 655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * win = (Int32 *) & Long_Window_fxp[wnd_shape_prev_bk][0]; 656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int shift = exp + 15 - SCALING; 657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pFreq2T_2 = &pFreq2T[HALF_LONG_WINDOW]; 660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_LONG_WINDOW; i != 0; i--) 663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1, win2; 665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp2, test2; 666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 winx; 668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp2 = *(pFreq2T++); 670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber winx = *(win++); 671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pOverlap_and_Add_Buffer_1++); 673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test2 = *(pOverlap_and_Add_Buffer_1--); 674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16bb(temp2, winx) >> shift; 675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp2 = fxp_mul_16_by_16tt(temp2, winx) >> shift; 676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (temp + test)); 677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (temp2 + test2)); 678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp2 = *(pFreq2T_2++); 680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pLong_Window_2--); 682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win2 = *(pLong_Window_2--); 683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16bb(temp2, win1) >> shift; 684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test2 = fxp_mul_16_by_16tb(temp2, win2) >> shift; 685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp; 686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = test2; 687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 692dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 693dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case LONG_START_SEQUENCE: 694dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 695dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 696dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = 697dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pFreq_2_Time_data_1[ HALF_LONG_WINDOW]; 698dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 699dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLong_Window_1 = &Long_Window_fxp[wnd_shape_prev_bk][0]; 700dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLong_Window_2 = &pLong_Window_1[ HALF_LONG_WINDOW]; 701dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 702dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &Time_data[0]; 703dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = &Time_data[HALF_LONG_WINDOW]; 704dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 705dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer = Output_buffer; 706dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer_2 = pOutput_buffer + HALF_LONG_WINDOW; 707dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 708dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 709dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 710dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 711dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_LONG_WINDOW; i != 0; i--) 712dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 713dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 714dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1, win2; 715dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1, dat2; 716dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 test1, test2; 717dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 718dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 719dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pLong_Window_1++); 720dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test1 = *(pOverlap_and_Add_Buffer_1++); 721dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 722dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat2 = *(pFreq_2_Time_data_2++); 723dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win2 = *(pLong_Window_2++); 724dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test2 = *(pOverlap_and_Add_Buffer_2++); 725dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 726dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (test1 + (fxp_mul_16_by_16(dat1, win1) >> shift))); 727dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 728dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer_2++), (test2 + (fxp_mul_16_by_16(dat2, win2) >> shift))); 729dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 730dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 731dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 732dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 733dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * data unchanged from LONG_WINDOW to W_L_START_1 734dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * only scaled accordingly 735dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 736dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 737dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &Time_data[0]; 738dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[LONG_WINDOW]; 739dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 740dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp -= SCALING; 741dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 742dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp >= 0) 743dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 744dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 745dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--) 746dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 747dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = 748dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pFreq_2_Time_data_1++) >> exp; 749dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = 750dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pFreq_2_Time_data_1++) >> exp; 751dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 752dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 753dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 754dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 755dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (exp < 0) 756dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 757dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 758dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int shift = -exp; 759dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0 ; i--) 760dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 761dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift; 762dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp2; 763dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift; 764dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp2; 765dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 766dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 767dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 768dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 769dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 770dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 771dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--) 772dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 773dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = 774dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pFreq_2_Time_data_1++); 775dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = 776dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pFreq_2_Time_data_1++); 777dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 778dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 779dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 780dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 781dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 782dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 783dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[W_L_START_1]; 784dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = 785dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pFreq_2_Time_data_1[HALF_SHORT_WINDOW]; 786dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 787dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = 788dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 789dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 790dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = pShort_Window_1 - HALF_SHORT_WINDOW; 791dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 792dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1 + 793dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HALF_SHORT_WINDOW; 794dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 795dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 796dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 797dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 798dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1, win2; 799dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1, dat2; 800dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp2; 801dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = (*pFreq_2_Time_data_1++); 802dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat2 = (*pFreq_2_Time_data_2++); 803dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1--); 804dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win2 = *(pShort_Window_2--); 805dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 806dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16(dat1, win1) >> shift; 807dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp; 808dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 809dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp2 = fxp_mul_16_by_16(dat2, win2) >> shift; 810dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_2++) = temp2; 811dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 812dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 813dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 814dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 815dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 816dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 += HALF_SHORT_WINDOW; 817dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 818dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 819dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1, 820dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 821dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (LONG_BLOCK1 - W_L_START_2) 822dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *sizeof(*pOverlap_and_Add_Buffer_1)); 823dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 824dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 825dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 826dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 827dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 828dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case LONG_STOP_SEQUENCE: 829dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 830dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_2]; 831dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 832dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer = &Output_buffer[W_L_STOP_2]; 833dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 834dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[W_L_STOP_2]; 835dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 836dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp -= SCALING; /* !!!! */ 837dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 838dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp > 0) 839dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 840dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 tmp1 = (*(pFreq_2_Time_data_1++) >> exp); 841dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 842dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 843dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--) 844dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 845dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (temp + tmp1)); 846dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 847dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp1 = *(pFreq_2_Time_data_1++) >> exp; 848dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 849dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 850dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 851dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 852dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (exp < 0) 853dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 854dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = -exp; 855dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift; 856dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 857dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 858dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--) 859dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 860dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (temp + temp1)); 861dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 862dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift; 863dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 864dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 865dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 866dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 867dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 868dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 869dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 tmp1 = *(pFreq_2_Time_data_1++); 870dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 871dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 872dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--) 873dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 874dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (temp + tmp1)); 875dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 876dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp1 = *(pFreq_2_Time_data_1++); 877dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 878dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 879dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 880dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 881dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 882dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 883dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window_fxp[wnd_shape_prev_bk][0]; 884dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = &pShort_Window_1[HALF_SHORT_WINDOW]; 885dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 886dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[W_L_STOP_1]; 887dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = 888dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pFreq_2_Time_data_1[HALF_SHORT_WINDOW]; 889dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 890dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_1]; 891dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1 892dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + HALF_SHORT_WINDOW; 893dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 894dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer = &Output_buffer[W_L_STOP_1]; 895dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer_2 = pOutput_buffer + HALF_SHORT_WINDOW; 896dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 897dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp += SCALING; /* +8 back to what it was */ 898dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 899dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 900dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 901dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 902dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 903dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 904dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1; 905dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1; 906dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 907dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 908dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 909dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 910dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 911dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = fxp_mul_16_by_16(dat1, win1); 912dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 913dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (temp + (test >> shift))); 914dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 915dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 916dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2++); 917dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2++); 918dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = fxp_mul_16_by_16(dat1, win1); 919dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer_2++), (temp + (test >> shift))); 920dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 921dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 922dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 923dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 924dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = &pFreqInfo[LONG_WINDOW]; 925dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 926dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = Time_data; 927dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 928dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer = Output_buffer; 929dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 930dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLong_Window_2 = 931dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1]; 932dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 933dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 934dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 935dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copy previous time in current buffer, also copy overlap 936dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and add buffer 937dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 938dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 939dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = W_L_STOP_1; i != 0; i--) 940dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 941dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1; 942dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1; 943dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 944dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pLong_Window_2--); 945dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *pFreq_2_Time_data_2++; 946dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 947dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), *(pOverlap_and_Add_Buffer_1)); 948dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 949dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 950dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16(dat1, win1) >> shift; 951dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp ; 952dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 953dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 954dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 955dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (LONG_WINDOW - W_L_STOP_1); i != 0; i--) 956dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 957dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16(*pFreq_2_Time_data_2++, *(pLong_Window_2--)) >> shift; 958dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp ; 959dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 960dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 961dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 962dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 963dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 964dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 965dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 966dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* switch (wnd_seq) */ 967dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 968dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (exp < 16) */ 969dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 970dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 971dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 972dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* all zeros buffer or excessive down shift */ 973dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 974dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Overlap and add, setup buffer for next iteration */ 975dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &Time_data[0]; 976dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 977dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer = Output_buffer; 978dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 979dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = (*pOverlap_and_Add_Buffer_1++); 980dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 981dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = LONG_WINDOW; i != 0; i--) 982dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 983dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 984dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), temp); 985dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 986dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = (*pOverlap_and_Add_Buffer_1++); 987dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 988dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 989dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 990dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset(Time_data, 0, LONG_WINDOW*sizeof(Time_data[0])); 991dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 992dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 993dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 994dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 995dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 996dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 997dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 998dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 999dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pScrath_mem; 1000dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pScrath_mem_entry; 1001dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pFrequency_data = Frequency_data; 1002dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1003dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pOverlap_and_Add_Buffer_1; 1004dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pOverlap_and_Add_Buffer_2; 1005dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pOverlap_and_Add_Buffer_1x; 1006dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pOverlap_and_Add_Buffer_2x; 1007dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1008dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1009dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Frequency_data is 2*LONG_WINDOW length but only 1010dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the first LONG_WINDOW elements are filled in, 1011dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * then the second part can be used as scratch mem, 1012dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * then grab data from one window at a time in 1013dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * reverse order. 1014dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The upper LONG_WINDOW Int32 are used to hold the 1015dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * computed overlap and add, used in the next call to 1016dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * this function, and also as sctrach memory 1017dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1018dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1019dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1020dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Frequency_data usage for the case EIGHT_SHORT_SEQUENCE 1021dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1022dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |<----- Input Freq. data ----->|< Overlap & Add ->| Unused |-Scratch-| 1023dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | Store for next | | memory | 1024dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | call | | | 1025dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | | | 1026dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |//////////////////////////////|\\\\\\\\\\\\\\\\\\|--------|+++++++++| 1027dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | | | 1028dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0 LONG_WINDOW LONG_WINDOW | 2*LONG_WINDOW 1029dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + | | 1030dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber W_L_STOP_2 | | 1031dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |<-- -->| 1032dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_WINDOW + 1033dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HALF_SHORT_WINDOW 1034dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1035dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1036dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1037dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &pFrequency_data[ 1038dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber LONG_WINDOW + 3*SHORT_WINDOW + HALF_SHORT_WINDOW]; 1039dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1040dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1041dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Initialize to zero, only the firt short window used in overlap 1042dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and add 1043dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1044dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 1045dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1, 1046dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 1047dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1)); 1048dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1049dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1050dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Showt windows are evaluated in decresing order. Windows from 7 1051dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * to 0 are break down in four cases: window numbers 7 to 5, 4, 3, 1052dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and 2 to 0. 1053dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The data from short windows 3 and 4 is situated at the boundary 1054dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * between the 'overlap and add' buffer and the output buffer. 1055dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1056dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (wnd = NUM_SHORT_WINDOWS - 1; wnd >= NUM_SHORT_WINDOWS / 2 + 1; wnd--) 1057dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1058dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1059dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW]; 1060dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1061dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp = imdct_fxp( 1062dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)pFreqInfo, 1063dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer, 1064dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_BLOCK1, 1065dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format, 1066dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber abs_max_per_window[wnd]); 1067dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1068dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = 1069dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pFrequency_data[ W_L_STOP_1 + SHORT_WINDOW*wnd]; 1070dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1071dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1072dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = 1073dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 + SHORT_WINDOW; 1074dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1075dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1076dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If all element are zero or if the exponent is bigger than 1077dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 16 ( it becomes an undefined shift) -> skip 1078dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1079dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1080dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp < 16) 1081dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1082dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1083dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1084dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[0]; 1085dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW]; 1086dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1087dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1088dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1089dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Each of the eight short blocks is windowed separately. 1090dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Window shape decisions are made on a frame-by-frame 1091dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * basis. 1092dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1093dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1094dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0]; 1095dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1096dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = 1097dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 1098dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1099dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For short windows from 7 to 5 1104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | ========================= 1105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | | 5 6 7 1106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * _--_ _--_ _--_ _--_ | _-|-_ _--_ _--_ _--_ 1107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / \/ \/ \/ \|/ | \/ \/ \/ \ 1108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / /\ /\ /\ /|\ | /\ /\ /\ \ 1109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \ / \ / \ / | \ | / \ / \ / \ \ 1110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \/ \/ \/ | \|/ \/ \ \ \ 1111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * --------------------------------|---[///////////////////////]-------- 1112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 1117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 1120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1, win2; 1122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1, dat2; 1123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat2 = *(pFreq_2_Time_data_2++); 1125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win2 = *(pShort_Window_2--); 1126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pOverlap_and_Add_Buffer_2; 1127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 1128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 1129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_2++) = temp + (fxp_mul_16_by_16(dat2, win2) >> shift); 1131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = fxp_mul_16_by_16(dat1, win1) >> shift; 1133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (exp < 16) */ 1137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 1140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1, 1141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 1142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1)); 1143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber }/* for ( wnd=NUM_SHORT_WINDOWS-1; wnd>=NUM_SHORT_WINDOWS/2; wnd--) */ 1147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber wnd = NUM_SHORT_WINDOWS / 2; 1150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW]; 1152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * scratch memory is allocated in an unused part of memory 1155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem = &pFrequency_data[ 2*LONG_WINDOW - HALF_SHORT_WINDOW]; 1159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW]; 1161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1 1163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + HALF_SHORT_WINDOW; 1164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp = imdct_fxp( 1167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)pFreqInfo, 1168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer, 1169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_BLOCK1, 1170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format, 1171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber abs_max_per_window[wnd]); 1172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If all element are zero or if the exponent is bigger than 1175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 16 ( it becomes an undefined shift) -> skip 1176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp < 16) 1180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[0]; 1183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW]; 1184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0]; 1186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = 1188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 1189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For short window 4 1193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ====|=========== 1194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | 4 1195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | | | | 1196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * _--_ _--_ _--_ _-|-_ | _-|-_ _-|-_ _--_ _--_ 1197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / \/ \/ \/ | \|/ | \/ | \/ \/ \ 1198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / /\ /\ /\ | /|\ | /\ | /\ /\ \ 1199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \ / \ / \ | / | \ | / \ | / \ / \ \ 1200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \/ \/ \|/ | \|/ \|/ \/ \ \ 1201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ------------------------------[\\\|\\\|//////]------------------- 1202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | | A | B | C | 1203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | 1204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * W_L_STOP_1 1205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 1208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1; 1210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1; 1211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment A ---------------*/ 1212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 1213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 1214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 1215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pScrath_mem++) = fxp_mul_16_by_16(dat1, win1) >> (shift); 1217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 1218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 1219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment B ---------------*/ 1222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 1223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = fxp_mul_16_by_16(dat1, win1) >> shift; 1225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 1227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 1228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment C ---------------*/ 1231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pOverlap_and_Add_Buffer_2; 1232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 1233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 1234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 1236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_2++) = temp + (fxp_mul_16_by_16(dat1, win1) >> shift); 1238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pOverlap_and_Add_Buffer_2; 1240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 1241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 1242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (exp < 16) */ 1246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 1249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem, 1250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 1251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HALF_SHORT_WINDOW*sizeof(*pScrath_mem)); 1252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 1254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1, 1255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 1256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HALF_SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1)); 1257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber wnd = NUM_SHORT_WINDOWS / 2 - 1; 1261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW]; 1263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem_entry = 1265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pFrequency_data[2*LONG_WINDOW - HALF_SHORT_WINDOW - SHORT_WINDOW]; 1266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem = pScrath_mem_entry; 1267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW]; 1269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* point to end of buffer less HALF_SHORT_WINDOW */ 1271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer_2 = &Output_buffer[LONG_WINDOW - HALF_SHORT_WINDOW]; 1273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer = pOutput_buffer_2; 1274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1x = &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)]; /* !!!! */ 1276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp = imdct_fxp( 1278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)pFreqInfo, 1279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer, 1280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_BLOCK1, 1281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format, 1282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber abs_max_per_window[wnd]); 1283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If all element are zero or if the exponent is bigger than 1286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 16 ( it becomes an undefined shift) -> skip 1287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp < 16) 1290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[0]; 1293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW]; 1294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For short window 3 1298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ===========|==== 1299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 3 | 1300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | | | | 1301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * _--_ _--_ _-|-_ _-|-_ | _-|-_ _--_ _--_ _--_ 1302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / \/ \/ | \/ | \|/ | \/ \/ \/ \ 1303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / /\ /\ | /\ | /|\ | /\ /\ /\ \ 1304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \ / \ | / \ | / | \ | / \ / \ / \ \ 1305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \/ \|/ \|/ | \|/ \/ \ \ \ 1306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -----|------------------[\\\\\\|///|///]-------------------------- 1307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | | A | B | C | 1308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * W_L_STOP_1 1310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0]; 1314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = 1316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 1317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 1319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1; 1322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1; 1323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment A ---------------*/ 1324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 1325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 1326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 1327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pScrath_mem++) = fxp_mul_16_by_16(dat1, win1) >> shift; 1329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 1330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 1331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 1334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 1335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment B ---------------*/ 1337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 1338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = fxp_mul_16_by_16(dat1, win1) >> shift; 1340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pScrath_mem++) + test; 1342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pOverlap_and_Add_Buffer_1x++); /* !!!! */ 1345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (temp + test)); 1347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 1349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 1350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment C ---------------*/ 1354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 1355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16(dat1, win1) >> (shift); 1357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) += temp; 1359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 1361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 1362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (exp < 16) */ 1365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 1369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem, 1370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 1371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_WINDOW*sizeof(*pScrath_mem)); 1372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem += SHORT_WINDOW; 1374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pScrath_mem++); 1376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 1377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), temp); 1379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pScrath_mem++); 1380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (wnd = NUM_SHORT_WINDOWS / 2 - 2; wnd >= 0; wnd--) 1387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer_2 -= SHORT_WINDOW; 1391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer = pOutput_buffer_2; 1392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The same memory is used as scratch in every iteration 1395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem = pScrath_mem_entry; 1397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2x = 1399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)]; 1400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW]; 1402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp = imdct_fxp( 1406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)pFreqInfo, 1407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer, 1408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_BLOCK1, 1409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format, 1410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber abs_max_per_window[wnd]); 1411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If all element are zero or if the exponent is bigger than 1414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 16 ( it becomes an undefined shift) -> skip 1415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp < 16) 1418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[0]; 1421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW]; 1422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Each of the eight short blocks is windowed separately. 1426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Window shape decisions are made on a frame-by-frame 1427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * basis. 1428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0]; 1431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (wnd == 0) 1433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = 1435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_prev_bk][0]; 1436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = 1439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 1440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For short windows from 2 to 0 1444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ========================= 1446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | 1447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 0 1 2 | | 1448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * _--_ _--_ _--_ _-|-_ | _--_ _--_ _--_ _--_ 1449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / \/ \/ \/ | \|/ \/ \/ \/ \ 1450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / /\ /\ /\ | /|\ /\ /\ /\ \ 1451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \ / \ / \ | / | \ / \ / \ / \ \ 1452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \/ \/ \|/ | \/ \/ \ \ \ 1453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ----[\\\\\\\\\\\\\\\\\\\\\\\\]---|----------------------------- 1454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | 1455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * W_L_STOP_1 1457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 1460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1 = *(pFreq_2_Time_data_2++); 1462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1 = *(pShort_Window_2--); 1463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pScrath_mem); 1465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 1466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = fxp_mul_16_by_16(dat1, win1) >> shift; 1468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp += test; 1470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 1472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 1473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (temp + *(pOverlap_and_Add_Buffer_2x++))); 1475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pScrath_mem++) = fxp_mul_16_by_16(dat1, win1) >> shift; 1478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 1479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 1480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pScrath_mem); 1481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (exp < 16) */ 1485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pScrath_mem); 1488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2x++); 1489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 1491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (temp + test)); 1493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pScrath_mem++) = 0; 1495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pScrath_mem); 1496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2x++); 1497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for ( wnd=NUM_SHORT_WINDOWS/2-1; wnd>=0; wnd--) */ 1502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2x = &Time_data[W_L_STOP_1]; 1504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem = pScrath_mem_entry; 1506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer_2 -= SHORT_WINDOW; 1508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer = pOutput_buffer_2; 1509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pScrath_mem++); 1511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2x++); 1512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 1514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), (temp + test)); 1516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pScrath_mem++); 1518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2x++); 1519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1x = Time_data; 1523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOutput_buffer = Output_buffer; 1525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1x++); 1528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = W_L_STOP_1; i != 0; i--) 1530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pOutput_buffer++), temp); 1532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1x++); 1534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1x = &Time_data[0]; 1537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = &pFrequency_data[LONG_WINDOW]; 1539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * update overlap and add buffer, 1542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * so is ready for next iteration 1543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (int i = 0; i < W_L_STOP_2; i++) 1546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2++); 1548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1x++) = temp; 1549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 1552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1x, 1553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 1554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber W_L_STOP_1*sizeof(*pOverlap_and_Add_Buffer_1x)); 1555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if ( wnd_seq != EIGHT_SHORT_SEQUENCE) */ 1557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 1559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 1562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 1563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 1564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid trans4m_freq_2_time_fxp_2( 1568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 Frequency_data[], 1569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 Time_data[], 1570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber WINDOW_SEQUENCE wnd_seq, 1571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int wnd_shape_prev_bk, 1572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int wnd_shape_this_bk, 1573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int Q_format, 1574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 abs_max_per_window[], 1575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 freq_2_time_buffer[], 1576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *Interleaved_output) 1577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 1579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int exp; 1581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int shift; 1582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int i; 1584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int wnd; 1585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if !(defined( PV_ARM_GCC_V5)||(PV_ARM_V5)) 1586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 z; 1587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pFreqInfo; 1589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp; 1590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 test; 1591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pFreq_2_Time_data_1; 1593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pFreq_2_Time_data_2; 1594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 *pLong_Window_1; 1596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 *pLong_Window_2; 1597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 *pShort_Window_1; 1598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 *pShort_Window_2; 1599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pOverlap_and_Add_Buffer_1; 1601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pOverlap_and_Add_Buffer_2; 1602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pInterleaved_output; 1604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pInterleaved_output_2; 1605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 * Long_Window_fxp[NUM_WINDOW_SHAPES]; 1608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 * Short_Window_fxp[NUM_WINDOW_SHAPES]; 1609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Long_Window_fxp[0] = Long_Window_sine_fxp; 1611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Long_Window_fxp[1] = Long_Window_KBD_fxp; 1612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Short_Window_fxp[0] = Short_Window_sine_fxp; 1613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Short_Window_fxp[1] = Short_Window_KBD_fxp; 1614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (wnd_seq != EIGHT_SHORT_SEQUENCE) 1616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = (Int16 *)Frequency_data; 1619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp = imdct_fxp( 1622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)pFreqInfo, 1623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer, 1624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber LONG_BLOCK1, 1625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format, 1626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber abs_max_per_window[0]); 1627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The C Programming Language, Second Edition, Kernighan & Ritchie, 1631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * page 206. 1632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * "The result [of a shift] is undefined if the right operand is 1633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * negative, or greater than or equal to the number of bits in the 1634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * left expression's type" 1635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * => avoid shift by 32 or 16 1636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp < 16) 1639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = pFreqInfo; 1642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber switch (wnd_seq) 1645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case ONLY_LONG_SEQUENCE: 1648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber default: 1649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = Time_data; 1652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output = Interleaved_output; 1654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int16 *pLong_Window_2 = &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1]; 1658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pFreq2T = (Int32 *)pFreqInfo; 1660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pFreq2T_2 = &pFreq2T[HALF_LONG_WINDOW]; 1661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * win = (Int32 *) & Long_Window_fxp[wnd_shape_prev_bk][0]; 1662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int shift = exp + 15 - SCALING; 1664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_LONG_WINDOW; i != 0; i--) 1666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1, win2; 1668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp2, test2; 1669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 winx; 1671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp2 = *(pFreq2T++); 1673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber winx = *(win++); 1674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pOverlap_and_Add_Buffer_1++); 1676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test2 = *(pOverlap_and_Add_Buffer_1--); 1677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16bb(temp2, winx) >> shift; 1678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp2 = fxp_mul_16_by_16tt(temp2, winx) >> shift; 1679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (temp + test)); 1681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output + 2), (temp2 + test2)); 1683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 4; 1684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp2 = *(pFreq2T_2++); 1686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pLong_Window_2--); 1688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win2 = *(pLong_Window_2--); 1689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16bb(temp2, win1) >> shift; 1690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test2 = fxp_mul_16_by_16tb(temp2, win2) >> shift; 1691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1692dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp; 1693dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = test2; 1694dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1695dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1696dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1697dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1698dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1699dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1700dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 1701dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1702dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case LONG_START_SEQUENCE: 1703dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1704dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = 1705dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pFreq_2_Time_data_1[ HALF_LONG_WINDOW]; 1706dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1707dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLong_Window_1 = &Long_Window_fxp[wnd_shape_prev_bk][0]; 1708dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLong_Window_2 = &pLong_Window_1[ HALF_LONG_WINDOW]; 1709dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1710dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &Time_data[0]; 1711dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = &Time_data[HALF_LONG_WINDOW]; 1712dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1713dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1714dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output = Interleaved_output; 1715dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output_2 = pInterleaved_output + (2 * HALF_LONG_WINDOW); 1716dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1717dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1718dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1719dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * process first LONG_WINDOW elements 1720dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1721dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1722dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 1723dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1724dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_LONG_WINDOW; i != 0; i--) 1725dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1726dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1, win2; 1727dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1, dat2; 1728dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 test1, test2; 1729dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1730dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 1731dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pLong_Window_1++); 1732dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test1 = *(pOverlap_and_Add_Buffer_1++); 1733dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1734dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat2 = *(pFreq_2_Time_data_2++); 1735dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win2 = *(pLong_Window_2++); 1736dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test2 = *(pOverlap_and_Add_Buffer_2++); 1737dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1738dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (test1 + (fxp_mul_16_by_16(dat1, win1) >> shift))); 1739dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1740dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 1741dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1742dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output_2), (test2 + (fxp_mul_16_by_16(dat2, win2) >> shift))); 1743dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1744dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output_2 += 2; 1745dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1746dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1747dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1748dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1749dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * data unchanged from LONG_WINDOW to W_L_START_1 1750dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * only scaled accordingly 1751dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1752dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1753dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &Time_data[0]; 1754dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[LONG_WINDOW]; 1755dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1756dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp -= SCALING; 1757dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1758dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp >= 0) 1759dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1760dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1761dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--) 1762dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1763dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = 1764dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pFreq_2_Time_data_1++) >> exp; 1765dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = 1766dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pFreq_2_Time_data_1++) >> exp; 1767dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1768dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1769dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1770dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1771dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (exp < 0) 1772dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1773dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1774dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int shift = -exp; 1775dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0 ; i--) 1776dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1777dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift; 1778dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp2; 1779dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift; 1780dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp2; 1781dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1782dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1783dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1784dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1785dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1786dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1787dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--) 1788dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1789dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = 1790dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pFreq_2_Time_data_1++); 1791dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = 1792dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pFreq_2_Time_data_1++); 1793dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1794dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1795dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1796dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1797dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1798dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1799dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[W_L_START_1]; 1800dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = 1801dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pFreq_2_Time_data_1[HALF_SHORT_WINDOW]; 1802dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1803dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = 1804dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 1805dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1806dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = pShort_Window_1 - HALF_SHORT_WINDOW; 1807dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1808dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1 + 1809dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HALF_SHORT_WINDOW; 1810dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1811dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1812dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1, win2; 1813dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1, dat2; 1814dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp2; 1815dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1816dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 1817dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1818dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1819dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = (*pFreq_2_Time_data_1++); 1820dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat2 = (*pFreq_2_Time_data_2++); 1821dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1--); 1822dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win2 = *(pShort_Window_2--); 1823dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1824dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16(dat1, win1) >> shift; 1825dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp; 1826dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1827dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp2 = fxp_mul_16_by_16(dat2, win2) >> shift; 1828dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_2++) = temp2; 1829dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1830dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1831dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1832dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1833dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 += HALF_SHORT_WINDOW; 1834dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1835dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1836dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 1837dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1, 1838dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 1839dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (LONG_BLOCK1 - W_L_START_2) 1840dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *sizeof(*pOverlap_and_Add_Buffer_1)); 1841dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1842dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1843dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 1844dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1845dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1846dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber case LONG_STOP_SEQUENCE: 1847dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1848dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_2]; 1849dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1850dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output = &Interleaved_output[2*W_L_STOP_2]; 1851dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1852dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[W_L_STOP_2]; 1853dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1854dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp -= SCALING; 1855dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1856dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1857dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp > 0) 1858dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1859dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 tmp1 = (*(pFreq_2_Time_data_1++) >> exp); 1860dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 1861dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1862dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--) 1863dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1864dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (temp + tmp1)); 1865dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1866dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 1867dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp1 = *(pFreq_2_Time_data_1++) >> exp; 1868dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 1869dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1870dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1871dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (exp < 0) 1872dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1873dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = -exp; 1874dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1875dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift; 1876dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 1877dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1878dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--) 1879dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1880dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (temp + temp1)); 1881dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1882dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 1883dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift; 1884dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 1885dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1886dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1887dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1888dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1889dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 tmp1 = *(pFreq_2_Time_data_1++); 1890dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 1891dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--) 1892dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1893dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (temp + tmp1)); 1894dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1895dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 1896dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp1 = *(pFreq_2_Time_data_1++); 1897dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 1898dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1899dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1900dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1901dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1902dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1903dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window_fxp[wnd_shape_prev_bk][0]; 1904dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = &pShort_Window_1[HALF_SHORT_WINDOW]; 1905dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1906dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[W_L_STOP_1]; 1907dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = 1908dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pFreq_2_Time_data_1[HALF_SHORT_WINDOW]; 1909dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1910dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_1]; 1911dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1 1912dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + HALF_SHORT_WINDOW; 1913dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1914dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1915dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output = &Interleaved_output[2*W_L_STOP_1]; 1916dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output_2 = pInterleaved_output + (2 * HALF_SHORT_WINDOW); 1917dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1918dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp += SCALING; /* +8 back to what it was */ 1919dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 1920dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1921dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1922dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 1923dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1924dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1925dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1; 1926dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1; 1927dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1928dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 1929dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 1930dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1++); 1931dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1932dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = fxp_mul_16_by_16(dat1, win1); 1933dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1934dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (temp + (test >> shift))); 1935dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1936dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 1937dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1938dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 1939dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2++); 1940dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2++); 1941dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = fxp_mul_16_by_16(dat1, win1); 1942dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1943dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output_2), (temp + (test >> shift))); 1944dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1945dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output_2 += 2; 1946dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1947dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1948dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1949dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1950dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1951dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = &pFreqInfo[LONG_WINDOW]; 1952dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1953dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = Time_data; 1954dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1955dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1956dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output = Interleaved_output; 1957dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1958dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pLong_Window_2 = 1959dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1]; 1960dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1961dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1962dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1963dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copy previous time in current buffer, also copy overlap 1964dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and add buffer 1965dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1966dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1967dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = W_L_STOP_1; i != 0; i--) 1968dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1969dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1970dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1; 1971dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1; 1972dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1973dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pLong_Window_2--); 1974dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *pFreq_2_Time_data_2++; 1975dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1976dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), *(pOverlap_and_Add_Buffer_1)); 1977dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1978dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 1979dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1980dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16(dat1, win1) >> shift; 1981dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp ; 1982dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1983dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1984dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1985dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = (LONG_WINDOW - W_L_STOP_1); i != 0; i--) 1986dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1987dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1988dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16(*pFreq_2_Time_data_2++, *(pLong_Window_2--)) >> shift; 1989dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = temp ; 1990dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1991dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1992dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1993dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber break; 1994dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1995dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1996dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1997dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* switch (wnd_seq) */ 1998dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1999dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (exp < 16) */ 2000dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2001dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2002dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2003dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* all zeros buffer or excessive down shift */ 2004dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2005dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Overlap and add, setup buffer for next iteration */ 2006dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &Time_data[0]; 2007dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2008dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output = Interleaved_output; 2009dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2010dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2011dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = (*pOverlap_and_Add_Buffer_1++); 2012dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = LONG_WINDOW; i != 0; i--) 2013dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2014dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2015dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), temp); 2016dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2017dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 2018dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = (*pOverlap_and_Add_Buffer_1++); 2019dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2020dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset(Time_data, 0, LONG_WINDOW*sizeof(Time_data[0])); 2021dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2022dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2023dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2024dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2025dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2026dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2027dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pScrath_mem; 2028dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pScrath_mem_entry; 2029dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pFrequency_data = Frequency_data; 2030dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2031dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pOverlap_and_Add_Buffer_1; 2032dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pOverlap_and_Add_Buffer_2; 2033dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pOverlap_and_Add_Buffer_1x; 2034dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 * pOverlap_and_Add_Buffer_2x; 2035dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2036dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2037dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2038dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Frequency_data is 2*LONG_WINDOW length but only 2039dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the first LONG_WINDOW elements are filled in, 2040dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * then the second part can be used as scratch mem, 2041dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * then grab data from one window at a time in 2042dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * reverse order. 2043dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The upper LONG_WINDOW Int32 are used to hold the 2044dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * computed overlap and add, used in the next call to 2045dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * this function, and also as sctrach memory 2046dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2047dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2048dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2049dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Frequency_data usage for the case EIGHT_SHORT_SEQUENCE 2050dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2051dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |<----- Input Freq. data ----->|< Overlap & Add ->| Unused |-Scratch-| 2052dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | Store for next | | memory | 2053dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | call | | | 2054dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | | | 2055dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |//////////////////////////////|\\\\\\\\\\\\\\\\\\|--------|+++++++++| 2056dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber | | | | | 2057dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0 LONG_WINDOW LONG_WINDOW | 2*LONG_WINDOW 2058dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + | | 2059dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber W_L_STOP_2 | | 2060dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber |<-- -->| 2061dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_WINDOW + 2062dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HALF_SHORT_WINDOW 2063dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 2064dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2065dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2066dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &pFrequency_data[ 2067dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber LONG_WINDOW + 3*SHORT_WINDOW + HALF_SHORT_WINDOW]; 2068dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2069dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2070dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Initialize to zero, only the firt short window used in overlap 2071dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and add 2072dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2073dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 2074dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1, 2075dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 2076dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1)); 2077dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2078dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2079dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Showt windows are evaluated in decresing order. Windows from 7 2080dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * to 0 are break down in four cases: window numbers 7 to 5, 4, 3, 2081dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and 2 to 0. 2082dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The data from short windows 3 and 4 is situated at the boundary 2083dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * between the 'overlap and add' buffer and the output buffer. 2084dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2085dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (wnd = NUM_SHORT_WINDOWS - 1; wnd >= NUM_SHORT_WINDOWS / 2 + 1; wnd--) 2086dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2087dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2088dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW]; 2089dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2090dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp = imdct_fxp( 2091dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)pFreqInfo, 2092dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer, 2093dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_BLOCK1, 2094dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format, 2095dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber abs_max_per_window[wnd]); 2096dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2097dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* W_L_STOP_1 == (LONG_WINDOW - SHORT_WINDOW)>>1 */ 2098dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = 2099dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pFrequency_data[ W_L_STOP_1 + SHORT_WINDOW*wnd]; 2100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = 2103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 + SHORT_WINDOW; 2104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If all element are zero or if the exponent is bigger than 2107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 16 ( it becomes an undefined shift) -> skip 2108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp < 16) 2111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[0]; 2115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW]; 2116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Each of the eight short blocks is windowed separately. 2120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Window shape decisions are made on a frame-by-frame 2121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * basis. 2122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0]; 2125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = 2127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 2128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For short windows from 7 to 5 2134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | ========================= 2135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | | 5 6 7 2136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * _--_ _--_ _--_ _--_ | _-|-_ _--_ _--_ _--_ 2137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / \/ \/ \/ \|/ | \/ \/ \/ \ 2138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / /\ /\ /\ /|\ | /\ /\ /\ \ 2139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \ / \ / \ / | \ | / \ / \ / \ \ 2140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \/ \/ \/ | \|/ \/ \ \ \ 2141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * --------------------------------|---[///////////////////////]-------- 2142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 2143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 2147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 2150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1, win2; 2152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1, dat2; 2153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat2 = *(pFreq_2_Time_data_2++); 2155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win2 = *(pShort_Window_2--); 2156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pOverlap_and_Add_Buffer_2; 2157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 2158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 2159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_2++) = temp + (fxp_mul_16_by_16(dat2, win2) >> shift); 2161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = fxp_mul_16_by_16(dat1, win1) >> shift; 2163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (exp < 16) */ 2167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 2170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1, 2171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 2172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1)); 2173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber }/* for ( wnd=NUM_SHORT_WINDOWS-1; wnd>=NUM_SHORT_WINDOWS/2; wnd--) */ 2177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber wnd = NUM_SHORT_WINDOWS / 2; 2180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW]; 2182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * scratch memory is allocated in an unused part of memory 2185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem = &pFrequency_data[ 2*LONG_WINDOW - HALF_SHORT_WINDOW]; 2189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW]; 2191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1 2193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + HALF_SHORT_WINDOW; 2194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp = imdct_fxp( 2197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)pFreqInfo, 2198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer, 2199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_BLOCK1, 2200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format, 2201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber abs_max_per_window[wnd]); 2202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If all element are zero or if the exponent is bigger than 2205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 16 ( it becomes an undefined shift) -> skip 2206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp < 16) 2210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[0]; 2213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW]; 2214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0]; 2216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = 2218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 2219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For short window 4 2223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ====|=========== 2224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | 4 2225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | | | | 2226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * _--_ _--_ _--_ _-|-_ | _-|-_ _-|-_ _--_ _--_ 2227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / \/ \/ \/ | \|/ | \/ | \/ \/ \ 2228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / /\ /\ /\ | /|\ | /\ | /\ /\ \ 2229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \ / \ / \ | / | \ | / \ | / \ / \ \ 2230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \/ \/ \|/ | \|/ \|/ \/ \ \ 2231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ------------------------------[\\\|\\\|//////]------------------- 2232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | | A | B | C | 2233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | 2234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * W_L_STOP_1 2235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 2238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1; 2240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1; 2241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment A ---------------*/ 2242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 2243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 2244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 2245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pScrath_mem++) = fxp_mul_16_by_16(dat1, win1) >> shift; 2247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 2248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 2249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment B ---------------*/ 2252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 2253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) = fxp_mul_16_by_16(dat1, win1) >> shift; 2255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 2257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 2258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment C ---------------*/ 2261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pOverlap_and_Add_Buffer_2; 2262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 2263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 2264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 2266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_2++) = temp + (fxp_mul_16_by_16(dat1, win1) >> shift); 2268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pOverlap_and_Add_Buffer_2; 2270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 2271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 2272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (exp < 16) */ 2276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 2279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem, 2280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 2281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HALF_SHORT_WINDOW*sizeof(*pScrath_mem)); 2282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 2284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1, 2285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 2286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HALF_SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1)); 2287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber wnd = NUM_SHORT_WINDOWS / 2 - 1; 2291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW]; 2293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem_entry = 2295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &pFrequency_data[2*LONG_WINDOW - HALF_SHORT_WINDOW - SHORT_WINDOW]; 2296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem = pScrath_mem_entry; 2299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW]; 2301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* point to end of buffer less HALF_SHORT_WINDOW */ 2303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output_2 = &Interleaved_output[2*(LONG_WINDOW - HALF_SHORT_WINDOW)]; 2305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output = pInterleaved_output_2; 2306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1x = &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)]; 2308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp = imdct_fxp( 2311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)pFreqInfo, 2312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer, 2313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_BLOCK1, 2314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format, 2315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber abs_max_per_window[wnd]); 2316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If all element are zero or if the exponent is bigger than 2319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 16 ( it becomes an undefined shift) -> skip 2320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp < 16) 2323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[0]; 2326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW]; 2327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For short window 3 2331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ===========|==== 2332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 3 | 2333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | | | | 2334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * _--_ _--_ _-|-_ _-|-_ | _-|-_ _--_ _--_ _--_ 2335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / \/ \/ | \/ | \|/ | \/ \/ \/ \ 2336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / /\ /\ | /\ | /|\ | /\ /\ /\ \ 2337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \ / \ | / \ | / | \ | / \ / \ / \ \ 2338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \/ \|/ \|/ | \|/ \/ \ \ \ 2339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -----|------------------[\\\\\\|///|///]-------------------------- 2340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | | A | B | C | 2341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 2342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * W_L_STOP_1 2343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0]; 2347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = 2349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 2350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 2352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1; 2354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1; 2355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment A ---------------*/ 2356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 2357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 2358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 2359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pScrath_mem++) = fxp_mul_16_by_16(dat1, win1) >> shift; 2361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 2362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 2363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 2366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 2367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment B ---------------*/ 2370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 2371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = fxp_mul_16_by_16(dat1, win1) >> shift; 2373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pScrath_mem++) + test; 2375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pOverlap_and_Add_Buffer_1x++); 2377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (temp + test)); 2378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 2381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 2382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 2383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* -------- segment C ---------------*/ 2387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 2388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = fxp_mul_16_by_16(dat1, win1) >> shift; 2391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1++) += temp; 2393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 2395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 2396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (exp < 16) */ 2400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 2404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem, 2405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 2406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_WINDOW*sizeof(*pScrath_mem)); 2407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem += SHORT_WINDOW; 2409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pScrath_mem++); 2411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = HALF_SHORT_WINDOW; i != 0; i--) 2412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (temp)); 2414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 2416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pScrath_mem++); 2417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (wnd = NUM_SHORT_WINDOWS / 2 - 2; wnd >= 0; wnd--) 2423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output_2 -= (SHORT_WINDOW * 2); 2427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output = pInterleaved_output_2; 2428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The same memory is used as scratch in every iteration 2431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem = pScrath_mem_entry; 2433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2x = 2435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)]; 2436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW]; 2438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber exp = imdct_fxp( 2442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)pFreqInfo, 2443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freq_2_time_buffer, 2444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber SHORT_BLOCK1, 2445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Q_format, 2446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber abs_max_per_window[wnd]); 2447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If all element are zero or if the exponent is bigger than 2450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 16 ( it becomes an undefined shift) -> skip 2451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (exp < 16) 2454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_1 = &pFreqInfo[0]; 2457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW]; 2458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Each of the eight short blocks is windowed separately. 2462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Window shape decisions are made on a frame-by-frame 2463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * basis. 2464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0]; 2467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (wnd == 0) 2469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_1 = 2471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_prev_bk][0]; 2472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pShort_Window_2 = 2475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1]; 2476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For short windows from 2 to 0 2480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 2481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ========================= 2482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | 2483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 0 1 2 | | 2484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * _--_ _--_ _--_ _-|-_ | _--_ _--_ _--_ _--_ 2485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / \/ \/ \/ | \|/ \/ \/ \/ \ 2486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / /\ /\ /\ | /|\ /\ /\ /\ \ 2487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \ / \ / \ | / | \ / \ / \ / \ \ 2488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * / / \/ \/ \|/ | \/ \/ \ \ \ 2489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ----[\\\\\\\\\\\\\\\\\\\\\\\\]---|----------------------------- 2490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * | 2491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 2492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * W_L_STOP_1 2493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift = exp + 15 - SCALING; 2496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 dat1 = *(pFreq_2_Time_data_2++); 2498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win1 = *(pShort_Window_2--); 2499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pScrath_mem); 2501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 2502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = fxp_mul_16_by_16(dat1, win1) >> shift; 2504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp += test; 2506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_1++); 2507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_1++); 2508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (temp + *(pOverlap_and_Add_Buffer_2x++))); 2510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 2512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pScrath_mem++) = fxp_mul_16_by_16(dat1, win1) >> shift; 2514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dat1 = *(pFreq_2_Time_data_2++); 2515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win1 = *(pShort_Window_2--); 2516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pScrath_mem); 2517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (exp < 16) */ 2521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pScrath_mem); 2524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2x++); 2525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 2527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (temp + test)); 2529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 2531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pScrath_mem++) = 0; 2533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pScrath_mem); 2534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2x++); 2535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for ( wnd=NUM_SHORT_WINDOWS/2-1; wnd>=0; wnd--) */ 2539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2x = &Time_data[W_L_STOP_1]; 2541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pScrath_mem = pScrath_mem_entry; 2543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output_2 -= (SHORT_WINDOW * 2); 2545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output = pInterleaved_output_2; 2546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pScrath_mem++); 2548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2x++); 2549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = SHORT_WINDOW; i != 0; i--) 2551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), (temp + test)); 2553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 2555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber test = *(pScrath_mem++); 2556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2x++); 2557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1x = Time_data; 2561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output = Interleaved_output; 2563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1x++); 2566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = W_L_STOP_1; i != 0; i--) 2567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber limiter(*(pInterleaved_output), temp); 2569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pInterleaved_output += 2; 2571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_1x++); 2572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1x = &Time_data[0]; 2576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_2 = &pFrequency_data[LONG_WINDOW]; 2578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * update overlap and add buffer, 2581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * so is ready for next iteration 2582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (int i = 0; i < W_L_STOP_2; i++) 2585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *(pOverlap_and_Add_Buffer_2++); 2587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pOverlap_and_Add_Buffer_1x++) = temp; 2588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset( 2591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pOverlap_and_Add_Buffer_1x, 2592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, 2593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber W_L_STOP_1*sizeof(*pOverlap_and_Add_Buffer_1x)); 2594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if ( wnd_seq != EIGHT_SHORT_SEQUENCE) */ 2596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* trans4m_freq_2_time_fxp */ 2601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2605