1/* ----------------------------------------------------------------------------- 2Software License for The Fraunhofer FDK AAC Codec Library for Android 3 4© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten 5Forschung e.V. All rights reserved. 6 7 1. INTRODUCTION 8The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software 9that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding 10scheme for digital audio. This FDK AAC Codec software is intended to be used on 11a wide variety of Android devices. 12 13AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient 14general perceptual audio codecs. AAC-ELD is considered the best-performing 15full-bandwidth communications codec by independent studies and is widely 16deployed. AAC has been standardized by ISO and IEC as part of the MPEG 17specifications. 18 19Patent licenses for necessary patent claims for the FDK AAC Codec (including 20those of Fraunhofer) may be obtained through Via Licensing 21(www.vialicensing.com) or through the respective patent owners individually for 22the purpose of encoding or decoding bit streams in products that are compliant 23with the ISO/IEC MPEG audio standards. Please note that most manufacturers of 24Android devices already license these patent claims through Via Licensing or 25directly from the patent owners, and therefore FDK AAC Codec software may 26already be covered under those patent licenses when it is used for those 27licensed purposes only. 28 29Commercially-licensed AAC software libraries, including floating-point versions 30with enhanced sound quality, are also available from Fraunhofer. Users are 31encouraged to check the Fraunhofer website for additional applications 32information and documentation. 33 342. COPYRIGHT LICENSE 35 36Redistribution and use in source and binary forms, with or without modification, 37are permitted without payment of copyright license fees provided that you 38satisfy the following conditions: 39 40You must retain the complete text of this software license in redistributions of 41the FDK AAC Codec or your modifications thereto in source code form. 42 43You must retain the complete text of this software license in the documentation 44and/or other materials provided with redistributions of the FDK AAC Codec or 45your modifications thereto in binary form. You must make available free of 46charge copies of the complete source code of the FDK AAC Codec and your 47modifications thereto to recipients of copies in binary form. 48 49The name of Fraunhofer may not be used to endorse or promote products derived 50from this library without prior written permission. 51 52You may not charge copyright license fees for anyone to use, copy or distribute 53the FDK AAC Codec software or your modifications thereto. 54 55Your modified versions of the FDK AAC Codec must carry prominent notices stating 56that you changed the software and the date of any change. For modified versions 57of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" 58must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK 59AAC Codec Library for Android." 60 613. NO PATENT LICENSE 62 63NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without 64limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. 65Fraunhofer provides no warranty of patent non-infringement with respect to this 66software. 67 68You may use this FDK AAC Codec software or modifications thereto only for 69purposes that are authorized by appropriate patent licenses. 70 714. DISCLAIMER 72 73This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright 74holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, 75including but not limited to the implied warranties of merchantability and 76fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 77CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, 78or consequential damages, including but not limited to procurement of substitute 79goods or services; loss of use, data, or profits, or business interruption, 80however caused and on any theory of liability, whether in contract, strict 81liability, or tort (including negligence), arising in any way out of the use of 82this software, even if advised of the possibility of such damage. 83 845. CONTACT INFORMATION 85 86Fraunhofer Institute for Integrated Circuits IIS 87Attention: Audio and Multimedia Departments - FDK AAC LL 88Am Wolfsmantel 33 8991058 Erlangen, Germany 90 91www.iis.fraunhofer.de/amm 92amm-info@iis.fraunhofer.de 93----------------------------------------------------------------------------- */ 94 95/**************************** SBR decoder library ****************************** 96 97 Author(s): 98 99 Description: 100 101*******************************************************************************/ 102 103/*! 104 \file 105 \brief Fast FFT routines prototypes 106 \author Fabian Haussel 107*/ 108 109#include "hbe.h" 110#include "qmf.h" 111#include "env_extr.h" 112 113#define HBE_MAX_QMF_BANDS (40) 114 115#define HBE_MAX_OUT_SLOTS (11) 116 117#define QMF_WIN_LEN \ 118 (12 + 6 - 4 - 1) /* 6 subband slots extra delay to align with HQ - 4 slots \ 119 to compensate for critical sampling delay - 1 slot to \ 120 align critical sampling exactly (w additional time \ 121 domain delay)*/ 122 123#ifndef PI 124#define PI 3.14159265358979323846 125#endif 126 127static const int xProducts[MAX_STRETCH_HBE - 1] = { 128 1, 1, 1}; /* Cross products on(1)/off(0) for T=2,3,4. */ 129static const int startSubband2kL[33] = { 130 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 131 6, 8, 8, 8, 8, 8, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12}; 132 133static const int pmin = 12; 134 135static const FIXP_DBL hintReal_F[4][3] = { 136 {FL2FXCONST_DBL(0.39840335f), FL2FXCONST_DBL(0.39840335f), 137 FL2FXCONST_DBL(-0.39840335f)}, 138 {FL2FXCONST_DBL(0.39840335f), FL2FXCONST_DBL(-0.39840335f), 139 FL2FXCONST_DBL(-0.39840335f)}, 140 {FL2FXCONST_DBL(-0.39840335f), FL2FXCONST_DBL(-0.39840335f), 141 FL2FXCONST_DBL(0.39840335f)}, 142 {FL2FXCONST_DBL(-0.39840335f), FL2FXCONST_DBL(0.39840335f), 143 FL2FXCONST_DBL(0.39840335f)}}; 144 145static const FIXP_DBL factors[4] = { 146 FL2FXCONST_DBL(0.39840335f), FL2FXCONST_DBL(-0.39840335f), 147 FL2FXCONST_DBL(-0.39840335f), FL2FXCONST_DBL(0.39840335f)}; 148 149#define PSCALE 32 150 151static const FIXP_DBL p_F[128] = {FL2FXCONST_DBL(0.f / (PSCALE * 12.f)), 152 FL2FXCONST_DBL(1.f / (PSCALE * 12.f)), 153 FL2FXCONST_DBL(2.f / (PSCALE * 12.f)), 154 FL2FXCONST_DBL(3.f / (PSCALE * 12.f)), 155 FL2FXCONST_DBL(4.f / (PSCALE * 12.f)), 156 FL2FXCONST_DBL(5.f / (PSCALE * 12.f)), 157 FL2FXCONST_DBL(6.f / (PSCALE * 12.f)), 158 FL2FXCONST_DBL(7.f / (PSCALE * 12.f)), 159 FL2FXCONST_DBL(8.f / (PSCALE * 12.f)), 160 FL2FXCONST_DBL(9.f / (PSCALE * 12.f)), 161 FL2FXCONST_DBL(10.f / (PSCALE * 12.f)), 162 FL2FXCONST_DBL(11.f / (PSCALE * 12.f)), 163 FL2FXCONST_DBL(12.f / (PSCALE * 12.f)), 164 FL2FXCONST_DBL(13.f / (PSCALE * 12.f)), 165 FL2FXCONST_DBL(14.f / (PSCALE * 12.f)), 166 FL2FXCONST_DBL(15.f / (PSCALE * 12.f)), 167 FL2FXCONST_DBL(16.f / (PSCALE * 12.f)), 168 FL2FXCONST_DBL(17.f / (PSCALE * 12.f)), 169 FL2FXCONST_DBL(18.f / (PSCALE * 12.f)), 170 FL2FXCONST_DBL(19.f / (PSCALE * 12.f)), 171 FL2FXCONST_DBL(20.f / (PSCALE * 12.f)), 172 FL2FXCONST_DBL(21.f / (PSCALE * 12.f)), 173 FL2FXCONST_DBL(22.f / (PSCALE * 12.f)), 174 FL2FXCONST_DBL(23.f / (PSCALE * 12.f)), 175 FL2FXCONST_DBL(24.f / (PSCALE * 12.f)), 176 FL2FXCONST_DBL(25.f / (PSCALE * 12.f)), 177 FL2FXCONST_DBL(26.f / (PSCALE * 12.f)), 178 FL2FXCONST_DBL(27.f / (PSCALE * 12.f)), 179 FL2FXCONST_DBL(28.f / (PSCALE * 12.f)), 180 FL2FXCONST_DBL(29.f / (PSCALE * 12.f)), 181 FL2FXCONST_DBL(30.f / (PSCALE * 12.f)), 182 FL2FXCONST_DBL(31.f / (PSCALE * 12.f)), 183 FL2FXCONST_DBL(32.f / (PSCALE * 12.f)), 184 FL2FXCONST_DBL(33.f / (PSCALE * 12.f)), 185 FL2FXCONST_DBL(34.f / (PSCALE * 12.f)), 186 FL2FXCONST_DBL(35.f / (PSCALE * 12.f)), 187 FL2FXCONST_DBL(36.f / (PSCALE * 12.f)), 188 FL2FXCONST_DBL(37.f / (PSCALE * 12.f)), 189 FL2FXCONST_DBL(38.f / (PSCALE * 12.f)), 190 FL2FXCONST_DBL(39.f / (PSCALE * 12.f)), 191 FL2FXCONST_DBL(40.f / (PSCALE * 12.f)), 192 FL2FXCONST_DBL(41.f / (PSCALE * 12.f)), 193 FL2FXCONST_DBL(42.f / (PSCALE * 12.f)), 194 FL2FXCONST_DBL(43.f / (PSCALE * 12.f)), 195 FL2FXCONST_DBL(44.f / (PSCALE * 12.f)), 196 FL2FXCONST_DBL(45.f / (PSCALE * 12.f)), 197 FL2FXCONST_DBL(46.f / (PSCALE * 12.f)), 198 FL2FXCONST_DBL(47.f / (PSCALE * 12.f)), 199 FL2FXCONST_DBL(48.f / (PSCALE * 12.f)), 200 FL2FXCONST_DBL(49.f / (PSCALE * 12.f)), 201 FL2FXCONST_DBL(50.f / (PSCALE * 12.f)), 202 FL2FXCONST_DBL(51.f / (PSCALE * 12.f)), 203 FL2FXCONST_DBL(52.f / (PSCALE * 12.f)), 204 FL2FXCONST_DBL(53.f / (PSCALE * 12.f)), 205 FL2FXCONST_DBL(54.f / (PSCALE * 12.f)), 206 FL2FXCONST_DBL(55.f / (PSCALE * 12.f)), 207 FL2FXCONST_DBL(56.f / (PSCALE * 12.f)), 208 FL2FXCONST_DBL(57.f / (PSCALE * 12.f)), 209 FL2FXCONST_DBL(58.f / (PSCALE * 12.f)), 210 FL2FXCONST_DBL(59.f / (PSCALE * 12.f)), 211 FL2FXCONST_DBL(60.f / (PSCALE * 12.f)), 212 FL2FXCONST_DBL(61.f / (PSCALE * 12.f)), 213 FL2FXCONST_DBL(62.f / (PSCALE * 12.f)), 214 FL2FXCONST_DBL(63.f / (PSCALE * 12.f)), 215 FL2FXCONST_DBL(64.f / (PSCALE * 12.f)), 216 FL2FXCONST_DBL(65.f / (PSCALE * 12.f)), 217 FL2FXCONST_DBL(66.f / (PSCALE * 12.f)), 218 FL2FXCONST_DBL(67.f / (PSCALE * 12.f)), 219 FL2FXCONST_DBL(68.f / (PSCALE * 12.f)), 220 FL2FXCONST_DBL(69.f / (PSCALE * 12.f)), 221 FL2FXCONST_DBL(70.f / (PSCALE * 12.f)), 222 FL2FXCONST_DBL(71.f / (PSCALE * 12.f)), 223 FL2FXCONST_DBL(72.f / (PSCALE * 12.f)), 224 FL2FXCONST_DBL(73.f / (PSCALE * 12.f)), 225 FL2FXCONST_DBL(74.f / (PSCALE * 12.f)), 226 FL2FXCONST_DBL(75.f / (PSCALE * 12.f)), 227 FL2FXCONST_DBL(76.f / (PSCALE * 12.f)), 228 FL2FXCONST_DBL(77.f / (PSCALE * 12.f)), 229 FL2FXCONST_DBL(78.f / (PSCALE * 12.f)), 230 FL2FXCONST_DBL(79.f / (PSCALE * 12.f)), 231 FL2FXCONST_DBL(80.f / (PSCALE * 12.f)), 232 FL2FXCONST_DBL(81.f / (PSCALE * 12.f)), 233 FL2FXCONST_DBL(82.f / (PSCALE * 12.f)), 234 FL2FXCONST_DBL(83.f / (PSCALE * 12.f)), 235 FL2FXCONST_DBL(84.f / (PSCALE * 12.f)), 236 FL2FXCONST_DBL(85.f / (PSCALE * 12.f)), 237 FL2FXCONST_DBL(86.f / (PSCALE * 12.f)), 238 FL2FXCONST_DBL(87.f / (PSCALE * 12.f)), 239 FL2FXCONST_DBL(88.f / (PSCALE * 12.f)), 240 FL2FXCONST_DBL(89.f / (PSCALE * 12.f)), 241 FL2FXCONST_DBL(90.f / (PSCALE * 12.f)), 242 FL2FXCONST_DBL(91.f / (PSCALE * 12.f)), 243 FL2FXCONST_DBL(92.f / (PSCALE * 12.f)), 244 FL2FXCONST_DBL(93.f / (PSCALE * 12.f)), 245 FL2FXCONST_DBL(94.f / (PSCALE * 12.f)), 246 FL2FXCONST_DBL(95.f / (PSCALE * 12.f)), 247 FL2FXCONST_DBL(96.f / (PSCALE * 12.f)), 248 FL2FXCONST_DBL(97.f / (PSCALE * 12.f)), 249 FL2FXCONST_DBL(98.f / (PSCALE * 12.f)), 250 FL2FXCONST_DBL(99.f / (PSCALE * 12.f)), 251 FL2FXCONST_DBL(100.f / (PSCALE * 12.f)), 252 FL2FXCONST_DBL(101.f / (PSCALE * 12.f)), 253 FL2FXCONST_DBL(102.f / (PSCALE * 12.f)), 254 FL2FXCONST_DBL(103.f / (PSCALE * 12.f)), 255 FL2FXCONST_DBL(104.f / (PSCALE * 12.f)), 256 FL2FXCONST_DBL(105.f / (PSCALE * 12.f)), 257 FL2FXCONST_DBL(106.f / (PSCALE * 12.f)), 258 FL2FXCONST_DBL(107.f / (PSCALE * 12.f)), 259 FL2FXCONST_DBL(108.f / (PSCALE * 12.f)), 260 FL2FXCONST_DBL(109.f / (PSCALE * 12.f)), 261 FL2FXCONST_DBL(110.f / (PSCALE * 12.f)), 262 FL2FXCONST_DBL(111.f / (PSCALE * 12.f)), 263 FL2FXCONST_DBL(112.f / (PSCALE * 12.f)), 264 FL2FXCONST_DBL(113.f / (PSCALE * 12.f)), 265 FL2FXCONST_DBL(114.f / (PSCALE * 12.f)), 266 FL2FXCONST_DBL(115.f / (PSCALE * 12.f)), 267 FL2FXCONST_DBL(116.f / (PSCALE * 12.f)), 268 FL2FXCONST_DBL(117.f / (PSCALE * 12.f)), 269 FL2FXCONST_DBL(118.f / (PSCALE * 12.f)), 270 FL2FXCONST_DBL(119.f / (PSCALE * 12.f)), 271 FL2FXCONST_DBL(120.f / (PSCALE * 12.f)), 272 FL2FXCONST_DBL(121.f / (PSCALE * 12.f)), 273 FL2FXCONST_DBL(122.f / (PSCALE * 12.f)), 274 FL2FXCONST_DBL(123.f / (PSCALE * 12.f)), 275 FL2FXCONST_DBL(124.f / (PSCALE * 12.f)), 276 FL2FXCONST_DBL(125.f / (PSCALE * 12.f)), 277 FL2FXCONST_DBL(126.f / (PSCALE * 12.f)), 278 FL2FXCONST_DBL(127.f / (PSCALE * 12.f))}; 279 280static const FIXP_DBL band_F[64] = { 281 FL2FXCONST_DBL((0.f * 2.f + 1) / (PSCALE << 2)), 282 FL2FXCONST_DBL((1.f * 2.f + 1) / (PSCALE << 2)), 283 FL2FXCONST_DBL((2.f * 2.f + 1) / (PSCALE << 2)), 284 FL2FXCONST_DBL((3.f * 2.f + 1) / (PSCALE << 2)), 285 FL2FXCONST_DBL((4.f * 2.f + 1) / (PSCALE << 2)), 286 FL2FXCONST_DBL((5.f * 2.f + 1) / (PSCALE << 2)), 287 FL2FXCONST_DBL((6.f * 2.f + 1) / (PSCALE << 2)), 288 FL2FXCONST_DBL((7.f * 2.f + 1) / (PSCALE << 2)), 289 FL2FXCONST_DBL((8.f * 2.f + 1) / (PSCALE << 2)), 290 FL2FXCONST_DBL((9.f * 2.f + 1) / (PSCALE << 2)), 291 FL2FXCONST_DBL((10.f * 2.f + 1) / (PSCALE << 2)), 292 FL2FXCONST_DBL((11.f * 2.f + 1) / (PSCALE << 2)), 293 FL2FXCONST_DBL((12.f * 2.f + 1) / (PSCALE << 2)), 294 FL2FXCONST_DBL((13.f * 2.f + 1) / (PSCALE << 2)), 295 FL2FXCONST_DBL((14.f * 2.f + 1) / (PSCALE << 2)), 296 FL2FXCONST_DBL((15.f * 2.f + 1) / (PSCALE << 2)), 297 FL2FXCONST_DBL((16.f * 2.f + 1) / (PSCALE << 2)), 298 FL2FXCONST_DBL((17.f * 2.f + 1) / (PSCALE << 2)), 299 FL2FXCONST_DBL((18.f * 2.f + 1) / (PSCALE << 2)), 300 FL2FXCONST_DBL((19.f * 2.f + 1) / (PSCALE << 2)), 301 FL2FXCONST_DBL((20.f * 2.f + 1) / (PSCALE << 2)), 302 FL2FXCONST_DBL((21.f * 2.f + 1) / (PSCALE << 2)), 303 FL2FXCONST_DBL((22.f * 2.f + 1) / (PSCALE << 2)), 304 FL2FXCONST_DBL((23.f * 2.f + 1) / (PSCALE << 2)), 305 FL2FXCONST_DBL((24.f * 2.f + 1) / (PSCALE << 2)), 306 FL2FXCONST_DBL((25.f * 2.f + 1) / (PSCALE << 2)), 307 FL2FXCONST_DBL((26.f * 2.f + 1) / (PSCALE << 2)), 308 FL2FXCONST_DBL((27.f * 2.f + 1) / (PSCALE << 2)), 309 FL2FXCONST_DBL((28.f * 2.f + 1) / (PSCALE << 2)), 310 FL2FXCONST_DBL((29.f * 2.f + 1) / (PSCALE << 2)), 311 FL2FXCONST_DBL((30.f * 2.f + 1) / (PSCALE << 2)), 312 FL2FXCONST_DBL((31.f * 2.f + 1) / (PSCALE << 2)), 313 FL2FXCONST_DBL((32.f * 2.f + 1) / (PSCALE << 2)), 314 FL2FXCONST_DBL((33.f * 2.f + 1) / (PSCALE << 2)), 315 FL2FXCONST_DBL((34.f * 2.f + 1) / (PSCALE << 2)), 316 FL2FXCONST_DBL((35.f * 2.f + 1) / (PSCALE << 2)), 317 FL2FXCONST_DBL((36.f * 2.f + 1) / (PSCALE << 2)), 318 FL2FXCONST_DBL((37.f * 2.f + 1) / (PSCALE << 2)), 319 FL2FXCONST_DBL((38.f * 2.f + 1) / (PSCALE << 2)), 320 FL2FXCONST_DBL((39.f * 2.f + 1) / (PSCALE << 2)), 321 FL2FXCONST_DBL((40.f * 2.f + 1) / (PSCALE << 2)), 322 FL2FXCONST_DBL((41.f * 2.f + 1) / (PSCALE << 2)), 323 FL2FXCONST_DBL((42.f * 2.f + 1) / (PSCALE << 2)), 324 FL2FXCONST_DBL((43.f * 2.f + 1) / (PSCALE << 2)), 325 FL2FXCONST_DBL((44.f * 2.f + 1) / (PSCALE << 2)), 326 FL2FXCONST_DBL((45.f * 2.f + 1) / (PSCALE << 2)), 327 FL2FXCONST_DBL((46.f * 2.f + 1) / (PSCALE << 2)), 328 FL2FXCONST_DBL((47.f * 2.f + 1) / (PSCALE << 2)), 329 FL2FXCONST_DBL((48.f * 2.f + 1) / (PSCALE << 2)), 330 FL2FXCONST_DBL((49.f * 2.f + 1) / (PSCALE << 2)), 331 FL2FXCONST_DBL((50.f * 2.f + 1) / (PSCALE << 2)), 332 FL2FXCONST_DBL((51.f * 2.f + 1) / (PSCALE << 2)), 333 FL2FXCONST_DBL((52.f * 2.f + 1) / (PSCALE << 2)), 334 FL2FXCONST_DBL((53.f * 2.f + 1) / (PSCALE << 2)), 335 FL2FXCONST_DBL((54.f * 2.f + 1) / (PSCALE << 2)), 336 FL2FXCONST_DBL((55.f * 2.f + 1) / (PSCALE << 2)), 337 FL2FXCONST_DBL((56.f * 2.f + 1) / (PSCALE << 2)), 338 FL2FXCONST_DBL((57.f * 2.f + 1) / (PSCALE << 2)), 339 FL2FXCONST_DBL((58.f * 2.f + 1) / (PSCALE << 2)), 340 FL2FXCONST_DBL((59.f * 2.f + 1) / (PSCALE << 2)), 341 FL2FXCONST_DBL((60.f * 2.f + 1) / (PSCALE << 2)), 342 FL2FXCONST_DBL((61.f * 2.f + 1) / (PSCALE << 2)), 343 FL2FXCONST_DBL((62.f * 2.f + 1) / (PSCALE << 2)), 344 FL2FXCONST_DBL((63.f * 2.f + 1) / (PSCALE << 2))}; 345 346static const FIXP_DBL tr_str[3] = {FL2FXCONST_DBL(1.f / 4.f), 347 FL2FXCONST_DBL(2.f / 4.f), 348 FL2FXCONST_DBL(3.f / 4.f)}; 349 350static const FIXP_DBL stretchfac[3] = {FL2FXCONST_DBL(1.f / 2.f), 351 FL2FXCONST_DBL(1.f / 3.f), 352 FL2FXCONST_DBL(1.f / 4.f)}; 353 354static const FIXP_DBL cos_F[64] = { 355 26353028, -79043208, 131685776, -184244944, 236697216, -289006912, 356 341142496, -393072608, 444773984, -496191392, 547325824, -598114752, 357 648559104, -698597248, 748230016, -797411904, 846083200, -894275136, 358 941928192, -989013760, 1035474624, -1081340672, 1126555136, -1171063296, 359 1214893696, -1257992192, 1300332544, -1341889408, 1382612736, -1422503808, 360 1461586944, -1499741440, 1537039104, -1573364864, 1608743808, -1643196672, 361 1676617344, -1709028992, 1740450560, -1770784896, 1800089472, -1828273536, 362 1855357440, -1881356288, 1906190080, -1929876608, 1952428928, -1973777664, 363 1993962880, -2012922240, 2030670208, -2047216000, 2062508288, -2076559488, 364 2089376128, -2100932224, 2111196800, -2120214784, 2127953792, -2134394368, 365 2139565056, -2143444864, 2146026624, -2147321856}; 366 367static const FIXP_DBL twiddle[121] = {1073741824, 368 1071442860, 369 1064555814, 370 1053110176, 371 1037154959, 372 1016758484, 373 992008094, 374 963009773, 375 929887697, 376 892783698, 377 851856663, 378 807281846, 379 759250125, 380 707967178, 381 653652607, 382 596538995, 383 536870912, 384 474903865, 385 410903207, 386 345142998, 387 277904834, 388 209476638, 389 140151432, 390 70226075, 391 0, 392 -70226075, 393 -140151432, 394 -209476638, 395 -277904834, 396 -345142998, 397 -410903207, 398 -474903865, 399 -536870912, 400 -596538995, 401 -653652607, 402 -707967178, 403 -759250125, 404 -807281846, 405 -851856663, 406 -892783698, 407 -929887697, 408 -963009773, 409 -992008094, 410 -1016758484, 411 -1037154959, 412 -1053110176, 413 -1064555814, 414 -1071442860, 415 -1073741824, 416 -1071442860, 417 -1064555814, 418 -1053110176, 419 -1037154959, 420 -1016758484, 421 -992008094, 422 -963009773, 423 -929887697, 424 -892783698, 425 -851856663, 426 -807281846, 427 -759250125, 428 -707967178, 429 -653652607, 430 -596538995, 431 -536870912, 432 -474903865, 433 -410903207, 434 -345142998, 435 -277904834, 436 -209476638, 437 -140151432, 438 -70226075, 439 0, 440 70226075, 441 140151432, 442 209476638, 443 277904834, 444 345142998, 445 410903207, 446 474903865, 447 536870912, 448 596538995, 449 653652607, 450 707967178, 451 759250125, 452 807281846, 453 851856663, 454 892783698, 455 929887697, 456 963009773, 457 992008094, 458 1016758484, 459 1037154959, 460 1053110176, 461 1064555814, 462 1071442860, 463 1073741824, 464 1071442860, 465 1064555814, 466 1053110176, 467 1037154959, 468 1016758484, 469 992008094, 470 963009773, 471 929887697, 472 892783698, 473 851856663, 474 807281846, 475 759250125, 476 707967178, 477 653652607, 478 596538995, 479 536870912, 480 474903865, 481 410903207, 482 345142998, 483 277904834, 484 209476638, 485 140151432, 486 70226075, 487 0}; 488 489#if FIXP_QTW == FIXP_SGL 490#define HTW(x) (x) 491#else 492#define HTW(x) FX_DBL2FX_QTW(FX_SGL2FX_DBL((const FIXP_SGL)x)) 493#endif 494 495static const FIXP_QTW post_twiddle_cos_8[8] = { 496 HTW(-1606), HTW(4756), HTW(-7723), HTW(10394), 497 HTW(-12665), HTW(14449), HTW(-15679), HTW(16305)}; 498 499static const FIXP_QTW post_twiddle_cos_16[16] = { 500 HTW(-804), HTW(2404), HTW(-3981), HTW(5520), HTW(-7005), HTW(8423), 501 HTW(-9760), HTW(11003), HTW(-12140), HTW(13160), HTW(-14053), HTW(14811), 502 HTW(-15426), HTW(15893), HTW(-16207), HTW(16364)}; 503 504static const FIXP_QTW post_twiddle_cos_24[24] = { 505 HTW(-536), HTW(1606), HTW(-2669), HTW(3720), HTW(-4756), HTW(5771), 506 HTW(-6762), HTW(7723), HTW(-8652), HTW(9543), HTW(-10394), HTW(11200), 507 HTW(-11958), HTW(12665), HTW(-13318), HTW(13913), HTW(-14449), HTW(14924), 508 HTW(-15334), HTW(15679), HTW(-15956), HTW(16165), HTW(-16305), HTW(16375)}; 509 510static const FIXP_QTW post_twiddle_cos_32[32] = { 511 HTW(-402), HTW(1205), HTW(-2006), HTW(2801), HTW(-3590), HTW(4370), 512 HTW(-5139), HTW(5897), HTW(-6639), HTW(7366), HTW(-8076), HTW(8765), 513 HTW(-9434), HTW(10080), HTW(-10702), HTW(11297), HTW(-11866), HTW(12406), 514 HTW(-12916), HTW(13395), HTW(-13842), HTW(14256), HTW(-14635), HTW(14978), 515 HTW(-15286), HTW(15557), HTW(-15791), HTW(15986), HTW(-16143), HTW(16261), 516 HTW(-16340), HTW(16379)}; 517 518static const FIXP_QTW post_twiddle_cos_40[40] = { 519 HTW(-322), HTW(965), HTW(-1606), HTW(2245), HTW(-2880), HTW(3511), 520 HTW(-4137), HTW(4756), HTW(-5368), HTW(5971), HTW(-6566), HTW(7150), 521 HTW(-7723), HTW(8285), HTW(-8833), HTW(9368), HTW(-9889), HTW(10394), 522 HTW(-10883), HTW(11356), HTW(-11810), HTW(12247), HTW(-12665), HTW(13063), 523 HTW(-13441), HTW(13799), HTW(-14135), HTW(14449), HTW(-14741), HTW(15011), 524 HTW(-15257), HTW(15480), HTW(-15679), HTW(15853), HTW(-16003), HTW(16129), 525 HTW(-16229), HTW(16305), HTW(-16356), HTW(16381)}; 526 527static const FIXP_QTW post_twiddle_sin_8[8] = { 528 HTW(16305), HTW(-15679), HTW(14449), HTW(-12665), 529 HTW(10394), HTW(-7723), HTW(4756), HTW(-1606)}; 530 531static const FIXP_QTW post_twiddle_sin_16[16] = { 532 HTW(16364), HTW(-16207), HTW(15893), HTW(-15426), HTW(14811), HTW(-14053), 533 HTW(13160), HTW(-12140), HTW(11003), HTW(-9760), HTW(8423), HTW(-7005), 534 HTW(5520), HTW(-3981), HTW(2404), HTW(-804)}; 535 536static const FIXP_QTW post_twiddle_sin_24[24] = { 537 HTW(16375), HTW(-16305), HTW(16165), HTW(-15956), HTW(15679), HTW(-15334), 538 HTW(14924), HTW(-14449), HTW(13913), HTW(-13318), HTW(12665), HTW(-11958), 539 HTW(11200), HTW(-10394), HTW(9543), HTW(-8652), HTW(7723), HTW(-6762), 540 HTW(5771), HTW(-4756), HTW(3720), HTW(-2669), HTW(1606), HTW(-536)}; 541 542static const FIXP_QTW post_twiddle_sin_32[32] = { 543 HTW(16379), HTW(-16340), HTW(16261), HTW(-16143), HTW(15986), HTW(-15791), 544 HTW(15557), HTW(-15286), HTW(14978), HTW(-14635), HTW(14256), HTW(-13842), 545 HTW(13395), HTW(-12916), HTW(12406), HTW(-11866), HTW(11297), HTW(-10702), 546 HTW(10080), HTW(-9434), HTW(8765), HTW(-8076), HTW(7366), HTW(-6639), 547 HTW(5897), HTW(-5139), HTW(4370), HTW(-3590), HTW(2801), HTW(-2006), 548 HTW(1205), HTW(-402)}; 549 550static const FIXP_QTW post_twiddle_sin_40[40] = { 551 HTW(16381), HTW(-16356), HTW(16305), HTW(-16229), HTW(16129), HTW(-16003), 552 HTW(15853), HTW(-15679), HTW(15480), HTW(-15257), HTW(15011), HTW(-14741), 553 HTW(14449), HTW(-14135), HTW(13799), HTW(-13441), HTW(13063), HTW(-12665), 554 HTW(12247), HTW(-11810), HTW(11356), HTW(-10883), HTW(10394), HTW(-9889), 555 HTW(9368), HTW(-8833), HTW(8285), HTW(-7723), HTW(7150), HTW(-6566), 556 HTW(5971), HTW(-5368), HTW(4756), HTW(-4137), HTW(3511), HTW(-2880), 557 HTW(2245), HTW(-1606), HTW(965), HTW(-322)}; 558 559static const FIXP_DBL preModCos[32] = { 560 -749875776, 786681536, 711263552, -821592064, -670937792, 854523392, 561 628995648, -885396032, -585538240, 914135680, 540670208, -940673088, 562 -494499680, 964944384, 447137824, -986891008, -398698816, 1006460096, 563 349299264, -1023604544, -299058240, 1038283072, 248096752, -1050460288, 564 -196537584, 1060106816, 144504928, -1067199488, -92124160, 1071721152, 565 39521456, -1073660992}; 566 567static const FIXP_DBL preModSin[32] = { 568 768510144, 730789760, -804379072, -691308864, 838310208, 650162560, 569 -870221760, -607449920, 900036928, 563273856, -927683776, -517740896, 570 953095808, 470960608, -976211712, -423045728, 996975808, 374111712, 571 -1015338112, -324276416, 1031254400, 273659904, -1044686336, -222384144, 572 1055601472, 170572640, -1063973632, -118350192, 1069782528, 65842640, 573 -1073014208, -13176464}; 574 575/* The cube root function */ 576/***************************************************************************** 577 578 functionname: invCubeRootNorm2 579 description: delivers 1/cuberoot(op) in Q1.31 format and modified exponent 580 581*****************************************************************************/ 582#define CUBE_ROOT_BITS 7 583#define CUBE_ROOT_VALUES (128 + 2) 584#define CUBE_ROOT_BITS_MASK 0x7f 585#define CUBE_ROOT_FRACT_BITS_MASK 0x007FFFFF 586/* Inverse cube root table for operands running from 0.5 to 1.0 */ 587/* (INT) (1.0/cuberoot((op))); */ 588/* Implicit exponent is 1. */ 589 590LNK_SECTION_CONSTDATA 591static const FIXP_DBL invCubeRootTab[CUBE_ROOT_VALUES] = { 592 (0x50a28be6), (0x506d1172), (0x503823c4), (0x5003c05a), (0x4fcfe4c0), 593 (0x4f9c8e92), (0x4f69bb7d), (0x4f37693b), (0x4f059594), (0x4ed43e5f), 594 (0x4ea36181), (0x4e72fcea), (0x4e430e98), (0x4e139495), (0x4de48cf5), 595 (0x4db5f5db), (0x4d87cd73), (0x4d5a11f2), (0x4d2cc19c), (0x4cffdabb), 596 (0x4cd35ba4), (0x4ca742b7), (0x4c7b8e5c), (0x4c503d05), (0x4c254d2a), 597 (0x4bfabd50), (0x4bd08c00), (0x4ba6b7cd), (0x4b7d3f53), (0x4b542134), 598 (0x4b2b5c18), (0x4b02eeb1), (0x4adad7b8), (0x4ab315ea), (0x4a8ba80d), 599 (0x4a648cec), (0x4a3dc35b), (0x4a174a30), (0x49f1204a), (0x49cb448d), 600 (0x49a5b5e2), (0x49807339), (0x495b7b86), (0x4936cdc2), (0x491268ec), 601 (0x48ee4c08), (0x48ca761f), (0x48a6e63e), (0x48839b76), (0x486094de), 602 (0x483dd190), (0x481b50ad), (0x47f91156), (0x47d712b3), (0x47b553f0), 603 (0x4793d43c), (0x477292c9), (0x47518ece), (0x4730c785), (0x47103c2d), 604 (0x46efec06), (0x46cfd655), (0x46affa61), (0x46905777), (0x4670ece4), 605 (0x4651b9f9), (0x4632be0b), (0x4613f871), (0x45f56885), (0x45d70da5), 606 (0x45b8e72f), (0x459af487), (0x457d3511), (0x455fa835), (0x45424d5d), 607 (0x452523f6), (0x45082b6e), (0x44eb6337), (0x44cecac5), (0x44b2618d), 608 (0x44962708), (0x447a1ab1), (0x445e3c02), (0x44428a7c), (0x4427059e), 609 (0x440bacec), (0x43f07fe9), (0x43d57e1c), (0x43baa70e), (0x439ffa48), 610 (0x43857757), (0x436b1dc8), (0x4350ed2b), (0x4336e511), (0x431d050c), 611 (0x43034cb2), (0x42e9bb98), (0x42d05156), (0x42b70d85), (0x429defc0), 612 (0x4284f7a2), (0x426c24cb), (0x425376d8), (0x423aed6a), (0x42228823), 613 (0x420a46a6), (0x41f22898), (0x41da2d9f), (0x41c25561), (0x41aa9f86), 614 (0x41930bba), (0x417b99a5), (0x416448f5), (0x414d1956), (0x41360a76), 615 (0x411f1c06), (0x41084db5), (0x40f19f35), (0x40db1039), (0x40c4a074), 616 (0x40ae4f9b), (0x40981d64), (0x40820985), (0x406c13b6), (0x40563bb1), 617 (0x4040812e), (0x402ae3e7), (0x40156399), (0x40000000), (0x3FEAB8D9)}; 618/* n.a. */ 619static const FIXP_DBL invCubeRootCorrection[3] = {0x40000000, 0x50A28BE6, 620 0x6597FA95}; 621 622/***************************************************************************** 623 * \brief calculate 1.0/cube_root(op), op contains mantissa and exponent 624 * \param op_m: (i) mantissa of operand, must not be zero (0x0000.0000) or 625 * negative 626 * \param op_e: (i) pointer to the exponent of the operand (must be initialized) 627 * and .. (o) pointer to the exponent of the result 628 * \return: (o) mantissa of the result 629 * \description: 630 * This routine calculates the cube root of the input operand, that is 631 * given with its mantissa in Q31 format (FIXP_DBL) and its exponent (INT). 632 * The resulting mantissa is returned in format Q31. The exponent (*op_e) 633 * is modified accordingly. It is not assured, that the result is fully 634 * left-aligned but assumed to have not more than 2 bits headroom. There is one 635 * macro to activate the use of this algorithm: FUNCTION_invCubeRootNorm2 By 636 * means of activating the macro INVCUBEROOTNORM2_LINEAR_INTERPOLATE_HQ, a 637 * slightly higher precision is reachable (by default, not active). For DEBUG 638 * purpose only: a FDK_ASSERT macro validates, if the input mantissa is greater 639 * zero. 640 * 641 */ 642static 643#ifdef __arm__ 644 FIXP_DBL __attribute__((always_inline)) 645 invCubeRootNorm2(FIXP_DBL op_m, INT* op_e) 646#else 647 FIXP_DBL 648 invCubeRootNorm2(FIXP_DBL op_m, INT* op_e) 649#endif 650{ 651 FDK_ASSERT(op_m > FIXP_DBL(0)); 652 653 /* normalize input, calculate shift value */ 654 INT exponent = (INT)fNormz(op_m) - 1; 655 op_m <<= exponent; 656 657 INT index = (INT)(op_m >> (DFRACT_BITS - 1 - (CUBE_ROOT_BITS + 1))) & 658 CUBE_ROOT_BITS_MASK; 659 FIXP_DBL fract = (FIXP_DBL)(((INT)op_m & CUBE_ROOT_FRACT_BITS_MASK) 660 << (CUBE_ROOT_BITS + 1)); 661 FIXP_DBL diff = invCubeRootTab[index + 1] - invCubeRootTab[index]; 662 op_m = fMultAddDiv2(invCubeRootTab[index], diff << 1, fract); 663#if defined(INVCUBEROOTNORM2_LINEAR_INTERPOLATE_HQ) 664 /* reg1 = t[i] + (t[i+1]-t[i])*fract ... already computed ... + 665 * (1-fract)fract*(t[i+2]-t[i+1])/2 */ 666 if (fract != (FIXP_DBL)0) { 667 /* fract = fract * (1 - fract) */ 668 fract = fMultDiv2(fract, (FIXP_DBL)((LONG)0x80000000 - (LONG)fract)) << 1; 669 diff = diff - (invCubeRootTab[index + 2] - invCubeRootTab[index + 1]); 670 op_m = fMultAddDiv2(op_m, fract, diff); 671 } 672#endif /* INVCUBEROOTNORM2_LINEAR_INTERPOLATE_HQ */ 673 674 /* calculate the output exponent = input * exp/3 = cubicroot(m)*2^(exp/3) 675 * where 2^(exp/3) = 2^k'*2 or 2^k'*2^(1/3) or 2^k'*2^(2/3) */ 676 exponent = exponent - *op_e + 3; 677 INT shift_tmp = 678 ((INT)fMultDiv2((FIXP_SGL)fAbs(exponent), (FIXP_SGL)0x5556)) >> 16; 679 if (exponent < 0) { 680 shift_tmp = -shift_tmp; 681 } 682 INT rem = exponent - 3 * shift_tmp; 683 if (rem < 0) { 684 rem += 3; 685 shift_tmp--; 686 } 687 688 *op_e = shift_tmp; 689 op_m = fMultDiv2(op_m, invCubeRootCorrection[rem]) << 2; 690 691 return (op_m); 692} 693 694 /***************************************************************************** 695 696 functionname: invFourthRootNorm2 697 description: delivers 1/FourthRoot(op) in Q1.31 format and modified 698 exponent 699 700 *****************************************************************************/ 701 702#define FOURTHROOT_BITS 7 703#define FOURTHROOT_VALUES (128 + 2) 704#define FOURTHROOT_BITS_MASK 0x7f 705#define FOURTHROOT_FRACT_BITS_MASK 0x007FFFFF 706 707LNK_SECTION_CONSTDATA 708static const FIXP_DBL invFourthRootTab[FOURTHROOT_VALUES] = { 709 (0x4c1bf829), (0x4bf61977), (0x4bd09843), (0x4bab72ef), (0x4b86a7eb), 710 (0x4b6235ac), (0x4b3e1ab6), (0x4b1a5592), (0x4af6e4d4), (0x4ad3c718), 711 (0x4ab0fb03), (0x4a8e7f42), (0x4a6c5288), (0x4a4a7393), (0x4a28e126), 712 (0x4a079a0c), (0x49e69d16), (0x49c5e91f), (0x49a57d04), (0x498557ac), 713 (0x49657802), (0x4945dcf9), (0x49268588), (0x490770ac), (0x48e89d6a), 714 (0x48ca0ac9), (0x48abb7d6), (0x488da3a6), (0x486fcd4f), (0x485233ed), 715 (0x4834d6a3), (0x4817b496), (0x47faccf0), (0x47de1ee0), (0x47c1a999), 716 (0x47a56c51), (0x47896643), (0x476d96af), (0x4751fcd6), (0x473697ff), 717 (0x471b6773), (0x47006a81), (0x46e5a079), (0x46cb08ae), (0x46b0a279), 718 (0x46966d34), (0x467c683d), (0x466292f4), (0x4648ecbc), (0x462f74fe), 719 (0x46162b20), (0x45fd0e91), (0x45e41ebe), (0x45cb5b19), (0x45b2c315), 720 (0x459a562a), (0x458213cf), (0x4569fb81), (0x45520cbc), (0x453a4701), 721 (0x4522a9d1), (0x450b34b0), (0x44f3e726), (0x44dcc0ba), (0x44c5c0f7), 722 (0x44aee768), (0x4498339e), (0x4481a527), (0x446b3b96), (0x4454f67e), 723 (0x443ed576), (0x4428d815), (0x4412fdf3), (0x43fd46ad), (0x43e7b1de), 724 (0x43d23f23), (0x43bcee1e), (0x43a7be6f), (0x4392afb8), (0x437dc19d), 725 (0x4368f3c5), (0x435445d6), (0x433fb779), (0x432b4856), (0x4316f81a), 726 (0x4302c66f), (0x42eeb305), (0x42dabd8a), (0x42c6e5ad), (0x42b32b21), 727 (0x429f8d96), (0x428c0cc2), (0x4278a859), (0x42656010), (0x4252339e), 728 (0x423f22bc), (0x422c2d23), (0x4219528b), (0x420692b2), (0x41f3ed51), 729 (0x41e16228), (0x41cef0f2), (0x41bc9971), (0x41aa5b62), (0x41983687), 730 (0x41862aa2), (0x41743775), (0x41625cc3), (0x41509a50), (0x413eefe2), 731 (0x412d5d3e), (0x411be22b), (0x410a7e70), (0x40f931d5), (0x40e7fc23), 732 (0x40d6dd24), (0x40c5d4a2), (0x40b4e268), (0x40a40642), (0x40933ffc), 733 (0x40828f64), (0x4071f447), (0x40616e73), (0x4050fdb9), (0x4040a1e6), 734 (0x40305acc), (0x4020283c), (0x40100a08), (0x40000000), (0x3ff009f9), 735}; 736 737static const FIXP_DBL invFourthRootCorrection[4] = {0x40000000, 0x4C1BF829, 738 0x5A82799A, 0x6BA27E65}; 739 740/* The fourth root function */ 741/***************************************************************************** 742 * \brief calculate 1.0/fourth_root(op), op contains mantissa and exponent 743 * \param op_m: (i) mantissa of operand, must not be zero (0x0000.0000) or 744 * negative 745 * \param op_e: (i) pointer to the exponent of the operand (must be initialized) 746 * and .. (o) pointer to the exponent of the result 747 * \return: (o) mantissa of the result 748 * \description: 749 * This routine calculates the cube root of the input operand, that is 750 * given with its mantissa in Q31 format (FIXP_DBL) and its exponent (INT). 751 * The resulting mantissa is returned in format Q31. The exponent (*op_e) 752 * is modified accordingly. It is not assured, that the result is fully 753 * left-aligned but assumed to have not more than 2 bits headroom. There is one 754 * macro to activate the use of this algorithm: FUNCTION_invFourthRootNorm2 By 755 * means of activating the macro INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ, a 756 * slightly higher precision is reachable (by default, not active). For DEBUG 757 * purpose only: a FDK_ASSERT macro validates, if the input mantissa is greater 758 * zero. 759 * 760 */ 761 762/* #define INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ */ 763 764static 765#ifdef __arm__ 766 FIXP_DBL __attribute__((always_inline)) 767 invFourthRootNorm2(FIXP_DBL op_m, INT* op_e) 768#else 769 FIXP_DBL 770 invFourthRootNorm2(FIXP_DBL op_m, INT* op_e) 771#endif 772{ 773 FDK_ASSERT(op_m > FL2FXCONST_DBL(0.0)); 774 775 /* normalize input, calculate shift value */ 776 INT exponent = (INT)fNormz(op_m) - 1; 777 op_m <<= exponent; 778 779 INT index = (INT)(op_m >> (DFRACT_BITS - 1 - (FOURTHROOT_BITS + 1))) & 780 FOURTHROOT_BITS_MASK; 781 FIXP_DBL fract = (FIXP_DBL)(((INT)op_m & FOURTHROOT_FRACT_BITS_MASK) 782 << (FOURTHROOT_BITS + 1)); 783 FIXP_DBL diff = invFourthRootTab[index + 1] - invFourthRootTab[index]; 784 op_m = invFourthRootTab[index] + (fMultDiv2(diff, fract) << 1); 785 786#if defined(INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ) 787 /* reg1 = t[i] + (t[i+1]-t[i])*fract ... already computed ... + 788 * (1-fract)fract*(t[i+2]-t[i+1])/2 */ 789 if (fract != (FIXP_DBL)0) { 790 /* fract = fract * (1 - fract) */ 791 fract = fMultDiv2(fract, (FIXP_DBL)((LONG)0x80000000 - (LONG)fract)) << 1; 792 diff = diff - (invFourthRootTab[index + 2] - invFourthRootTab[index + 1]); 793 op_m = fMultAddDiv2(op_m, fract, diff); 794 } 795#endif /* INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ */ 796 797 exponent = exponent - *op_e + 4; 798 INT rem = exponent & 0x00000003; 799 INT shift_tmp = (exponent >> 2); 800 801 *op_e = shift_tmp; 802 op_m = fMultDiv2(op_m, invFourthRootCorrection[rem]) << 2; 803 804 return (op_m); 805} 806 807/***************************************************************************** 808 809 functionname: inv3EigthRootNorm2 810 description: delivers 1/cubert(op) normalized to .5...1 and the shift value 811of the OUTPUT 812 813*****************************************************************************/ 814#define THREEIGTHROOT_BITS 7 815#define THREEIGTHROOT_VALUES (128 + 2) 816#define THREEIGTHROOT_BITS_MASK 0x7f 817#define THREEIGTHROOT_FRACT_BITS_MASK 0x007FFFFF 818 819LNK_SECTION_CONSTDATA 820static const FIXP_DBL inv3EigthRootTab[THREEIGTHROOT_VALUES] = { 821 (0x45cae0f2), (0x45b981bf), (0x45a8492a), (0x45973691), (0x45864959), 822 (0x457580e6), (0x4564dca4), (0x45545c00), (0x4543fe6b), (0x4533c35a), 823 (0x4523aa44), (0x4513b2a4), (0x4503dbf7), (0x44f425be), (0x44e48f7b), 824 (0x44d518b6), (0x44c5c0f7), (0x44b687c8), (0x44a76cb8), (0x44986f58), 825 (0x44898f38), (0x447acbef), (0x446c2514), (0x445d9a3f), (0x444f2b0d), 826 (0x4440d71a), (0x44329e07), (0x44247f73), (0x44167b04), (0x4408905e), 827 (0x43fabf28), (0x43ed070b), (0x43df67b0), (0x43d1e0c5), (0x43c471f7), 828 (0x43b71af6), (0x43a9db71), (0x439cb31c), (0x438fa1ab), (0x4382a6d2), 829 (0x4375c248), (0x4368f3c5), (0x435c3b03), (0x434f97bc), (0x434309ac), 830 (0x43369091), (0x432a2c28), (0x431ddc30), (0x4311a06c), (0x4305789c), 831 (0x42f96483), (0x42ed63e5), (0x42e17688), (0x42d59c30), (0x42c9d4a6), 832 (0x42be1fb1), (0x42b27d1a), (0x42a6ecac), (0x429b6e2f), (0x42900172), 833 (0x4284a63f), (0x42795c64), (0x426e23b0), (0x4262fbf2), (0x4257e4f9), 834 (0x424cde96), (0x4241e89a), (0x423702d8), (0x422c2d23), (0x4221674d), 835 (0x4216b12c), (0x420c0a94), (0x4201735b), (0x41f6eb57), (0x41ec725f), 836 (0x41e2084b), (0x41d7acf3), (0x41cd6030), (0x41c321db), (0x41b8f1ce), 837 (0x41aecfe5), (0x41a4bbf8), (0x419ab5e6), (0x4190bd89), (0x4186d2bf), 838 (0x417cf565), (0x41732558), (0x41696277), (0x415faca1), (0x415603b4), 839 (0x414c6792), (0x4142d818), (0x4139552a), (0x412fdea6), (0x41267470), 840 (0x411d1668), (0x4113c472), (0x410a7e70), (0x41014445), (0x40f815d4), 841 (0x40eef302), (0x40e5dbb4), (0x40dccfcd), (0x40d3cf33), (0x40cad9cb), 842 (0x40c1ef7b), (0x40b9102a), (0x40b03bbd), (0x40a7721c), (0x409eb32e), 843 (0x4095feda), (0x408d5508), (0x4084b5a0), (0x407c208b), (0x407395b2), 844 (0x406b14fd), (0x40629e56), (0x405a31a6), (0x4051ced8), (0x404975d5), 845 (0x40412689), (0x4038e0dd), (0x4030a4bd), (0x40287215), (0x402048cf), 846 (0x401828d7), (0x4010121a), (0x40080483), (0x40000000), (0x3ff8047d), 847}; 848 849/* The last value is rounded in order to avoid any overflow due to the values 850 * range of the root table */ 851static const FIXP_DBL inv3EigthRootCorrection[8] = { 852 0x40000000, 0x45CAE0F2, 0x4C1BF829, 0x52FF6B55, 853 0x5A82799A, 0x62B39509, 0x6BA27E65, 0x75606373}; 854 855/* The 3/8 root function */ 856/***************************************************************************** 857 * \brief calculate 1.0/3Eigth_root(op) = 1.0/(x)^(3/8), op contains mantissa 858 * and exponent 859 * \param op_m: (i) mantissa of operand, must not be zero (0x0000.0000) or 860 * negative 861 * \param op_e: (i) pointer to the exponent of the operand (must be initialized) 862 * and .. (o) pointer to the exponent of the result 863 * \return: (o) mantissa of the result 864 * \description: 865 * This routine calculates the cube root of the input operand, that is 866 * given with its mantissa in Q31 format (FIXP_DBL) and its exponent (INT). 867 * The resulting mantissa is returned in format Q31. The exponent (*op_e) 868 * is modified accordingly. It is not assured, that the result is fully 869 * left-aligned but assumed to have not more than 2 bits headroom. There is one 870 * macro to activate the use of this algorithm: FUNCTION_inv3EigthRootNorm2 By 871 * means of activating the macro INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ, a 872 * slightly higher precision is reachable (by default, not active). For DEBUG 873 * purpose only: a FDK_ASSERT macro validates, if the input mantissa is greater 874 * zero. 875 * 876 */ 877 878/* #define INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ */ 879 880static 881#ifdef __arm__ 882 FIXP_DBL __attribute__((always_inline)) 883 inv3EigthRootNorm2(FIXP_DBL op_m, INT* op_e) 884#else 885 FIXP_DBL 886 inv3EigthRootNorm2(FIXP_DBL op_m, INT* op_e) 887#endif 888{ 889 FDK_ASSERT(op_m > FL2FXCONST_DBL(0.0)); 890 891 /* normalize input, calculate shift op_mue */ 892 INT exponent = (INT)fNormz(op_m) - 1; 893 op_m <<= exponent; 894 895 INT index = (INT)(op_m >> (DFRACT_BITS - 1 - (THREEIGTHROOT_BITS + 1))) & 896 THREEIGTHROOT_BITS_MASK; 897 FIXP_DBL fract = (FIXP_DBL)(((INT)op_m & THREEIGTHROOT_FRACT_BITS_MASK) 898 << (THREEIGTHROOT_BITS + 1)); 899 FIXP_DBL diff = inv3EigthRootTab[index + 1] - inv3EigthRootTab[index]; 900 op_m = inv3EigthRootTab[index] + (fMultDiv2(diff, fract) << 1); 901 902#if defined(INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ) 903 /* op_m = t[i] + (t[i+1]-t[i])*fract ... already computed ... + 904 * (1-fract)fract*(t[i+2]-t[i+1])/2 */ 905 if (fract != (FIXP_DBL)0) { 906 /* fract = fract * (1 - fract) */ 907 fract = fMultDiv2(fract, (FIXP_DBL)((LONG)0x80000000 - (LONG)fract)) << 1; 908 diff = diff - (inv3EigthRootTab[index + 2] - inv3EigthRootTab[index + 1]); 909 op_m = fMultAddDiv2(op_m, fract, diff); 910 } 911#endif /* INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ */ 912 913 exponent = exponent - *op_e + 8; 914 INT rem = exponent & 0x00000007; 915 INT shift_tmp = (exponent >> 3); 916 917 *op_e = shift_tmp * 3; 918 op_m = fMultDiv2(op_m, inv3EigthRootCorrection[rem]) << 2; 919 920 return (fMult(op_m, fMult(op_m, op_m))); 921} 922 923SBR_ERROR 924QmfTransposerCreate(HANDLE_HBE_TRANSPOSER* hQmfTransposer, const int frameSize, 925 int bDisableCrossProducts, int bSbr41) { 926 HANDLE_HBE_TRANSPOSER hQmfTran = NULL; 927 928 int i; 929 930 if (hQmfTransposer != NULL) { 931 /* Memory allocation */ 932 /*--------------------------------------------------------------------------------------------*/ 933 hQmfTran = 934 (HANDLE_HBE_TRANSPOSER)FDKcalloc(1, sizeof(struct hbeTransposer)); 935 if (hQmfTran == NULL) { 936 return SBRDEC_MEM_ALLOC_FAILED; 937 } 938 939 for (i = 0; i < MAX_STRETCH_HBE - 1; i++) { 940 hQmfTran->bXProducts[i] = (bDisableCrossProducts ? 0 : xProducts[i]); 941 } 942 943 hQmfTran->timeDomainWinLen = frameSize; 944 if (frameSize == 768) { 945 hQmfTran->noCols = 946 (8 * frameSize / 3) / QMF_SYNTH_CHANNELS; /* 32 for 24:64 */ 947 } else { 948 hQmfTran->noCols = 949 (bSbr41 + 1) * 2 * frameSize / 950 QMF_SYNTH_CHANNELS; /* 32 for 32:64 and 64 for 16:64 -> identical to 951 sbrdec->no_cols */ 952 } 953 954 hQmfTran->noChannels = frameSize / hQmfTran->noCols; 955 956 hQmfTran->qmfInBufSize = QMF_WIN_LEN; 957 hQmfTran->qmfOutBufSize = 2 * (hQmfTran->noCols / 2 + QMF_WIN_LEN - 1); 958 959 hQmfTran->inBuf_F = 960 (INT_PCM*)FDKcalloc(QMF_SYNTH_CHANNELS + 20 + 1, sizeof(INT_PCM)); 961 /* buffered time signal needs to be delayed by synthesis_size; max 962 * synthesis_size = 20; */ 963 if (hQmfTran->inBuf_F == NULL) { 964 QmfTransposerClose(hQmfTran); 965 return SBRDEC_MEM_ALLOC_FAILED; 966 } 967 968 hQmfTran->qmfInBufReal_F = 969 (FIXP_DBL**)FDKcalloc(hQmfTran->qmfInBufSize, sizeof(FIXP_DBL*)); 970 hQmfTran->qmfInBufImag_F = 971 (FIXP_DBL**)FDKcalloc(hQmfTran->qmfInBufSize, sizeof(FIXP_DBL*)); 972 973 if (hQmfTran->qmfInBufReal_F == NULL) { 974 QmfTransposerClose(hQmfTran); 975 return SBRDEC_MEM_ALLOC_FAILED; 976 } 977 if (hQmfTran->qmfInBufImag_F == NULL) { 978 QmfTransposerClose(hQmfTran); 979 return SBRDEC_MEM_ALLOC_FAILED; 980 } 981 982 for (i = 0; i < hQmfTran->qmfInBufSize; i++) { 983 hQmfTran->qmfInBufReal_F[i] = (FIXP_DBL*)FDKaalloc( 984 QMF_SYNTH_CHANNELS * sizeof(FIXP_DBL), ALIGNMENT_DEFAULT); 985 hQmfTran->qmfInBufImag_F[i] = (FIXP_DBL*)FDKaalloc( 986 QMF_SYNTH_CHANNELS * sizeof(FIXP_DBL), ALIGNMENT_DEFAULT); 987 if (hQmfTran->qmfInBufReal_F[i] == NULL) { 988 QmfTransposerClose(hQmfTran); 989 return SBRDEC_MEM_ALLOC_FAILED; 990 } 991 if (hQmfTran->qmfInBufImag_F[i] == NULL) { 992 QmfTransposerClose(hQmfTran); 993 return SBRDEC_MEM_ALLOC_FAILED; 994 } 995 } 996 997 hQmfTran->qmfHBEBufReal_F = 998 (FIXP_DBL**)FDKcalloc(HBE_MAX_OUT_SLOTS, sizeof(FIXP_DBL*)); 999 hQmfTran->qmfHBEBufImag_F = 1000 (FIXP_DBL**)FDKcalloc(HBE_MAX_OUT_SLOTS, sizeof(FIXP_DBL*)); 1001 1002 if (hQmfTran->qmfHBEBufReal_F == NULL) { 1003 QmfTransposerClose(hQmfTran); 1004 return SBRDEC_MEM_ALLOC_FAILED; 1005 } 1006 if (hQmfTran->qmfHBEBufImag_F == NULL) { 1007 QmfTransposerClose(hQmfTran); 1008 return SBRDEC_MEM_ALLOC_FAILED; 1009 } 1010 1011 for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) { 1012 hQmfTran->qmfHBEBufReal_F[i] = 1013 (FIXP_DBL*)FDKcalloc(QMF_SYNTH_CHANNELS, sizeof(FIXP_DBL)); 1014 hQmfTran->qmfHBEBufImag_F[i] = 1015 (FIXP_DBL*)FDKcalloc(QMF_SYNTH_CHANNELS, sizeof(FIXP_DBL)); 1016 if (hQmfTran->qmfHBEBufReal_F[i] == NULL) { 1017 QmfTransposerClose(hQmfTran); 1018 return SBRDEC_MEM_ALLOC_FAILED; 1019 } 1020 if (hQmfTran->qmfHBEBufImag_F[i] == NULL) { 1021 QmfTransposerClose(hQmfTran); 1022 return SBRDEC_MEM_ALLOC_FAILED; 1023 } 1024 } 1025 1026 hQmfTran->qmfBufferCodecTempSlot_F = 1027 (FIXP_DBL*)FDKcalloc(QMF_SYNTH_CHANNELS / 2, sizeof(FIXP_DBL)); 1028 if (hQmfTran->qmfBufferCodecTempSlot_F == NULL) { 1029 QmfTransposerClose(hQmfTran); 1030 return SBRDEC_MEM_ALLOC_FAILED; 1031 } 1032 1033 hQmfTran->bSbr41 = bSbr41; 1034 1035 hQmfTran->highband_exp[0] = 0; 1036 hQmfTran->highband_exp[1] = 0; 1037 hQmfTran->target_exp[0] = 0; 1038 hQmfTran->target_exp[1] = 0; 1039 1040 *hQmfTransposer = hQmfTran; 1041 } 1042 1043 return SBRDEC_OK; 1044} 1045 1046SBR_ERROR QmfTransposerReInit(HANDLE_HBE_TRANSPOSER hQmfTransposer, 1047 UCHAR* FreqBandTable[2], UCHAR NSfb[2]) 1048/* removed bSbr41 from parameterlist: 1049 don't know where to get this value from 1050 at call-side */ 1051{ 1052 int L, sfb, patch, stopPatch, qmfErr; 1053 1054 if (hQmfTransposer != NULL) { 1055 const FIXP_QTW* tmp_t_cos; 1056 const FIXP_QTW* tmp_t_sin; 1057 1058 hQmfTransposer->startBand = FreqBandTable[0][0]; 1059 hQmfTransposer->stopBand = FreqBandTable[0][NSfb[0]]; 1060 1061 hQmfTransposer->synthSize = 1062 4 * ((hQmfTransposer->startBand + 4) / 8 + 1); /* 8, 12, 16, 20 */ 1063 hQmfTransposer->kstart = startSubband2kL[hQmfTransposer->startBand]; 1064 1065 /* don't know where to take this information from */ 1066 /* hQmfTransposer->bSbr41 = bSbr41; */ 1067 1068 if (hQmfTransposer->bSbr41) { 1069 if (hQmfTransposer->kstart + hQmfTransposer->synthSize > 16) 1070 hQmfTransposer->kstart = 16 - hQmfTransposer->synthSize; 1071 } else if (hQmfTransposer->timeDomainWinLen == 768) { 1072 if (hQmfTransposer->kstart + hQmfTransposer->synthSize > 24) 1073 hQmfTransposer->kstart = 24 - hQmfTransposer->synthSize; 1074 } 1075 1076 hQmfTransposer->synthesisQmfPreModCos_F = 1077 &preModCos[hQmfTransposer->kstart]; 1078 hQmfTransposer->synthesisQmfPreModSin_F = 1079 &preModSin[hQmfTransposer->kstart]; 1080 1081 L = 2 * hQmfTransposer->synthSize; /* 8, 16, 24, 32, 40 */ 1082 /* Change analysis post twiddles */ 1083 1084 switch (L) { 1085 case 8: 1086 tmp_t_cos = post_twiddle_cos_8; 1087 tmp_t_sin = post_twiddle_sin_8; 1088 break; 1089 case 16: 1090 tmp_t_cos = post_twiddle_cos_16; 1091 tmp_t_sin = post_twiddle_sin_16; 1092 break; 1093 case 24: 1094 tmp_t_cos = post_twiddle_cos_24; 1095 tmp_t_sin = post_twiddle_sin_24; 1096 break; 1097 case 32: 1098 tmp_t_cos = post_twiddle_cos_32; 1099 tmp_t_sin = post_twiddle_sin_32; 1100 break; 1101 case 40: 1102 tmp_t_cos = post_twiddle_cos_40; 1103 tmp_t_sin = post_twiddle_sin_40; 1104 break; 1105 default: 1106 return SBRDEC_UNSUPPORTED_CONFIG; 1107 } 1108 1109 qmfErr = qmfInitSynthesisFilterBank( 1110 &hQmfTransposer->HBESynthesisQMF, hQmfTransposer->synQmfStates, 1111 hQmfTransposer->noCols, 0, hQmfTransposer->synthSize, 1112 hQmfTransposer->synthSize, 1); 1113 if (qmfErr != 0) { 1114 return SBRDEC_UNSUPPORTED_CONFIG; 1115 } 1116 1117 qmfErr = qmfInitAnalysisFilterBank( 1118 &hQmfTransposer->HBEAnalysiscQMF, hQmfTransposer->anaQmfStates, 1119 hQmfTransposer->noCols / 2, 0, 2 * hQmfTransposer->synthSize, 1120 2 * hQmfTransposer->synthSize, 0); 1121 1122 if (qmfErr != 0) { 1123 return SBRDEC_UNSUPPORTED_CONFIG; 1124 } 1125 1126 hQmfTransposer->HBEAnalysiscQMF.t_cos = tmp_t_cos; 1127 hQmfTransposer->HBEAnalysiscQMF.t_sin = tmp_t_sin; 1128 1129 FDKmemset(hQmfTransposer->xOverQmf, 0, 1130 MAX_NUM_PATCHES * sizeof(int)); /* global */ 1131 sfb = 0; 1132 if (hQmfTransposer->bSbr41) { 1133 stopPatch = MAX_NUM_PATCHES; 1134 hQmfTransposer->maxStretch = MAX_STRETCH_HBE; 1135 } else { 1136 stopPatch = MAX_STRETCH_HBE; 1137 } 1138 1139 for (patch = 1; patch <= stopPatch; patch++) { 1140 while (sfb <= NSfb[0] && 1141 FreqBandTable[0][sfb] <= patch * hQmfTransposer->startBand) 1142 sfb++; 1143 if (sfb <= NSfb[0]) { 1144 /* If the distance is larger than three QMF bands - try aligning to high 1145 * resolution frequency bands instead. */ 1146 if ((patch * hQmfTransposer->startBand - FreqBandTable[0][sfb - 1]) <= 1147 3) { 1148 hQmfTransposer->xOverQmf[patch - 1] = FreqBandTable[0][sfb - 1]; 1149 } else { 1150 int sfb_tmp = 0; 1151 while (sfb_tmp <= NSfb[1] && 1152 FreqBandTable[1][sfb_tmp] <= patch * hQmfTransposer->startBand) 1153 sfb_tmp++; 1154 hQmfTransposer->xOverQmf[patch - 1] = FreqBandTable[1][sfb_tmp - 1]; 1155 } 1156 } else { 1157 hQmfTransposer->xOverQmf[patch - 1] = hQmfTransposer->stopBand; 1158 hQmfTransposer->maxStretch = fMin(patch, MAX_STRETCH_HBE); 1159 break; 1160 } 1161 } 1162 1163 hQmfTransposer->highband_exp[0] = 0; 1164 hQmfTransposer->highband_exp[1] = 0; 1165 hQmfTransposer->target_exp[0] = 0; 1166 hQmfTransposer->target_exp[1] = 0; 1167 } 1168 1169 return SBRDEC_OK; 1170} 1171 1172void QmfTransposerClose(HANDLE_HBE_TRANSPOSER hQmfTransposer) { 1173 int i; 1174 1175 if (hQmfTransposer != NULL) { 1176 if (hQmfTransposer->inBuf_F) FDKfree(hQmfTransposer->inBuf_F); 1177 1178 if (hQmfTransposer->qmfInBufReal_F) { 1179 for (i = 0; i < hQmfTransposer->qmfInBufSize; i++) { 1180 FDKafree(hQmfTransposer->qmfInBufReal_F[i]); 1181 } 1182 FDKfree(hQmfTransposer->qmfInBufReal_F); 1183 } 1184 1185 if (hQmfTransposer->qmfInBufImag_F) { 1186 for (i = 0; i < hQmfTransposer->qmfInBufSize; i++) { 1187 FDKafree(hQmfTransposer->qmfInBufImag_F[i]); 1188 } 1189 FDKfree(hQmfTransposer->qmfInBufImag_F); 1190 } 1191 1192 if (hQmfTransposer->qmfHBEBufReal_F) { 1193 for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) { 1194 FDKfree(hQmfTransposer->qmfHBEBufReal_F[i]); 1195 } 1196 FDKfree(hQmfTransposer->qmfHBEBufReal_F); 1197 } 1198 1199 if (hQmfTransposer->qmfHBEBufImag_F) { 1200 for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) { 1201 FDKfree(hQmfTransposer->qmfHBEBufImag_F[i]); 1202 } 1203 FDKfree(hQmfTransposer->qmfHBEBufImag_F); 1204 } 1205 1206 FDKfree(hQmfTransposer->qmfBufferCodecTempSlot_F); 1207 1208 FDKfree(hQmfTransposer); 1209 } 1210} 1211 1212inline void scaleUp(FIXP_DBL* real_m, FIXP_DBL* imag_m, INT* _e) { 1213 INT reserve; 1214 /* shift gc_r and gc_i up if possible */ 1215 reserve = CntLeadingZeros((INT(*real_m) ^ INT((*real_m >> 31))) | 1216 (INT(*imag_m) ^ INT((*imag_m >> 31)))) - 1217 1; 1218 reserve = fMax(reserve - 1, 1219 0); /* Leave one bit headroom such that (real_m^2 + imag_m^2) 1220 does not overflow later if both are 0x80000000. */ 1221 reserve = fMin(reserve, *_e); 1222 FDK_ASSERT(reserve >= 0); 1223 *real_m <<= reserve; 1224 *imag_m <<= reserve; 1225 *_e -= reserve; 1226} 1227 1228static void calculateCenterFIXP(FIXP_DBL gammaVecReal, FIXP_DBL gammaVecImag, 1229 FIXP_DBL* centerReal, FIXP_DBL* centerImag, 1230 INT* exponent, int stretch, int mult) { 1231 scaleUp(&gammaVecReal, &gammaVecImag, exponent); 1232 FIXP_DBL energy = fPow2Div2(gammaVecReal) + fPow2Div2(gammaVecImag); 1233 1234 if (energy != FL2FXCONST_DBL(0.f)) { 1235 FIXP_DBL gc_r_m, gc_i_m, factor_m = (FIXP_DBL)0; 1236 INT factor_e, gc_e; 1237 factor_e = 2 * (*exponent) + 1; 1238 1239 switch (stretch) { 1240 case 2: 1241 factor_m = invFourthRootNorm2(energy, &factor_e); 1242 break; 1243 case 3: 1244 factor_m = invCubeRootNorm2(energy, &factor_e); 1245 break; 1246 case 4: 1247 factor_m = inv3EigthRootNorm2(energy, &factor_e); 1248 break; 1249 } 1250 1251 gc_r_m = fMultDiv2(gammaVecReal, 1252 factor_m); /* exponent = HBE_SCALE + factor_e + 1 */ 1253 gc_i_m = fMultDiv2(gammaVecImag, 1254 factor_m); /* exponent = HBE_SCALE + factor_e + 1*/ 1255 gc_e = *exponent + factor_e + 1; 1256 1257 scaleUp(&gc_r_m, &gc_i_m, &gc_e); 1258 1259 switch (mult) { 1260 case 0: 1261 *centerReal = gc_r_m; 1262 *centerImag = gc_i_m; 1263 break; 1264 case 1: 1265 *centerReal = fPow2Div2(gc_r_m) - fPow2Div2(gc_i_m); 1266 *centerImag = fMult(gc_r_m, gc_i_m); 1267 gc_e = 2 * gc_e + 1; 1268 break; 1269 case 2: 1270 FIXP_DBL tmp_r = gc_r_m; 1271 FIXP_DBL tmp_i = gc_i_m; 1272 gc_r_m = fPow2Div2(gc_r_m) - fPow2Div2(gc_i_m); 1273 gc_i_m = fMult(tmp_r, gc_i_m); 1274 gc_e = 3 * gc_e + 1 + 1; 1275 cplxMultDiv2(¢erReal[0], ¢erImag[0], gc_r_m, gc_i_m, tmp_r, 1276 tmp_i); 1277 break; 1278 } 1279 1280 scaleUp(centerReal, centerImag, &gc_e); 1281 1282 FDK_ASSERT(gc_e >= 0); 1283 *exponent = gc_e; 1284 } else { 1285 *centerReal = energy; /* energy = 0 */ 1286 *centerImag = energy; /* energy = 0 */ 1287 *exponent = (INT)energy; 1288 } 1289} 1290 1291static int getHBEScaleFactorFrame(const int bSbr41, const int maxStretch, 1292 const int pitchInBins) { 1293 if (pitchInBins >= pmin * (1 + bSbr41)) { 1294 /* crossproducts enabled */ 1295 return 26; 1296 } else { 1297 return (maxStretch == 2) ? 24 : 25; 1298 } 1299} 1300 1301static void addHighBandPart(FIXP_DBL g_r_m, FIXP_DBL g_i_m, INT g_e, 1302 FIXP_DBL mult, FIXP_DBL gammaCenterReal_m, 1303 FIXP_DBL gammaCenterImag_m, INT gammaCenter_e, 1304 INT stretch, INT scale_factor_hbe, 1305 FIXP_DBL* qmfHBEBufReal_F, 1306 FIXP_DBL* qmfHBEBufImag_F) { 1307 if ((g_r_m | g_i_m) != FL2FXCONST_DBL(0.f)) { 1308 FIXP_DBL factor_m = (FIXP_DBL)0; 1309 INT factor_e; 1310 INT add = (stretch == 4) ? 1 : 0; 1311 INT shift = (stretch == 4) ? 1 : 2; 1312 1313 scaleUp(&g_r_m, &g_i_m, &g_e); 1314 FIXP_DBL energy = fPow2AddDiv2(fPow2Div2(g_r_m), g_i_m); 1315 factor_e = 2 * g_e + 1; 1316 1317 switch (stretch) { 1318 case 2: 1319 factor_m = invFourthRootNorm2(energy, &factor_e); 1320 break; 1321 case 3: 1322 factor_m = invCubeRootNorm2(energy, &factor_e); 1323 break; 1324 case 4: 1325 factor_m = inv3EigthRootNorm2(energy, &factor_e); 1326 break; 1327 } 1328 1329 factor_m = fMult(factor_m, mult); 1330 1331 FIXP_DBL tmp_r, tmp_i; 1332 cplxMultDiv2(&tmp_r, &tmp_i, g_r_m, g_i_m, gammaCenterReal_m, 1333 gammaCenterImag_m); 1334 1335 g_r_m = fMultDiv2(tmp_r, factor_m) << shift; 1336 g_i_m = fMultDiv2(tmp_i, factor_m) << shift; 1337 g_e = scale_factor_hbe - (g_e + factor_e + gammaCenter_e + add); 1338 fMax((INT)0, g_e); 1339 *qmfHBEBufReal_F += g_r_m >> g_e; 1340 *qmfHBEBufImag_F += g_i_m >> g_e; 1341 } 1342} 1343 1344void QmfTransposerApply(HANDLE_HBE_TRANSPOSER hQmfTransposer, 1345 FIXP_DBL** qmfBufferCodecReal, 1346 FIXP_DBL** qmfBufferCodecImag, int nColsIn, 1347 FIXP_DBL** ppQmfBufferOutReal_F, 1348 FIXP_DBL** ppQmfBufferOutImag_F, 1349 FIXP_DBL lpcFilterStatesReal[2 + (3 * (4))][(64)], 1350 FIXP_DBL lpcFilterStatesImag[2 + (3 * (4))][(64)], 1351 int pitchInBins, int scale_lb, int scale_hbe, 1352 int* scale_hb, int timeStep, int firstSlotOffsset, 1353 int ov_len, 1354 KEEP_STATES_SYNCED_MODE keepStatesSyncedMode) { 1355 int i, j, stretch, band, sourceband, r, s; 1356 int qmfVocoderColsIn = hQmfTransposer->noCols / 2; 1357 int bSbr41 = hQmfTransposer->bSbr41; 1358 1359 const int winLength[3] = {10, 8, 6}; 1360 const int slotOffset = 6; /* hQmfTransposer->winLen-6; */ 1361 1362 int qmfOffset = 2 * hQmfTransposer->kstart; 1363 int scale_border = (nColsIn == 64) ? 32 : nColsIn; 1364 1365 INT slot_stretch4[9] = {0, 0, 0, 0, 2, 4, 6, 8, 10}; 1366 INT slot_stretch2[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 1367 INT slot_stretch3[10] = {0, 0, 0, 1, 3, 4, 6, 7, 9, 10}; 1368 INT filt_stretch3[10] = {0, 0, 0, 1, 0, 1, 0, 1, 0, 1}; 1369 INT filt_dummy[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 1370 INT* pSlotStretch; 1371 INT* pFilt; 1372 1373 int offset = 0; /* where to take QmfTransposer data */ 1374 1375 int signPreMod = 1376 (hQmfTransposer->synthesisQmfPreModCos_F[0] < FL2FXCONST_DBL(0.f)) ? 1 1377 : -1; 1378 1379 int scale_factor_hbe = 1380 getHBEScaleFactorFrame(bSbr41, hQmfTransposer->maxStretch, pitchInBins); 1381 1382 if (keepStatesSyncedMode != KEEP_STATES_SYNCED_OFF) { 1383 offset = hQmfTransposer->noCols - ov_len - LPC_ORDER; 1384 } 1385 1386 hQmfTransposer->highband_exp[0] = hQmfTransposer->highband_exp[1]; 1387 hQmfTransposer->target_exp[0] = hQmfTransposer->target_exp[1]; 1388 1389 hQmfTransposer->highband_exp[1] = scale_factor_hbe; 1390 hQmfTransposer->target_exp[1] = 1391 fixMax(hQmfTransposer->highband_exp[1], hQmfTransposer->highband_exp[0]); 1392 1393 scale_factor_hbe = hQmfTransposer->target_exp[1]; 1394 1395 int shift_ov = hQmfTransposer->target_exp[0] - hQmfTransposer->target_exp[1]; 1396 1397 if (shift_ov != 0) { 1398 for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) { 1399 for (band = 0; band < QMF_SYNTH_CHANNELS; band++) { 1400 if (shift_ov >= 0) { 1401 hQmfTransposer->qmfHBEBufReal_F[i][band] <<= shift_ov; 1402 hQmfTransposer->qmfHBEBufImag_F[i][band] <<= shift_ov; 1403 } else { 1404 hQmfTransposer->qmfHBEBufReal_F[i][band] >>= (-shift_ov); 1405 hQmfTransposer->qmfHBEBufImag_F[i][band] >>= (-shift_ov); 1406 } 1407 } 1408 } 1409 } 1410 1411 if ((keepStatesSyncedMode == KEEP_STATES_SYNCED_OFF) && shift_ov != 0) { 1412 for (i = timeStep * firstSlotOffsset; i < ov_len; i++) { 1413 for (band = hQmfTransposer->startBand; band < hQmfTransposer->stopBand; 1414 band++) { 1415 if (shift_ov >= 0) { 1416 ppQmfBufferOutReal_F[i][band] <<= shift_ov; 1417 ppQmfBufferOutImag_F[i][band] <<= shift_ov; 1418 } else { 1419 ppQmfBufferOutReal_F[i][band] >>= (-shift_ov); 1420 ppQmfBufferOutImag_F[i][band] >>= (-shift_ov); 1421 } 1422 } 1423 } 1424 1425 /* shift lpc filterstates */ 1426 for (i = 0; i < timeStep * firstSlotOffsset + LPC_ORDER; i++) { 1427 for (band = 0; band < (64); band++) { 1428 if (shift_ov >= 0) { 1429 lpcFilterStatesReal[i][band] <<= shift_ov; 1430 lpcFilterStatesImag[i][band] <<= shift_ov; 1431 } else { 1432 lpcFilterStatesReal[i][band] >>= (-shift_ov); 1433 lpcFilterStatesImag[i][band] >>= (-shift_ov); 1434 } 1435 } 1436 } 1437 } 1438 1439 FIXP_DBL twid_m_new[3][2]; /* [stretch][cos/sin] */ 1440 INT stepsize = 1 + !bSbr41, sine_offset = 24, mod = 96; 1441 INT mult[3] = {1, 2, 3}; 1442 1443 for (s = 0; s <= MAX_STRETCH_HBE - 2; s++) { 1444 twid_m_new[s][0] = twiddle[(mult[s] * (stepsize * pitchInBins)) % mod]; 1445 twid_m_new[s][1] = 1446 twiddle[((mult[s] * (stepsize * pitchInBins)) + sine_offset) % mod]; 1447 } 1448 1449 /* Time-stretch */ 1450 for (j = 0; j < qmfVocoderColsIn; j++) { 1451 int sign = -1, k, z, addrshift, codecTemp_e; 1452 /* update inbuf */ 1453 for (i = 0; i < hQmfTransposer->synthSize; i++) { 1454 hQmfTransposer->inBuf_F[i] = 1455 hQmfTransposer->inBuf_F[i + 2 * hQmfTransposer->synthSize]; 1456 } 1457 1458 /* run synthesis for two sbr slots as transposer uses 1459 half slots double bands representation */ 1460 for (z = 0; z < 2; z++) { 1461 int scale_factor = ((nColsIn == 64) && ((2 * j + z) < scale_border)) 1462 ? scale_lb 1463 : scale_hbe; 1464 codecTemp_e = scale_factor - 1; /* -2 for Div2 and cos/sin scale of 1 */ 1465 1466 for (k = 0; k < hQmfTransposer->synthSize; k++) { 1467 int ki = hQmfTransposer->kstart + k; 1468 hQmfTransposer->qmfBufferCodecTempSlot_F[k] = 1469 fMultDiv2(signPreMod * hQmfTransposer->synthesisQmfPreModCos_F[k], 1470 qmfBufferCodecReal[2 * j + z][ki]); 1471 hQmfTransposer->qmfBufferCodecTempSlot_F[k] += 1472 fMultDiv2(signPreMod * hQmfTransposer->synthesisQmfPreModSin_F[k], 1473 qmfBufferCodecImag[2 * j + z][ki]); 1474 } 1475 1476 C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1)); 1477 1478 qmfSynthesisFilteringSlot( 1479 &hQmfTransposer->HBESynthesisQMF, 1480 hQmfTransposer->qmfBufferCodecTempSlot_F, NULL, 0, 1481 -7 - hQmfTransposer->HBESynthesisQMF.filterScale - codecTemp_e + 1, 1482 hQmfTransposer->inBuf_F + hQmfTransposer->synthSize * (z + 1), 1, 1483 pWorkBuffer); 1484 1485 C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1)); 1486 } 1487 1488 C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1)); 1489 1490 qmfAnalysisFilteringSlot(&hQmfTransposer->HBEAnalysiscQMF, 1491 hQmfTransposer->qmfInBufReal_F[QMF_WIN_LEN - 1], 1492 hQmfTransposer->qmfInBufImag_F[QMF_WIN_LEN - 1], 1493 hQmfTransposer->inBuf_F + 1, 1, pWorkBuffer); 1494 1495 C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1)); 1496 1497 if ((keepStatesSyncedMode == KEEP_STATES_SYNCED_NORMAL) && 1498 j <= qmfVocoderColsIn - ((LPC_ORDER + ov_len + QMF_WIN_LEN - 1) >> 1)) { 1499 /* update in buffer */ 1500 for (i = 0; i < QMF_WIN_LEN - 1; i++) { 1501 FDKmemcpy( 1502 hQmfTransposer->qmfInBufReal_F[i], 1503 hQmfTransposer->qmfInBufReal_F[i + 1], 1504 sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels); 1505 FDKmemcpy( 1506 hQmfTransposer->qmfInBufImag_F[i], 1507 hQmfTransposer->qmfInBufImag_F[i + 1], 1508 sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels); 1509 } 1510 continue; 1511 } 1512 1513 for (stretch = 2; stretch <= hQmfTransposer->maxStretch; stretch++) { 1514 int start = slotOffset - winLength[stretch - 2] / 2; 1515 int stop = slotOffset + winLength[stretch - 2] / 2; 1516 1517 FIXP_DBL factor = FL2FXCONST_DBL(1.f / 3.f); 1518 1519 for (band = hQmfTransposer->xOverQmf[stretch - 2]; 1520 band < hQmfTransposer->xOverQmf[stretch - 1]; band++) { 1521 FIXP_DBL gammaCenterReal_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0}, 1522 gammaCenterImag_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0}; 1523 INT gammaCenter_e[2] = {0, 0}; 1524 1525 FIXP_DBL gammaVecReal_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0}, 1526 gammaVecImag_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0}; 1527 INT gammaVec_e[2] = {0, 0}; 1528 1529 FIXP_DBL wingain = (FIXP_DBL)0; 1530 1531 gammaCenter_e[0] = 1532 SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1533 gammaCenter_e[1] = 1534 SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1535 1536 /* interpolation filters for 3rd order */ 1537 sourceband = 2 * band / stretch - qmfOffset; 1538 FDK_ASSERT(sourceband >= 0); 1539 1540 /* maximum gammaCenter_e == 20 */ 1541 calculateCenterFIXP( 1542 hQmfTransposer->qmfInBufReal_F[slotOffset][sourceband], 1543 hQmfTransposer->qmfInBufImag_F[slotOffset][sourceband], 1544 &gammaCenterReal_m[0], &gammaCenterImag_m[0], &gammaCenter_e[0], 1545 stretch, stretch - 2); 1546 1547 if (stretch == 4) { 1548 r = band - 2 * (band / 2); 1549 sourceband += (r == 0) ? -1 : 1; 1550 pSlotStretch = slot_stretch4; 1551 factor = FL2FXCONST_DBL(2.f / 3.f); 1552 pFilt = filt_dummy; 1553 } else if (stretch == 2) { 1554 r = 0; 1555 sourceband = 2 * band / stretch - qmfOffset; 1556 pSlotStretch = slot_stretch2; 1557 factor = FL2FXCONST_DBL(1.f / 3.f); 1558 pFilt = filt_dummy; 1559 } else { 1560 r = 2 * band - 3 * (2 * band / 3); 1561 sourceband = 2 * band / stretch - qmfOffset; 1562 pSlotStretch = slot_stretch3; 1563 factor = FL2FXCONST_DBL(1.4142f / 3.0f); 1564 pFilt = filt_stretch3; 1565 } 1566 1567 if (r == 2) { 1568 calculateCenterFIXP( 1569 hQmfTransposer->qmfInBufReal_F[slotOffset][sourceband + 1], 1570 hQmfTransposer->qmfInBufImag_F[slotOffset][sourceband + 1], 1571 &gammaCenterReal_m[1], &gammaCenterImag_m[1], &gammaCenter_e[1], 1572 stretch, stretch - 2); 1573 1574 factor = FL2FXCONST_DBL(1.4142f / 6.0f); 1575 } 1576 1577 if (r == 2) { 1578 for (k = start; k < stop; k++) { 1579 gammaVecReal_m[0] = 1580 hQmfTransposer->qmfInBufReal_F[pSlotStretch[k]][sourceband]; 1581 gammaVecReal_m[1] = 1582 hQmfTransposer->qmfInBufReal_F[pSlotStretch[k]][sourceband + 1]; 1583 gammaVecImag_m[0] = 1584 hQmfTransposer->qmfInBufImag_F[pSlotStretch[k]][sourceband]; 1585 gammaVecImag_m[1] = 1586 hQmfTransposer->qmfInBufImag_F[pSlotStretch[k]][sourceband + 1]; 1587 gammaVec_e[0] = gammaVec_e[1] = 1588 SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1589 1590 if (pFilt[k] == 1) { 1591 FIXP_DBL tmpRealF = gammaVecReal_m[0], tmpImagF; 1592 gammaVecReal_m[0] = 1593 (fMult(gammaVecReal_m[0], hintReal_F[sourceband % 4][1]) - 1594 fMult(gammaVecImag_m[0], 1595 hintReal_F[(sourceband + 3) % 4][1])) >> 1596 1; /* sum should be <= 1 because of sin/cos multiplication */ 1597 gammaVecImag_m[0] = 1598 (fMult(tmpRealF, hintReal_F[(sourceband + 3) % 4][1]) + 1599 fMult(gammaVecImag_m[0], hintReal_F[sourceband % 4][1])) >> 1600 1; /* sum should be <= 1 because of sin/cos multiplication */ 1601 1602 tmpRealF = hQmfTransposer 1603 ->qmfInBufReal_F[pSlotStretch[k] + 1][sourceband]; 1604 tmpImagF = hQmfTransposer 1605 ->qmfInBufImag_F[pSlotStretch[k] + 1][sourceband]; 1606 1607 gammaVecReal_m[0] += 1608 (fMult(tmpRealF, hintReal_F[sourceband % 4][1]) - 1609 fMult(tmpImagF, hintReal_F[(sourceband + 1) % 4][1])) >> 1610 1; /* sum should be <= 1 because of sin/cos multiplication */ 1611 gammaVecImag_m[0] += 1612 (fMult(tmpRealF, hintReal_F[(sourceband + 1) % 4][1]) + 1613 fMult(tmpImagF, hintReal_F[sourceband % 4][1])) >> 1614 1; /* sum should be <= 1 because of sin/cos multiplication */ 1615 gammaVec_e[0]++; 1616 1617 tmpRealF = gammaVecReal_m[1]; 1618 1619 gammaVecReal_m[1] = 1620 (fMult(gammaVecReal_m[1], hintReal_F[sourceband % 4][2]) - 1621 fMult(gammaVecImag_m[1], 1622 hintReal_F[(sourceband + 3) % 4][2])) >> 1623 1; 1624 gammaVecImag_m[1] = 1625 (fMult(tmpRealF, hintReal_F[(sourceband + 3) % 4][2]) + 1626 fMult(gammaVecImag_m[1], hintReal_F[sourceband % 4][2])) >> 1627 1; 1628 1629 tmpRealF = 1630 hQmfTransposer 1631 ->qmfInBufReal_F[pSlotStretch[k] + 1][sourceband + 1]; 1632 tmpImagF = 1633 hQmfTransposer 1634 ->qmfInBufImag_F[pSlotStretch[k] + 1][sourceband + 1]; 1635 1636 gammaVecReal_m[1] += 1637 (fMult(tmpRealF, hintReal_F[sourceband % 4][2]) - 1638 fMult(tmpImagF, hintReal_F[(sourceband + 1) % 4][2])) >> 1639 1; 1640 gammaVecImag_m[1] += 1641 (fMult(tmpRealF, hintReal_F[(sourceband + 1) % 4][2]) + 1642 fMult(tmpImagF, hintReal_F[sourceband % 4][2])) >> 1643 1; 1644 gammaVec_e[1]++; 1645 } 1646 1647 addHighBandPart(gammaVecReal_m[1], gammaVecImag_m[1], gammaVec_e[1], 1648 factor, gammaCenterReal_m[0], gammaCenterImag_m[0], 1649 gammaCenter_e[0], stretch, scale_factor_hbe, 1650 &hQmfTransposer->qmfHBEBufReal_F[k][band], 1651 &hQmfTransposer->qmfHBEBufImag_F[k][band]); 1652 1653 addHighBandPart(gammaVecReal_m[0], gammaVecImag_m[0], gammaVec_e[0], 1654 factor, gammaCenterReal_m[1], gammaCenterImag_m[1], 1655 gammaCenter_e[1], stretch, scale_factor_hbe, 1656 &hQmfTransposer->qmfHBEBufReal_F[k][band], 1657 &hQmfTransposer->qmfHBEBufImag_F[k][band]); 1658 } 1659 } else { 1660 for (k = start; k < stop; k++) { 1661 gammaVecReal_m[0] = 1662 hQmfTransposer->qmfInBufReal_F[pSlotStretch[k]][sourceband]; 1663 gammaVecImag_m[0] = 1664 hQmfTransposer->qmfInBufImag_F[pSlotStretch[k]][sourceband]; 1665 gammaVec_e[0] = 1666 SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1667 1668 if (pFilt[k] == 1) { 1669 FIXP_DBL tmpRealF = gammaVecReal_m[0], tmpImagF; 1670 gammaVecReal_m[0] = 1671 (fMult(gammaVecReal_m[0], hintReal_F[sourceband % 4][1]) - 1672 fMult(gammaVecImag_m[0], 1673 hintReal_F[(sourceband + 3) % 4][1])) >> 1674 1; /* sum should be <= 1 because of sin/cos multiplication */ 1675 gammaVecImag_m[0] = 1676 (fMult(tmpRealF, hintReal_F[(sourceband + 3) % 4][1]) + 1677 fMult(gammaVecImag_m[0], hintReal_F[sourceband % 4][1])) >> 1678 1; /* sum should be <= 1 because of sin/cos multiplication */ 1679 1680 tmpRealF = hQmfTransposer 1681 ->qmfInBufReal_F[pSlotStretch[k] + 1][sourceband]; 1682 tmpImagF = hQmfTransposer 1683 ->qmfInBufImag_F[pSlotStretch[k] + 1][sourceband]; 1684 1685 gammaVecReal_m[0] += 1686 (fMult(tmpRealF, hintReal_F[sourceband % 4][1]) - 1687 fMult(tmpImagF, hintReal_F[(sourceband + 1) % 4][1])) >> 1688 1; /* sum should be <= 1 because of sin/cos multiplication */ 1689 gammaVecImag_m[0] += 1690 (fMult(tmpRealF, hintReal_F[(sourceband + 1) % 4][1]) + 1691 fMult(tmpImagF, hintReal_F[sourceband % 4][1])) >> 1692 1; /* sum should be <= 1 because of sin/cos multiplication */ 1693 gammaVec_e[0]++; 1694 } 1695 1696 addHighBandPart(gammaVecReal_m[0], gammaVecImag_m[0], gammaVec_e[0], 1697 factor, gammaCenterReal_m[0], gammaCenterImag_m[0], 1698 gammaCenter_e[0], stretch, scale_factor_hbe, 1699 &hQmfTransposer->qmfHBEBufReal_F[k][band], 1700 &hQmfTransposer->qmfHBEBufImag_F[k][band]); 1701 } 1702 } 1703 1704 /* pitchInBins is given with the resolution of a 768 bins FFT and we 1705 * need 64 QMF units so factor 768/64 = 12 */ 1706 if (pitchInBins >= pmin * (1 + bSbr41)) { 1707 int tr, ti1, ti2, mTr = 0, ts1 = 0, ts2 = 0, mVal_e = 0, temp_e = 0; 1708 int sqmag0_e = 1709 SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1710 1711 FIXP_DBL mVal_F = FL2FXCONST_DBL(0.f), sqmag0_F, sqmag1_F, sqmag2_F, 1712 temp_F, f1_F; /* all equal exponent */ 1713 sign = -1; 1714 1715 sourceband = 2 * band / stretch - qmfOffset; /* consistent with the 1716 already computed for 1717 stretch = 3,4. */ 1718 FDK_ASSERT(sourceband >= 0); 1719 1720 FIXP_DBL sqmag0R_F = 1721 hQmfTransposer->qmfInBufReal_F[slotOffset][sourceband]; 1722 FIXP_DBL sqmag0I_F = 1723 hQmfTransposer->qmfInBufImag_F[slotOffset][sourceband]; 1724 scaleUp(&sqmag0R_F, &sqmag0I_F, &sqmag0_e); 1725 1726 sqmag0_F = fPow2Div2(sqmag0R_F); 1727 sqmag0_F += fPow2Div2(sqmag0I_F); 1728 sqmag0_e = 2 * sqmag0_e + 1; 1729 1730 for (tr = 1; tr < stretch; tr++) { 1731 int sqmag1_e = 1732 SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1733 int sqmag2_e = 1734 SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1735 1736 FIXP_DBL tmp_band = band_F[band]; 1737 FIXP_DBL tr_p = 1738 fMult(p_F[pitchInBins] >> bSbr41, tr_str[tr - 1]); /* scale 7 */ 1739 f1_F = 1740 fMult(tmp_band - tr_p, stretchfac[stretch - 2]); /* scale 7 */ 1741 ti1 = (INT)(f1_F >> (DFRACT_BITS - 1 - 7)) - qmfOffset; 1742 ti2 = (INT)(((f1_F) + ((p_F[pitchInBins] >> bSbr41) >> 2)) >> 1743 (DFRACT_BITS - 1 - 7)) - 1744 qmfOffset; 1745 1746 if (ti1 >= 0 && ti2 < 2 * hQmfTransposer->synthSize) { 1747 FIXP_DBL sqmag1R_F = 1748 hQmfTransposer->qmfInBufReal_F[slotOffset][ti1]; 1749 FIXP_DBL sqmag1I_F = 1750 hQmfTransposer->qmfInBufImag_F[slotOffset][ti1]; 1751 scaleUp(&sqmag1R_F, &sqmag1I_F, &sqmag1_e); 1752 sqmag1_F = fPow2Div2(sqmag1R_F); 1753 sqmag1_F += fPow2Div2(sqmag1I_F); 1754 sqmag1_e = 2 * sqmag1_e + 1; 1755 1756 FIXP_DBL sqmag2R_F = 1757 hQmfTransposer->qmfInBufReal_F[slotOffset][ti2]; 1758 FIXP_DBL sqmag2I_F = 1759 hQmfTransposer->qmfInBufImag_F[slotOffset][ti2]; 1760 scaleUp(&sqmag2R_F, &sqmag2I_F, &sqmag2_e); 1761 sqmag2_F = fPow2Div2(sqmag2R_F); 1762 sqmag2_F += fPow2Div2(sqmag2I_F); 1763 sqmag2_e = 2 * sqmag2_e + 1; 1764 1765 int shift1 = fMin(fMax(sqmag1_e, sqmag2_e) - sqmag1_e, 31); 1766 int shift2 = fMin(fMax(sqmag1_e, sqmag2_e) - sqmag2_e, 31); 1767 1768 temp_F = fMin((sqmag1_F >> shift1), (sqmag2_F >> shift2)); 1769 temp_e = fMax(sqmag1_e, sqmag2_e); 1770 1771 int shift3 = fMin(fMax(temp_e, mVal_e) - temp_e, 31); 1772 int shift4 = fMin(fMax(temp_e, mVal_e) - mVal_e, 31); 1773 1774 if ((temp_F >> shift3) > (mVal_F >> shift4)) { 1775 mVal_F = temp_F; 1776 mVal_e = temp_e; /* equals sqmag2_e + shift2 */ 1777 mTr = tr; 1778 ts1 = ti1; 1779 ts2 = ti2; 1780 } 1781 } 1782 } 1783 1784 int shift1 = fMin(fMax(sqmag0_e, mVal_e) - sqmag0_e, 31); 1785 int shift2 = fMin(fMax(sqmag0_e, mVal_e) - mVal_e, 31); 1786 1787 if ((mVal_F >> shift2) > (sqmag0_F >> shift1) && ts1 >= 0 && 1788 ts2 < 2 * hQmfTransposer->synthSize) { 1789 INT gammaOut_e[2]; 1790 FIXP_DBL gammaOutReal_m[2], gammaOutImag_m[2]; 1791 FIXP_DBL tmpReal_m = (FIXP_DBL)0, tmpImag_m = (FIXP_DBL)0; 1792 1793 int Tcenter, Tvec; 1794 1795 Tcenter = stretch - mTr; /* default phase power parameters */ 1796 Tvec = mTr; 1797 switch (stretch) /* 2 tap block creation design depends on stretch 1798 order */ 1799 { 1800 case 2: 1801 wingain = 1802 FL2FXCONST_DBL(5.f / 12.f); /* sum of taps divided by two */ 1803 1804 if (hQmfTransposer->bXProducts[0]) { 1805 gammaCenterReal_m[0] = 1806 hQmfTransposer->qmfInBufReal_F[slotOffset][ts1]; 1807 gammaCenterImag_m[0] = 1808 hQmfTransposer->qmfInBufImag_F[slotOffset][ts1]; 1809 1810 for (k = 0; k < 2; k++) { 1811 gammaVecReal_m[k] = 1812 hQmfTransposer->qmfInBufReal_F[slotOffset - 1 + k][ts2]; 1813 gammaVecImag_m[k] = 1814 hQmfTransposer->qmfInBufImag_F[slotOffset - 1 + k][ts2]; 1815 } 1816 1817 gammaCenter_e[0] = SCALE2EXP( 1818 -hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1819 gammaVec_e[0] = gammaVec_e[1] = SCALE2EXP( 1820 -hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1821 } 1822 break; 1823 1824 case 4: 1825 wingain = 1826 FL2FXCONST_DBL(6.f / 12.f); /* sum of taps divided by two */ 1827 if (hQmfTransposer->bXProducts[2]) { 1828 if (mTr == 1) { 1829 gammaCenterReal_m[0] = 1830 hQmfTransposer->qmfInBufReal_F[slotOffset][ts1]; 1831 gammaCenterImag_m[0] = 1832 hQmfTransposer->qmfInBufImag_F[slotOffset][ts1]; 1833 1834 for (k = 0; k < 2; k++) { 1835 gammaVecReal_m[k] = 1836 hQmfTransposer 1837 ->qmfInBufReal_F[slotOffset + 2 * (k - 1)][ts2]; 1838 gammaVecImag_m[k] = 1839 hQmfTransposer 1840 ->qmfInBufImag_F[slotOffset + 2 * (k - 1)][ts2]; 1841 } 1842 } else if (mTr == 2) { 1843 gammaCenterReal_m[0] = 1844 hQmfTransposer->qmfInBufReal_F[slotOffset][ts1]; 1845 gammaCenterImag_m[0] = 1846 hQmfTransposer->qmfInBufImag_F[slotOffset][ts1]; 1847 1848 for (k = 0; k < 2; k++) { 1849 gammaVecReal_m[k] = 1850 hQmfTransposer 1851 ->qmfInBufReal_F[slotOffset + (k - 1)][ts2]; 1852 gammaVecImag_m[k] = 1853 hQmfTransposer 1854 ->qmfInBufImag_F[slotOffset + (k - 1)][ts2]; 1855 } 1856 } else /* (mTr == 3) */ 1857 { 1858 sign = 1; 1859 Tcenter = mTr; /* opposite phase power parameters as ts2 is 1860 center */ 1861 Tvec = stretch - mTr; 1862 1863 gammaCenterReal_m[0] = 1864 hQmfTransposer->qmfInBufReal_F[slotOffset][ts2]; 1865 gammaCenterImag_m[0] = 1866 hQmfTransposer->qmfInBufImag_F[slotOffset][ts2]; 1867 1868 for (k = 0; k < 2; k++) { 1869 gammaVecReal_m[k] = 1870 hQmfTransposer 1871 ->qmfInBufReal_F[slotOffset + 2 * (k - 1)][ts1]; 1872 gammaVecImag_m[k] = 1873 hQmfTransposer 1874 ->qmfInBufImag_F[slotOffset + 2 * (k - 1)][ts1]; 1875 } 1876 } 1877 1878 gammaCenter_e[0] = SCALE2EXP( 1879 -hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1880 gammaVec_e[0] = gammaVec_e[1] = SCALE2EXP( 1881 -hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1882 } 1883 break; 1884 1885 case 3: 1886 wingain = FL2FXCONST_DBL(5.6568f / 1887 12.f); /* sum of taps divided by two */ 1888 1889 if (hQmfTransposer->bXProducts[1]) { 1890 FIXP_DBL tmpReal_F, tmpImag_F; 1891 if (mTr == 1) { 1892 gammaCenterReal_m[0] = 1893 hQmfTransposer->qmfInBufReal_F[slotOffset][ts1]; 1894 gammaCenterImag_m[0] = 1895 hQmfTransposer->qmfInBufImag_F[slotOffset][ts1]; 1896 gammaVecReal_m[1] = 1897 hQmfTransposer->qmfInBufReal_F[slotOffset][ts2]; 1898 gammaVecImag_m[1] = 1899 hQmfTransposer->qmfInBufImag_F[slotOffset][ts2]; 1900 1901 addrshift = -2; 1902 tmpReal_F = 1903 hQmfTransposer 1904 ->qmfInBufReal_F[addrshift + slotOffset][ts2]; 1905 tmpImag_F = 1906 hQmfTransposer 1907 ->qmfInBufImag_F[addrshift + slotOffset][ts2]; 1908 1909 gammaVecReal_m[0] = 1910 (fMult(factors[ts2 % 4], tmpReal_F) - 1911 fMult(factors[(ts2 + 3) % 4], tmpImag_F)) >> 1912 1; 1913 gammaVecImag_m[0] = 1914 (fMult(factors[(ts2 + 3) % 4], tmpReal_F) + 1915 fMult(factors[ts2 % 4], tmpImag_F)) >> 1916 1; 1917 1918 tmpReal_F = 1919 hQmfTransposer 1920 ->qmfInBufReal_F[addrshift + 1 + slotOffset][ts2]; 1921 tmpImag_F = 1922 hQmfTransposer 1923 ->qmfInBufImag_F[addrshift + 1 + slotOffset][ts2]; 1924 1925 gammaVecReal_m[0] += 1926 (fMult(factors[ts2 % 4], tmpReal_F) - 1927 fMult(factors[(ts2 + 1) % 4], tmpImag_F)) >> 1928 1; 1929 gammaVecImag_m[0] += 1930 (fMult(factors[(ts2 + 1) % 4], tmpReal_F) + 1931 fMult(factors[ts2 % 4], tmpImag_F)) >> 1932 1; 1933 1934 } else /* (mTr == 2) */ 1935 { 1936 sign = 1; 1937 Tcenter = mTr; /* opposite phase power parameters as ts2 is 1938 center */ 1939 Tvec = stretch - mTr; 1940 1941 gammaCenterReal_m[0] = 1942 hQmfTransposer->qmfInBufReal_F[slotOffset][ts2]; 1943 gammaCenterImag_m[0] = 1944 hQmfTransposer->qmfInBufImag_F[slotOffset][ts2]; 1945 gammaVecReal_m[1] = 1946 hQmfTransposer->qmfInBufReal_F[slotOffset][ts1]; 1947 gammaVecImag_m[1] = 1948 hQmfTransposer->qmfInBufImag_F[slotOffset][ts1]; 1949 1950 addrshift = -2; 1951 tmpReal_F = 1952 hQmfTransposer 1953 ->qmfInBufReal_F[addrshift + slotOffset][ts1]; 1954 tmpImag_F = 1955 hQmfTransposer 1956 ->qmfInBufImag_F[addrshift + slotOffset][ts1]; 1957 1958 gammaVecReal_m[0] = 1959 (fMult(factors[ts1 % 4], tmpReal_F) - 1960 fMult(factors[(ts1 + 3) % 4], tmpImag_F)) >> 1961 1; 1962 gammaVecImag_m[0] = 1963 (fMult(factors[(ts1 + 3) % 4], tmpReal_F) + 1964 fMult(factors[ts1 % 4], tmpImag_F)) >> 1965 1; 1966 1967 tmpReal_F = 1968 hQmfTransposer 1969 ->qmfInBufReal_F[addrshift + 1 + slotOffset][ts1]; 1970 tmpImag_F = 1971 hQmfTransposer 1972 ->qmfInBufImag_F[addrshift + 1 + slotOffset][ts1]; 1973 1974 gammaVecReal_m[0] += 1975 (fMult(factors[ts1 % 4], tmpReal_F) - 1976 fMult(factors[(ts1 + 1) % 4], tmpImag_F)) >> 1977 1; 1978 gammaVecImag_m[0] += 1979 (fMult(factors[(ts1 + 1) % 4], tmpReal_F) + 1980 fMult(factors[ts1 % 4], tmpImag_F)) >> 1981 1; 1982 } 1983 1984 gammaCenter_e[0] = gammaVec_e[1] = SCALE2EXP( 1985 -hQmfTransposer->HBEAnalysiscQMF.outScalefactor); 1986 gammaVec_e[0] = 1987 SCALE2EXP( 1988 -hQmfTransposer->HBEAnalysiscQMF.outScalefactor) + 1989 1; 1990 } 1991 break; 1992 default: 1993 FDK_ASSERT(0); 1994 break; 1995 } /* stretch cases */ 1996 1997 /* parameter controlled phase modification parts */ 1998 /* maximum *_e == 20 */ 1999 calculateCenterFIXP(gammaCenterReal_m[0], gammaCenterImag_m[0], 2000 &gammaCenterReal_m[0], &gammaCenterImag_m[0], 2001 &gammaCenter_e[0], stretch, Tcenter - 1); 2002 calculateCenterFIXP(gammaVecReal_m[0], gammaVecImag_m[0], 2003 &gammaVecReal_m[0], &gammaVecImag_m[0], 2004 &gammaVec_e[0], stretch, Tvec - 1); 2005 calculateCenterFIXP(gammaVecReal_m[1], gammaVecImag_m[1], 2006 &gammaVecReal_m[1], &gammaVecImag_m[1], 2007 &gammaVec_e[1], stretch, Tvec - 1); 2008 2009 /* Final multiplication of prepared parts */ 2010 for (k = 0; k < 2; k++) { 2011 gammaOutReal_m[k] = 2012 fMultDiv2(gammaVecReal_m[k], gammaCenterReal_m[0]) - 2013 fMultDiv2(gammaVecImag_m[k], gammaCenterImag_m[0]); 2014 gammaOutImag_m[k] = 2015 fMultDiv2(gammaVecReal_m[k], gammaCenterImag_m[0]) + 2016 fMultDiv2(gammaVecImag_m[k], gammaCenterReal_m[0]); 2017 gammaOut_e[k] = gammaCenter_e[0] + gammaVec_e[k] + 1; 2018 } 2019 2020 scaleUp(&gammaOutReal_m[0], &gammaOutImag_m[0], &gammaOut_e[0]); 2021 scaleUp(&gammaOutReal_m[1], &gammaOutImag_m[1], &gammaOut_e[1]); 2022 FDK_ASSERT(gammaOut_e[0] >= 0); 2023 FDK_ASSERT(gammaOut_e[0] < 32); 2024 2025 tmpReal_m = gammaOutReal_m[0]; 2026 tmpImag_m = gammaOutImag_m[0]; 2027 2028 INT modstretch4 = ((stretch == 4) && (mTr == 2)); 2029 2030 FIXP_DBL cos_twid = twid_m_new[stretch - 2 - modstretch4][0]; 2031 FIXP_DBL sin_twid = sign * twid_m_new[stretch - 2 - modstretch4][1]; 2032 2033 gammaOutReal_m[0] = 2034 fMult(tmpReal_m, cos_twid) - 2035 fMult(tmpImag_m, sin_twid); /* sum should be <= 1 because of 2036 sin/cos multiplication */ 2037 gammaOutImag_m[0] = 2038 fMult(tmpImag_m, cos_twid) + 2039 fMult(tmpReal_m, sin_twid); /* sum should be <= 1 because of 2040 sin/cos multiplication */ 2041 2042 /* wingain */ 2043 for (k = 0; k < 2; k++) { 2044 gammaOutReal_m[k] = (fMult(gammaOutReal_m[k], wingain) << 1); 2045 gammaOutImag_m[k] = (fMult(gammaOutImag_m[k], wingain) << 1); 2046 } 2047 2048 gammaOutReal_m[1] >>= 1; 2049 gammaOutImag_m[1] >>= 1; 2050 gammaOut_e[0] += 2; 2051 gammaOut_e[1] += 2; 2052 2053 /* OLA including window scaling by wingain/3 */ 2054 for (k = 0; k < 2; k++) /* need k=1 to correspond to 2055 grainModImag[slotOffset] -> out to 2056 j*2+(slotOffset-offset) */ 2057 { 2058 hQmfTransposer->qmfHBEBufReal_F[(k + slotOffset - 1)][band] += 2059 gammaOutReal_m[k] >> (scale_factor_hbe - gammaOut_e[k]); 2060 hQmfTransposer->qmfHBEBufImag_F[(k + slotOffset - 1)][band] += 2061 gammaOutImag_m[k] >> (scale_factor_hbe - gammaOut_e[k]); 2062 } 2063 } /* mVal > qThrQMF * qThrQMF * sqmag0 && ts1 > 0 && ts2 < 64 */ 2064 } /* p >= pmin */ 2065 } /* for band */ 2066 } /* for stretch */ 2067 2068 for (i = 0; i < QMF_WIN_LEN - 1; i++) { 2069 FDKmemcpy(hQmfTransposer->qmfInBufReal_F[i], 2070 hQmfTransposer->qmfInBufReal_F[i + 1], 2071 sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels); 2072 FDKmemcpy(hQmfTransposer->qmfInBufImag_F[i], 2073 hQmfTransposer->qmfInBufImag_F[i + 1], 2074 sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels); 2075 } 2076 2077 if (keepStatesSyncedMode != KEEP_STATES_SYNCED_NOOUT) { 2078 if (2 * j >= offset) { 2079 /* copy first two slots of internal buffer to output */ 2080 if (keepStatesSyncedMode == KEEP_STATES_SYNCED_OUTDIFF) { 2081 for (i = 0; i < 2; i++) { 2082 FDKmemcpy(&ppQmfBufferOutReal_F[2 * j - offset + i] 2083 [hQmfTransposer->xOverQmf[0]], 2084 &hQmfTransposer 2085 ->qmfHBEBufReal_F[i][hQmfTransposer->xOverQmf[0]], 2086 (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * 2087 sizeof(FIXP_DBL)); 2088 FDKmemcpy(&ppQmfBufferOutImag_F[2 * j - offset + i] 2089 [hQmfTransposer->xOverQmf[0]], 2090 &hQmfTransposer 2091 ->qmfHBEBufImag_F[i][hQmfTransposer->xOverQmf[0]], 2092 (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * 2093 sizeof(FIXP_DBL)); 2094 } 2095 } else { 2096 for (i = 0; i < 2; i++) { 2097 FDKmemcpy(&ppQmfBufferOutReal_F[2 * j + i + ov_len] 2098 [hQmfTransposer->xOverQmf[0]], 2099 &hQmfTransposer 2100 ->qmfHBEBufReal_F[i][hQmfTransposer->xOverQmf[0]], 2101 (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * 2102 sizeof(FIXP_DBL)); 2103 FDKmemcpy(&ppQmfBufferOutImag_F[2 * j + i + ov_len] 2104 [hQmfTransposer->xOverQmf[0]], 2105 &hQmfTransposer 2106 ->qmfHBEBufImag_F[i][hQmfTransposer->xOverQmf[0]], 2107 (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * 2108 sizeof(FIXP_DBL)); 2109 } 2110 } 2111 } 2112 } 2113 2114 /* move slots up */ 2115 for (i = 0; i < HBE_MAX_OUT_SLOTS - 2; i++) { 2116 FDKmemcpy( 2117 &hQmfTransposer->qmfHBEBufReal_F[i][hQmfTransposer->xOverQmf[0]], 2118 &hQmfTransposer->qmfHBEBufReal_F[i + 2][hQmfTransposer->xOverQmf[0]], 2119 (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * 2120 sizeof(FIXP_DBL)); 2121 FDKmemcpy( 2122 &hQmfTransposer->qmfHBEBufImag_F[i][hQmfTransposer->xOverQmf[0]], 2123 &hQmfTransposer->qmfHBEBufImag_F[i + 2][hQmfTransposer->xOverQmf[0]], 2124 (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * 2125 sizeof(FIXP_DBL)); 2126 } 2127 2128 /* finally set last two slot to zero */ 2129 for (i = 0; i < 2; i++) { 2130 FDKmemset(&hQmfTransposer->qmfHBEBufReal_F[HBE_MAX_OUT_SLOTS - 1 - i] 2131 [hQmfTransposer->xOverQmf[0]], 2132 0, 2133 (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * 2134 sizeof(FIXP_DBL)); 2135 FDKmemset(&hQmfTransposer->qmfHBEBufImag_F[HBE_MAX_OUT_SLOTS - 1 - i] 2136 [hQmfTransposer->xOverQmf[0]], 2137 0, 2138 (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) * 2139 sizeof(FIXP_DBL)); 2140 } 2141 } /* qmfVocoderColsIn */ 2142 2143 if (keepStatesSyncedMode != KEEP_STATES_SYNCED_NOOUT) { 2144 if (keepStatesSyncedMode == KEEP_STATES_SYNCED_OUTDIFF) { 2145 for (i = 0; i < ov_len + LPC_ORDER; i++) { 2146 for (band = hQmfTransposer->startBand; band < hQmfTransposer->stopBand; 2147 band++) { 2148 FIXP_DBL tmpR = ppQmfBufferOutReal_F[i][band]; 2149 FIXP_DBL tmpI = ppQmfBufferOutImag_F[i][band]; 2150 2151 ppQmfBufferOutReal_F[i][band] = 2152 fMult(tmpR, cos_F[band]) - 2153 fMult(tmpI, (-cos_F[64 - band - 1])); /* sum should be <= 1 2154 because of sin/cos 2155 multiplication */ 2156 ppQmfBufferOutImag_F[i][band] = 2157 fMult(tmpR, (-cos_F[64 - band - 1])) + 2158 fMult(tmpI, cos_F[band]); /* sum should by <= 1 because of sin/cos 2159 multiplication */ 2160 } 2161 } 2162 } else { 2163 for (i = offset; i < hQmfTransposer->noCols; i++) { 2164 for (band = hQmfTransposer->startBand; band < hQmfTransposer->stopBand; 2165 band++) { 2166 FIXP_DBL tmpR = ppQmfBufferOutReal_F[i + ov_len][band]; 2167 FIXP_DBL tmpI = ppQmfBufferOutImag_F[i + ov_len][band]; 2168 2169 ppQmfBufferOutReal_F[i + ov_len][band] = 2170 fMult(tmpR, cos_F[band]) - 2171 fMult(tmpI, (-cos_F[64 - band - 1])); /* sum should be <= 1 2172 because of sin/cos 2173 multiplication */ 2174 ppQmfBufferOutImag_F[i + ov_len][band] = 2175 fMult(tmpR, (-cos_F[64 - band - 1])) + 2176 fMult(tmpI, cos_F[band]); /* sum should by <= 1 because of sin/cos 2177 multiplication */ 2178 } 2179 } 2180 } 2181 } 2182 2183 *scale_hb = EXP2SCALE(scale_factor_hbe); 2184} 2185 2186int* GetxOverBandQmfTransposer(HANDLE_HBE_TRANSPOSER hQmfTransposer) { 2187 if (hQmfTransposer) 2188 return hQmfTransposer->xOverQmf; 2189 else 2190 return NULL; 2191} 2192 2193int Get41SbrQmfTransposer(HANDLE_HBE_TRANSPOSER hQmfTransposer) { 2194 if (hQmfTransposer != NULL) 2195 return hQmfTransposer->bSbr41; 2196 else 2197 return 0; 2198} 2199