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