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