1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------
2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License.
6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at
7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied.
14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions
15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License.
16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * -------------------------------------------------------------------
17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   PacketVideo Corp.
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Filename: pvmp3_alias_reduction.cpp
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 09/21/2007
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *input_buffer,          Ptr to fequency lines of current channel
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    struct gr_info_s *gr_info,    structure with granuke information for the
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                                  input
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    mp3Header *info               mp3 header information
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Alias Reduction
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Alias reduction before processing by the IMDCT
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                   Csi  +
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     >---------0---------0-------->
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                \       / -
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             Cai \     /
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                  \   /
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                   \ /
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                    \
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                  /  \
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber             Cai /    \
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber               /       \  +
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     >--------0---------0---------->
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                  Csi  +
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber      Aliasing Butterfly
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber      Alias reduction is not applied to short blocks
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                1                                ci
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber  csi = ----------------           csi = ----------------
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        sqrt( 1 + (ci^2))                sqrt( 1 + (ci^2))
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber  ci = -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber ------------------------------------------------------------------------------
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_alias_reduction.h"
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3dec_fxd_op.h"
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define NUM_BUTTERFLIES 8
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define Q31_fmt(a)    (int32(double(0x7FFFFFFF)*a))
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 c_signal [ NUM_BUTTERFLIES ] =
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Q31_fmt(0.85749292571254f), Q31_fmt(0.88174199731771f),
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Q31_fmt(0.94962864910273f), Q31_fmt(0.98331459249179f),
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Q31_fmt(0.99551781606759f), Q31_fmt(0.99916055817815f),
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Q31_fmt(0.99989919524445f), Q31_fmt(0.99999315507028f)
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber};
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 c_alias [ NUM_BUTTERFLIES ] =
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Q31_fmt(-0.51449575542753f), Q31_fmt(-0.47173196856497f),
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Q31_fmt(-0.31337745420390f), Q31_fmt(-0.18191319961098f),
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Q31_fmt(-0.09457419252642f), Q31_fmt(-0.04096558288530f),
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Q31_fmt(-0.01419856857247f), Q31_fmt(-0.00369997467376f)
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber};
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_alias_reduction(int32 *input_buffer,         /* Ptr to spec values of current channel */
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                           granuleInfo *gr_info,
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                           int32  *used_freq_lines,
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                           mp3Header *info)
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *ptr1;
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *ptr2;
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *ptr3;
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *ptr4;
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    const int32 *ptr_csi;
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    const int32 *ptr_csa;
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32  sblim;
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 i, j;
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    *used_freq_lines = fxp_mul32_Q32(*used_freq_lines << 16, (int32)(0x7FFFFFFF / (float)18 - 1.0f)) >> 15;
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (gr_info->window_switching_flag &&  gr_info->block_type == 2)
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (gr_info->mixed_block_flag)
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sblim = ((info->version_x == MPEG_2_5) && (info->sampling_frequency == 2)) ? 3 : 1;
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        else
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            return;  /* illegal parameter */
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    else
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        sblim = *used_freq_lines + 1;
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (sblim > SUBBANDS_NUMBER - 1)
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sblim = SUBBANDS_NUMBER - 1;  /* default */
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    ptr3 = &input_buffer[17];
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    ptr4 = &input_buffer[18];
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    ptr_csi = c_signal;
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    ptr_csa = c_alias;
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /*   NUM_BUTTERFLIES (=8) butterflies between each pair of sub-bands*/
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (i = NUM_BUTTERFLIES >> 1; i != 0; i--)
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 csi1  = *ptr_csi++;
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 csi2  = *ptr_csi++;
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 csa1  = *ptr_csa++;
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        int32 csa2  = *ptr_csa++;
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        ptr1 = ptr3;
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        ptr3 -= 2;
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        ptr2 = ptr4;
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        ptr4 += 2;
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        /*
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         *  "sblim"  alias-reduction operations between each
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         *  pair of sub-bands
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         */
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        for (j = sblim >> 1; j != 0; j--)
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 y = *ptr2;
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 x = *ptr1 << 1;
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr1--  = fxp_msb32_Q32(fxp_mul32_Q32(x, csi1), y << 1, csa1);
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr2++  = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi1), x, csa1);
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            y = *ptr2;
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            x = *ptr1 << 1;
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr1    = fxp_msb32_Q32(fxp_mul32_Q32(x, csi2), y << 1, csa2);
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr2    = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi2), x, csa2);
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            ptr1 += 19;
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            ptr2 += 17;
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            y = *ptr2;
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            x = *ptr1 << 1;
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr1--  = fxp_msb32_Q32(fxp_mul32_Q32(x, csi1), y << 1, csa1);
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr2++  = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi1), x, csa1);
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            y = *ptr2;
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            x = *ptr1 << 1;
240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr1    = fxp_msb32_Q32(fxp_mul32_Q32(x, csi2), y << 1, csa2);
241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr2    = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi2), x, csa2);
242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            ptr1 += 19;
243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            ptr2 += 17;
244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (sblim & 1)
248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 x = *ptr1 << 1;
250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            int32 y = *ptr2;
251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr1--  = fxp_msb32_Q32(fxp_mul32_Q32(x, csi1), y << 1, csa1);
252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr2++  = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi1), x, csa1);
253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            x = *ptr1 << 1;
255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            y = *ptr2;
256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr1    = fxp_msb32_Q32(fxp_mul32_Q32(x, csi2), y << 1, csa2);
257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *ptr2    = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi2), x, csa2);
258d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
259d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
260d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
261d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
262