1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------
2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License.
6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at
7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied.
14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions
15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License.
16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -------------------------------------------------------------------
17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified from original shareware code
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified to remove instances of pow() and sqrt(), and
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber optimized for inclusion in fixed-point version of decoder.
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified to include comments/optimizations from code review.
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Also, declared appropriate variables as type "const"
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Adopted strategy of "one q-format per sfb" strategy, which
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber eliminated the array q-format from this function.  The q-format the
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber random vector is stored in is now returned from the function.
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Completely redesigned the routine to allow a simplified
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        calculation of the adjusted noise, by eliminating the dependency
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        on the band_length. Added polynomial approximation for the
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        function 1/sqrt(power). Updated comments and pseudo-code
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:  Modified function description, pseudocode, etc.
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Modified casting to ensure proper operations for different platforms
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Eliminiated access to memory for noise seed. Now a local variable is
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    used. Also unrolled loops to speed up code.
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Modified pointer decrement to a pointer increment, to ensure proper
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    compiler behavior
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs:    random_array[] = Array for storage of the power-scaled
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                             random values of length "band_length"
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            band_length    = Length of random_array[]
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            const Int
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pSeed          = seed for random number generator
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            Int32*
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            power_scale    = scale factor for this particular band
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            const Int
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed:
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed:
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs:   Function returns the q-format the random vector is stored in.
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified:
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            random_array[] = filled with random numbers scaled
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            to the correct power as defined by the input value power_scale.
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified:
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified:
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    None
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function generates a vector of uniformly distributed random numbers for
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the PNS block.  The random numbers are each scaled by a scale_factor,
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber defined in Ref(2) as
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2^(scale_factor/4)
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ------------------
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  sqrt(N*MEAN_NRG)
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where N == band_length, and MEAN_NRG is defined as...
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         N-1
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         ___
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     1   \
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ---   >    x(i)^2
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     N   /__
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         i=0
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber And x is the unscaled vector from the random number generator.
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function takes advantage of the fact that the portion of the
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber scale_factor that is divisible by 4 can be simply accounted for by varying
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the q-format.
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber The scaling of the random numbers is thus broken into the
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber equivalent equation below.
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2^(scale_factor%4)   2^(floor(scale_factor/4))
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ------------------ *
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  sqrt(N*MEAN_NRG)
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2^(scale_factor%4) is stored in a simple 4-element table.
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2^(floor(scale_factor/4) is accounted for by adjusting the q-format.
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sqrt(N*MEAN_NRG) is calculated and implemented via a polynomial approximation.
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function shall produce uniformly distributed random 32-bit integers,
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber with signed random values of average energy equal to the results of the ISO
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber code's multiplying factor discussed in the FUNCTION DESCRIPTION section.
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Please see Ref (2) for a detailed description of the requirements.
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) Numerical Recipes in C     Second Edition
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        William H. Press        Saul A. Teukolsky
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        William T. Vetterling   Brian P. Flannery
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Page 284
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) ISO/IEC 14496-3:1999(E)
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     Part 3
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Subpart 4.6.12 (Perceptual Noise Substitution)
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (3) MPEG-2 NBC Audio Decoder
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   "This software module was originally developed by AT&T, Dolby
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   3. This software module is an implementation of a part of one or more
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   standards free license to this software module or modifications thereof
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for use in hardware or software products claiming conformance to the
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module in hardware or software products are advised that this use may
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   infringe existing patents. The original developer of this software
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   module and his/her company, the subsequent editors and their companies,
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   and ISO/IEC have no liability for use of this software module or
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   modifications thereof in an implementation. Copyright is not released
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   developer retains full right to use the code for his/her  own purpose,
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   assign or donate the code to a third party and to inhibit third party
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   This copyright notice must be included in all copies or derivative
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   works."
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   Copyright(c)1996.
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    power_adj = scale_mod_4[power_scale & 3];
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    power = 0;
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    FOR (k=band_length; k > 0; k--)
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pSeed) = *(pSeed) * 1664525L;
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pSeed) = *(pSeed) + 1013904223L;
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp = (Int)(*(pSeed) >> 16);
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        power = power + ((temp*temp) >> 6);
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *(pArray) = (Int32)temp;
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pArray = pArray + 1;
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ENDFOR
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    k = 0;
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    q_adjust = 30;
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    IF (power)
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    THEN
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        WHILE ( power > 32767)
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            power = power >> 1;
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            k = k + 1;
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDWHILE
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        k = k - 13;
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        IF (k < 0)
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        THEN
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            k = -k;
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            IF ( k & 1 )
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            THEN
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                power_adj = (power_adj*SQRT_OF_2)>>14;
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDIF
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            q_adjust = q_adjust - ( k >> 1);
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ELSE IF (k > 0)
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        THEN
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            IF ( k & 1  )
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            THEN
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                power_adj = (power_adj*INV_SQRT_OF_2)>>14;
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            ENDIF
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            q_adjust = q_adjust + ( k >> 1);
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDIF
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInvSqrtCoeff = inv_sqrt_coeff;
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power  = (*(pInvSqrtCoeff)* power) >>15;
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInvSqrtCoeff = pInvSqrtCoeff + 1;
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power = inv_sqrt_power + *(pInvSqrtCoeff);
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInvSqrtCoeff = pInvSqrtCoeff + 1;
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        FOR ( k=INV_SQRT_POLY_ORDER - 1; k>0; k--)
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            inv_sqrt_power  =  ( inv_sqrt_power * power)>>15;
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            inv_sqrt_power = inv_sqrt_power + *(pInvSqrtCoeff);
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pInvSqrtCoeff = pInvSqrtCoeff + 1;
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDFOR
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power = (inv_sqrt_power*power_adj)>>13;
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        FOR (k=band_length; k > 0; k--)
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pArray = pArray - 1;
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pArray) = *(pArray)*inv_sqrt_power;
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ENDFOR
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    ENDIF
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    q_adjust = q_adjust - (power_scale >> 2);
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return q_adjust;
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber   When the code is written for a specific target processor
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     the resources used should be documented below.
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber          stack usage for each subroutine called]
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [stack usage variable] = stack usage for [subroutine
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         name] (see [filename].ext)
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           used to represent cycle count for each subroutine
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           called]
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     where: [cycle count variable] = cycle count for [subroutine
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        name] (see [filename].ext)
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "pv_audio_type_defs.h"
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "gen_rand_vector.h"
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "window_block_fxp.h"
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define     SQRT_OF_2       23170       /*    sqrt(2) in Q14  */
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define     INV_SQRT_OF_2   11585       /*  1/sqrt(2) in Q14  */
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define     INV_SQRT_POLY_ORDER     4
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  2^([0:3]/4) = 1.0000    1.1892    1.4142    1.6818
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst UInt scale_mod_4[4] = { 16384, 19484, 23170, 27554};
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *  polynomial approx. in Q12 (type Int)
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int  inv_sqrt_coeff[INV_SQRT_POLY_ORDER+1] =
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    { 4680, -17935, 27697, -22326, 11980};
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberInt gen_rand_vector(
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32     random_array[],
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int band_length,
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32*   pSeed,
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int power_scale)
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int      k;
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    UInt     power_adj;
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int      q_adjust = 30;
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32    temp;
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32    seed;
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32    power;
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32*   pArray = &random_array[0];
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32    inv_sqrt_power;
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int  *pInvSqrtCoeff;
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  The out of the random number generator is scaled is such a way
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  that is independent of the band length.
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  The output is computed as:
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *                  x(i)
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  output = ------------------ * 2^(power_scale%4) 2^(floor(power_scale/4))
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *                   bl
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *           sqrt(  SUM x(i)^2 )
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *                   0
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  bl == band length
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  get 2^(power_scale%4)
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    power = 0;
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    seed = *pSeed;
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  band_length is always an even number (check tables in pg.66 IS0 14496-3)
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (band_length < 0 || band_length > LONG_WINDOW)
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        return  q_adjust;     /*  avoid any processing on error condition */
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    for (k = (band_length >> 1); k != 0; k--)
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*------------------------------------------------
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber           Numerical Recipes in C
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    Page 284
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        ------------------------------------------------*/
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        seed *= 1664525L;
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        seed += 1013904223L;
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp =  seed >> 16;
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        seed *= 1664525L;
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        seed += 1013904223L;
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* shift by 6 make room for band length accumulation  */
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        power  += ((temp * temp) >> 6);
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pArray++ = temp;
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        temp    = seed >> 16;
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        power  += ((temp * temp) >> 6);
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        *pArray++ = temp;
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    } /* END for (k=half_band_length; k > 0; k--) */
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    *pSeed = seed;
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  If the distribution is uniform, the power is expected to use between
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  28 and 27 bits, by shifting down by 13 bits the power will be a
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  Q15 number.
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *  For different band lengths, the power uses between 20 and 29 bits
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    k = 0;
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (power)
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    approximation requires power  between 0.5 < power < 1 in Q15.
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        while (power > 32767)
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            power >>= 1;
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            k++;
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *  expected power bit usage == 27 bits
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        k -= 13;
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        power_adj = scale_mod_4[power_scale & 3];
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (k < 0)
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            k = -k;
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (k & 1)
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {                               /* multiply by sqrt(2)  */
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                power_adj = (UInt)(((UInt32) power_adj * SQRT_OF_2) >> 14);
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            q_adjust -= (k >> 1);    /* adjust Q instead of shifting up */
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else if (k > 0)
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (k & 1)
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {                               /* multiply by 1/sqrt(2)  */
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                power_adj = (UInt)(((UInt32) power_adj * INV_SQRT_OF_2) >> 14);
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            q_adjust += (k >> 1);   /* adjust Q instead of shifting down */
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    Compute 1/sqrt(power), where 0.5 < power < 1.0 is approximated
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    using a polynomial order INV_SQRT_POLY_ORDER
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pInvSqrtCoeff = inv_sqrt_coeff;
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power  = (*(pInvSqrtCoeff++) * power) >> 15;
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power += *(pInvSqrtCoeff++);
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power  = (inv_sqrt_power * power) >> 15;
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power += *(pInvSqrtCoeff++);
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power  = (inv_sqrt_power * power) >> 15;
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power += *(pInvSqrtCoeff++);
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power  = (inv_sqrt_power * power) >> 15;
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power += *(pInvSqrtCoeff);
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        inv_sqrt_power  = (inv_sqrt_power * power_adj) >> 13;
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pArray = &random_array[0];
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (k = (band_length >> 1); k != 0; k--)
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp        = *(pArray) * inv_sqrt_power;
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pArray++) = temp;
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            temp        = *(pArray) * inv_sqrt_power;
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pArray++) = temp;
500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        } /* END for (k=half_band_length; k > 0; k--) */
501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }   /* if(power) */
503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /*
505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     *      Adjust Q with the value corresponding to 2^(floor(power_scale/4))
506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber     */
507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    q_adjust  -= (power_scale >> 2);
509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return (q_adjust);
511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* gen_rand_vector */
513