aboutsummaryrefslogtreecommitdiffstats
path: root/libSBRdec/src/psdec_hybrid.cpp
diff options
context:
space:
mode:
authorFraunhofer IIS FDK <audio-fdk@iis.fraunhofer.de>2018-02-26 20:17:00 +0100
committerJean-Michel Trivi <jmtrivi@google.com>2018-04-19 11:21:15 -0700
commit6cfabd35363c3ef5e3b209b867169a500b3ccc3c (patch)
tree01c0a19f2735e8b5d2407555fe992d4230d089eb /libSBRdec/src/psdec_hybrid.cpp
parent6288a1e34c4dede4c2806beb1736ece6580558c7 (diff)
downloadfdk-aac-6cfabd35363c3ef5e3b209b867169a500b3ccc3c.tar.gz
fdk-aac-6cfabd35363c3ef5e3b209b867169a500b3ccc3c.tar.bz2
fdk-aac-6cfabd35363c3ef5e3b209b867169a500b3ccc3c.zip
Upgrade to FDKv2
Bug: 71430241 Test: CTS DecoderTest and DecoderTestAacDrc original-Change-Id: Iaa20f749b8a04d553b20247cfe1a8930ebbabe30 Apply clang-format also on header files. original-Change-Id: I14de1ef16bbc79ec0283e745f98356a10efeb2e4 Fixes for MPEG-D DRC original-Change-Id: If1de2d74bbbac84b3f67de3b88b83f6a23b8a15c Catch unsupported tw_mdct at an early stage original-Change-Id: Ied9dd00d754162a0e3ca1ae3e6b854315d818afe Fixing PVC transition frames original-Change-Id: Ib75725abe39252806c32d71176308f2c03547a4e Move qmf bands sanity check original-Change-Id: Iab540c3013c174d9490d2ae100a4576f51d8dbc4 Initialize scaling variable original-Change-Id: I3c4087101b70e998c71c1689b122b0d7762e0f9e Add 16 qmf band configuration to getSlotNrgHQ() original-Change-Id: I49a5d30f703a1b126ff163df9656db2540df21f1 Always apply byte alignment at the end of the AudioMuxElement original-Change-Id: I42d560287506d65d4c3de8bfe3eb9a4ebeb4efc7 Setup SBR element only if no parse error exists original-Change-Id: I1915b73704bc80ab882b9173d6bec59cbd073676 Additional array index check in HCR original-Change-Id: I18cc6e501ea683b5009f1bbee26de8ddd04d8267 Fix fade-in index selection in concealment module original-Change-Id: Ibf802ed6ed8c05e9257e1f3b6d0ac1162e9b81c1 Enable explicit backward compatible parser for AAC_LD original-Change-Id: I27e9c678dcb5d40ed760a6d1e06609563d02482d Skip spatial specific config in explicit backward compatible ASC original-Change-Id: Iff7cc365561319e886090cedf30533f562ea4d6e Update flags description in decoder API original-Change-Id: I9a5b4f8da76bb652f5580cbd3ba9760425c43830 Add QMF domain reset function original-Change-Id: I4f89a8a2c0277d18103380134e4ed86996e9d8d6 DRC upgrade v2.1.0 original-Change-Id: I5731c0540139dab220094cd978ef42099fc45b74 Fix integer overflow in sqrtFixp_lookup() original-Change-Id: I429a6f0d19aa2cc957e0f181066f0ca73968c914 Fix integer overflow in invSqrtNorm2() original-Change-Id: I84de5cbf9fb3adeb611db203fe492fabf4eb6155 Fix integer overflow in GenerateRandomVector() original-Change-Id: I3118a641008bd9484d479e5b0b1ee2b5d7d44d74 Fix integer overflow in adjustTimeSlot_EldGrid() original-Change-Id: I29d503c247c5c8282349b79df940416a512fb9d5 Fix integer overflow in FDKsbrEnc_codeEnvelope() original-Change-Id: I6b34b61ebb9d525b0c651ed08de2befc1f801449 Follow-up on: Fix integer overflow in adjustTimeSlot_EldGrid() original-Change-Id: I6f8f578cc7089e5eb7c7b93e580b72ca35ad689a Fix integer overflow in get_pk_v2() original-Change-Id: I63375bed40d45867f6eeaa72b20b1f33e815938c Fix integer overflow in Syn_filt_zero() original-Change-Id: Ie0c02fdfbe03988f9d3b20d10cd9fe4c002d1279 Fix integer overflow in CFac_CalcFacSignal() original-Change-Id: Id2d767c40066c591b51768e978eb8af3b803f0c5 Fix integer overflow in FDKaacEnc_FDKaacEnc_calcPeNoAH() original-Change-Id: Idcbd0f4a51ae2550ed106aa6f3d678d1f9724841 Fix integer overflow in sbrDecoder_calculateGainVec() original-Change-Id: I7081bcbe29c5cede9821b38d93de07c7add2d507 Fix integer overflow in CLpc_SynthesisLattice() original-Change-Id: I4a95ddc18de150102352d4a1845f06094764c881 Fix integer overflow in Pred_Lt4() original-Change-Id: I4dbd012b2de7d07c3e70a47b92e3bfae8dbc750a Fix integer overflow in FDKsbrEnc_InitSbrFastTransientDetector() original-Change-Id: I788cbec1a4a00f44c2f3a72ad7a4afa219807d04 Fix unsigned integer overflow in FDKaacEnc_WriteBitstream() original-Change-Id: I68fc75166e7d2cd5cd45b18dbe3d8c2a92f1822a Fix unsigned integer overflow in FDK_MetadataEnc_Init() original-Change-Id: Ie8d025f9bcdb2442c704bd196e61065c03c10af4 Fix overflow in pseudo random number generators original-Change-Id: I3e2551ee01356297ca14e3788436ede80bd5513c Fix unsigned integer overflow in sbrDecoder_Parse() original-Change-Id: I3f231b2f437e9c37db4d5b964164686710eee971 Fix unsigned integer overflow in longsub() original-Change-Id: I73c2bc50415cac26f1f5a29e125bbe75f9180a6e Fix unsigned integer overflow in CAacDecoder_DecodeFrame() original-Change-Id: Ifce2db4b1454b46fa5f887e9d383f1cc43b291e4 Fix overflow at CLpdChannelStream_Read() original-Change-Id: Idb9d822ce3a4272e4794b643644f5434e2d4bf3f Fix unsigned integer overflow in Hcr_State_BODY_SIGN_ESC__ESC_WORD() original-Change-Id: I1ccf77c0015684b85534c5eb97162740a870b71c Fix unsigned integer overflow in UsacConfig_Parse() original-Change-Id: Ie6d27f84b6ae7eef092ecbff4447941c77864d9f Fix unsigned integer overflow in aacDecoder_drcParse() original-Change-Id: I713f28e883eea3d70b6fa56a7b8f8c22bcf66ca0 Fix unsigned integer overflow in aacDecoder_drcReadCompression() original-Change-Id: Ia34dfeb88c4705c558bce34314f584965cafcf7a Fix unsigned integer overflow in CDataStreamElement_Read() original-Change-Id: Iae896cc1d11f0a893d21be6aa90bd3e60a2c25f0 Fix unsigned integer overflow in transportDec_AdjustEndOfAccessUnit() original-Change-Id: I64cf29a153ee784bb4a16fdc088baabebc0007dc Fix unsigned integer overflow in transportDec_GetAuBitsRemaining() original-Change-Id: I975b3420faa9c16a041874ba0db82e92035962e4 Fix unsigned integer overflow in extractExtendedData() original-Change-Id: I2a59eb09e2053cfb58dfb75fcecfad6b85a80a8f Fix signed integer overflow in CAacDecoder_ExtPayloadParse() original-Change-Id: I4ad5ca4e3b83b5d964f1c2f8c5e7b17c477c7929 Fix unsigned integer overflow in CAacDecoder_DecodeFrame() original-Change-Id: I29a39df77d45c52a0c9c5c83c1ba81f8d0f25090 Follow-up on: Fix integer overflow in CLpc_SynthesisLattice() original-Change-Id: I8fb194ffc073a3432a380845be71036a272d388f Fix signed integer overflow in _interpolateDrcGain() original-Change-Id: I879ec9ab14005069a7c47faf80e8bc6e03d22e60 Fix unsigned integer overflow in FDKreadBits() original-Change-Id: I1f47a6a8037ff70375aa8844947d5681bb4287ad Fix unsigned integer overflow in FDKbyteAlign() original-Change-Id: Id5f3a11a0c9e50fc6f76ed6c572dbd4e9f2af766 Fix unsigned integer overflow in FDK_get32() original-Change-Id: I9d33b8e97e3d38cbb80629cb859266ca0acdce96 Fix unsigned integer overflow in FDK_pushBack() original-Change-Id: Ic87f899bc8c6acf7a377a8ca7f3ba74c3a1e1c19 Fix unsigned integer overflow in FDK_pushForward() original-Change-Id: I3b754382f6776a34be1602e66694ede8e0b8effc Fix unsigned integer overflow in ReadPsData() original-Change-Id: I25361664ba8139e32bbbef2ca8c106a606ce9c37 Fix signed integer overflow in E_UTIL_residu() original-Change-Id: I8c3abd1f437ee869caa8fb5903ce7d3d641b6aad REVERT: Follow-up on: Integer overflow in CLpc_SynthesisLattice(). original-Change-Id: I3d340099acb0414795c8dfbe6362bc0a8f045f9b Follow-up on: Fix integer overflow in CLpc_SynthesisLattice() original-Change-Id: I4aedb8b3a187064e9f4d985175aa55bb99cc7590 Follow-up on: Fix unsigned integer overflow in aacDecoder_drcParse() original-Change-Id: I2aa2e13916213bf52a67e8b0518e7bf7e57fb37d Fix integer overflow in acelp original-Change-Id: Ie6390c136d84055f8b728aefbe4ebef6e029dc77 Fix unsigned integer overflow in aacDecoder_UpdateBitStreamCounters() original-Change-Id: I391ffd97ddb0b2c184cba76139bfb356a3b4d2e2 Adjust concealment default settings original-Change-Id: I6a95db935a327c47df348030bcceafcb29f54b21 Saturate estimatedStartPos original-Change-Id: I27be2085e0ae83ec9501409f65e003f6bcba1ab6 Negative shift exponent in _interpolateDrcGain() original-Change-Id: I18edb26b26d002aafd5e633d4914960f7a359c29 Negative shift exponent in calculateICC() original-Change-Id: I3dcd2ae98d2eb70ee0d59750863cbb2a6f4f8aba Too large shift exponent in FDK_put() original-Change-Id: Ib7d9aaa434d2d8de4a13b720ca0464b31ca9b671 Too large shift exponent in CalcInvLdData() original-Change-Id: I43e6e78d4cd12daeb1dcd5d82d1798bdc2550262 Member access within null pointer of type SBR_CHANNEL original-Change-Id: Idc5e4ea8997810376d2f36bbdf628923b135b097 Member access within null pointer of type CpePersistentData original-Change-Id: Ib6c91cb0d37882768e5baf63324e429589de0d9d Member access within null pointer FDKaacEnc_psyMain() original-Change-Id: I7729b7f4479970531d9dc823abff63ca52e01997 Member access within null pointer FDKaacEnc_GetPnsParam() original-Change-Id: I9aa3b9f3456ae2e0f7483dbd5b3dde95fc62da39 Member access within null pointer FDKsbrEnc_EnvEncodeFrame() original-Change-Id: I67936f90ea714e90b3e81bc0dd1472cc713eb23a Add HCR sanity check original-Change-Id: I6c1d9732ebcf6af12f50b7641400752f74be39f7 Fix memory issue for HBE edge case with 8:3 SBR original-Change-Id: I11ea58a61e69fbe8bf75034b640baee3011e63e9 Additional SBR parametrization sanity check for ELD original-Change-Id: Ie26026fbfe174c2c7b3691f6218b5ce63e322140 Add MPEG-D DRC channel layout check original-Change-Id: Iea70a74f171b227cce636a9eac4ba662777a2f72 Additional out-of-bounds checks in MPEG-D DRC original-Change-Id: Ife4a8c3452c6fde8a0a09e941154a39a769777d4 Change-Id: Ic63cb2f628720f54fe9b572b0cb528e2599c624e
Diffstat (limited to 'libSBRdec/src/psdec_hybrid.cpp')
-rw-r--r--libSBRdec/src/psdec_hybrid.cpp652
1 files changed, 0 insertions, 652 deletions
diff --git a/libSBRdec/src/psdec_hybrid.cpp b/libSBRdec/src/psdec_hybrid.cpp
deleted file mode 100644
index cbd0e92..0000000
--- a/libSBRdec/src/psdec_hybrid.cpp
+++ /dev/null
@@ -1,652 +0,0 @@
-
-/* -----------------------------------------------------------------------------------------------------------
-Software License for The Fraunhofer FDK AAC Codec Library for Android
-
-© Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
- All rights reserved.
-
- 1. INTRODUCTION
-The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
-the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
-This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
-
-AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
-audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
-independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
-of the MPEG specifications.
-
-Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
-may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
-individually for the purpose of encoding or decoding bit streams in products that are compliant with
-the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
-these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
-software may already be covered under those patent licenses when it is used for those licensed purposes only.
-
-Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
-are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
-applications information and documentation.
-
-2. COPYRIGHT LICENSE
-
-Redistribution and use in source and binary forms, with or without modification, are permitted without
-payment of copyright license fees provided that you satisfy the following conditions:
-
-You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
-your modifications thereto in source code form.
-
-You must retain the complete text of this software license in the documentation and/or other materials
-provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
-You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
-modifications thereto to recipients of copies in binary form.
-
-The name of Fraunhofer may not be used to endorse or promote products derived from this library without
-prior written permission.
-
-You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
-software or your modifications thereto.
-
-Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
-and the date of any change. For modified versions of the FDK AAC Codec, the term
-"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
-"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
-
-3. NO PATENT LICENSE
-
-NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
-ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
-respect to this software.
-
-You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
-by appropriate patent licenses.
-
-4. DISCLAIMER
-
-This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
-"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
-of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
-CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
-including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
-or business interruption, however caused and on any theory of liability, whether in contract, strict
-liability, or tort (including negligence), arising in any way out of the use of this software, even if
-advised of the possibility of such damage.
-
-5. CONTACT INFORMATION
-
-Fraunhofer Institute for Integrated Circuits IIS
-Attention: Audio and Multimedia Departments - FDK AAC LL
-Am Wolfsmantel 33
-91058 Erlangen, Germany
-
-www.iis.fraunhofer.de/amm
-amm-info@iis.fraunhofer.de
------------------------------------------------------------------------------------------------------------ */
-
-#include "psdec_hybrid.h"
-
-
-#include "fft.h"
-#include "sbr_ram.h"
-
-#include "FDK_tools_rom.h"
-#include "sbr_rom.h"
-
-/*******************************************************************************
- Functionname: InitHybridFilterBank
- *******************************************************************************
-
- Description: Init one instance of HANDLE_HYBRID stuct
-
- Arguments:
-
- Return: none
-
-*******************************************************************************/
-
-
-SBR_ERROR
-InitHybridFilterBank ( HANDLE_HYBRID hs, /*!< Handle to HYBRID struct. */
- SCHAR frameSize, /*!< Framesize (in Qmf súbband samples). */
- SCHAR noBands, /*!< Number of Qmf bands for hybrid filtering. */
- const UCHAR *pResolution ) /*!< Resolution in Qmf bands (length noBands). */
-{
- SCHAR i;
- UCHAR maxNoChannels = 0;
-
- for (i = 0; i < noBands; i++) {
- hs->pResolution[i] = pResolution[i];
- if(pResolution[i] > maxNoChannels)
- maxNoChannels = pResolution[i];
- }
-
- hs->nQmfBands = noBands;
- hs->frameSize = frameSize;
- hs->qmfBufferMove = HYBRID_FILTER_LENGTH - 1;
-
- hs->sf_mQmfBuffer = 0;
-
- return SBRDEC_OK;
-}
-
-/*******************************************************************************
- Functionname: dualChannelFiltering
- *******************************************************************************
-
- Description: fast 2-channel real-valued filtering with 6-tap delay.
-
- Arguments:
-
- Return: none
-
-*******************************************************************************/
-
-/*!
-2 channel filter
-<pre>
- Filter Coefs:
- 0.0,
- 0.01899487526049,
- 0.0,
- -0.07293139167538,
- 0.0,
- 0.30596630545168,
- 0.5,
- 0.30596630545168,
- 0.0,
- -0.07293139167538,
- 0.0,
- 0.01899487526049,
- 0.0
-
-
- Filter design:
- h[q,n] = g[n] * cos(2pi/2 * q * (n-6) ); n = 0..12, q = 0,1;
-
- -> h[0,n] = g[n] * 1;
- -> h[1,n] = g[n] * pow(-1,n);
-</pre>
-*/
-
-static void slotBasedDualChannelFiltering( const FIXP_DBL *pQmfReal,
- const FIXP_DBL *pQmfImag,
-
- FIXP_DBL *mHybridReal,
- FIXP_DBL *mHybridImag)
-{
-
- FIXP_DBL t1, t3, t5, t6;
-
- /* symmetric filter coefficients */
-
- /* you don't have to shift the result after fMult because of p2_13_20 <= 0.5 */
- t1 = fMultDiv2(p2_13_20[1] , ( (pQmfReal[1] >> 1) + (pQmfReal[11] >> 1)));
- t3 = fMultDiv2(p2_13_20[3] , ( (pQmfReal[3] >> 1) + (pQmfReal[ 9] >> 1)));
- t5 = fMultDiv2(p2_13_20[5] , ( (pQmfReal[5] >> 1) + (pQmfReal[ 7] >> 1)));
- t6 = fMultDiv2(p2_13_20[6] , (pQmfReal[6] >> 1) );
-
- mHybridReal[0] = (t1 + t3 + t5 + t6) << 2;
- mHybridReal[1] = (- t1 - t3 - t5 + t6) << 2;
-
- t1 = fMultDiv2(p2_13_20[1] , ( (pQmfImag[1] >> 1) + (pQmfImag[11] >> 1)));
- t3 = fMultDiv2(p2_13_20[3] , ( (pQmfImag[3] >> 1) + (pQmfImag[ 9] >> 1)));
- t5 = fMultDiv2(p2_13_20[5] , ( (pQmfImag[5] >> 1) + (pQmfImag[ 7] >> 1)));
- t6 = fMultDiv2(p2_13_20[6] , pQmfImag[6] >> 1 );
-
- mHybridImag[0] = (t1 + t3 + t5 + t6) << 2;
- mHybridImag[1] = (- t1 - t3 - t5 + t6) << 2;
-}
-
-
-/*******************************************************************************
- Functionname: eightChannelFiltering
- *******************************************************************************
-
- Description: fast 8-channel complex-valued filtering with 6-tap delay.
-
- Arguments:
-
- Return: none
-
-*******************************************************************************/
-/*!
- 8 channel filter
-
- Implementation using a FFT of length 8
-<pre>
- prototype filter coefficients:
- 0.00746082949812 0.02270420949825 0.04546865930473 0.07266113929591 0.09885108575264 0.11793710567217
- 0.125
- 0.11793710567217 0.09885108575264 0.07266113929591 0.04546865930473 0.02270420949825 0.00746082949812
-
- Filter design:
- N = 13; Q = 8;
- h[q,n] = g[n] * exp(j * 2 * pi / Q * (q + .5) * (n - 6)); n = 0..(N-1), q = 0..(Q-1);
-
- Time Signal: x[t];
- Filter Bank Output
- y[q,t] = conv(x[t],h[q,t]) = conv(h[q,t],x[t]) = sum(x[k] * h[q, t - k] ) = sum(h[q, k] * x[t - k] ); k = 0..(N-1);
-
- y[q,t] = x[t - 12]*h[q, 12] + x[t - 11]*h[q, 11] + x[t - 10]*h[q, 10] + x[t - 9]*h[q, 9]
- + x[t - 8]*h[q, 8] + x[t - 7]*h[q, 7]
- + x[t - 6]*h[q, 6]
- + x[t - 5]*h[q, 5] + x[t - 4]*h[q, 4]
- + x[t - 3]*h[q, 3] + x[t - 2]*h[q, 2] + x[t - 1]*h[q, 1] + x[t - 0]*h[q, 0];
-
- h'[q, n] = h[q,(N-1)-n] = g[n] * exp(j * 2 * pi / Q * (q + .5) * (6 - n)); n = 0..(N-1), q = 0..(Q-1);
-
- y[q,t] = x[t - 12]*h'[q, 0] + x[t - 11]*h'[q, 1] + x[t - 10]*h'[q, 2] + x[t - 9]*h'[q, 3]
- + x[t - 8]*h'[q, 4] + x[t - 7]*h'[q, 5]
- + x[t - 6]*h'[q, 6]
- + x[t - 5]*h'[q, 7] + x[t - 4]*h'[q, 8]
- + x[t - 3]*h'[q, 9] + x[t - 2]*h'[q, 10] + x[t - 1]*h'[q, 11] + x[t - 0]*h'[q, 12];
-
- Try to split off FFT Modulation Term:
- FFT(x[t], q) = sum(x[t+k]*exp(-j*2*pi/N *q * k))
- c m
- Step 1: h'[q,n] = g[n] * ( exp(j * 2 * pi / 8 * .5 * (6 - n)) ) * ( exp (j * 2 * pi / 8 * q * (6 - n)) );
-
- h'[q,n] = g[n] *c[n] * m[q,n]; (see above)
- c[n] = exp( j * 2 * pi / 8 * .5 * (6 - n) );
- m[q,n] = exp( j * 2 * pi / 8 * q * (6 - n) );
-
- y[q,t] = x[t - 0]*g[0]*c[0]*m[q,0] + x[t - 1]*g[1]*c[ 1]*m[q, 1] + ...
- ... + x[t - 12]*g[2]*c[12]*m[q,12];
-
- |
- n m *exp(-j*2*pi) | n' fft
--------------------------------------------------------------------------------------------------------------------------
- 0 exp( j * 2 * pi / 8 * q * 6) -> exp(-j * 2 * pi / 8 * q * 2) | 2 exp(-j * 2 * pi / 8 * q * 0)
- 1 exp( j * 2 * pi / 8 * q * 5) -> exp(-j * 2 * pi / 8 * q * 3) | 3 exp(-j * 2 * pi / 8 * q * 1)
- 2 exp( j * 2 * pi / 8 * q * 4) -> exp(-j * 2 * pi / 8 * q * 4) | 4 exp(-j * 2 * pi / 8 * q * 2)
- 3 exp( j * 2 * pi / 8 * q * 3) -> exp(-j * 2 * pi / 8 * q * 5) | 5 exp(-j * 2 * pi / 8 * q * 3)
- 4 exp( j * 2 * pi / 8 * q * 2) -> exp(-j * 2 * pi / 8 * q * 6) | 6 exp(-j * 2 * pi / 8 * q * 4)
- 5 exp( j * 2 * pi / 8 * q * 1) -> exp(-j * 2 * pi / 8 * q * 7) | 7 exp(-j * 2 * pi / 8 * q * 5)
- 6 exp( j * 2 * pi / 8 * q * 0) | 0 exp(-j * 2 * pi / 8 * q * 6)
- 7 exp(-j * 2 * pi / 8 * q * 1) | 1 exp(-j * 2 * pi / 8 * q * 7)
- 8 exp(-j * 2 * pi / 8 * q * 2) | 2
- 9 exp(-j * 2 * pi / 8 * q * 3) | 3
- 10 exp(-j * 2 * pi / 8 * q * 4) | 4
- 11 exp(-j * 2 * pi / 8 * q * 5) | 5
- 12 exp(-j * 2 * pi / 8 * q * 6) | 6
-
-
- now use fft modulation coefficients
- m[6] = = fft[0]
- m[7] = = fft[1]
- m[8] = m[ 0] = fft[2]
- m[9] = m[ 1] = fft[3]
- m[10] = m[ 2] = fft[4]
- m[11] = m[ 3] = fft[5]
- m[12] = m[ 4] = fft[6]
- m[ 5] = fft[7]
-
- y[q,t] = ( x[t- 6]*g[ 6]*c[ 6] ) * fft[q,0] +
- ( x[t- 7]*g[ 7]*c[ 7] ) * fft[q,1] +
- ( x[t- 0]*g[ 0]*c[ 0] + x[t- 8]*g[ 8]*c[ 8] ) * fft[q,2] +
- ( x[t- 1]*g[ 1]*c[ 1] + x[t- 9]*g[ 9]*c[ 9] ) * fft[q,3] +
- ( x[t- 2]*g[ 2]*c[ 2] + x[t-10]*g[10]*c[10] ) * fft[q,4] +
- ( x[t- 3]*g[ 3]*c[ 3] + x[t-11]*g[11]*c[11] ) * fft[q,5] +
- ( x[t- 4]*g[ 4]*c[ 4] + x[t-12]*g[12]*c[12] ) * fft[q,6] +
- ( x[t- 5]*g[ 5]*c[ 5] ) * fft[q,7];
-
- pre twiddle factors c[n] = exp(j * 2 * pi / 8 * .5 * (6 - n));
- n c] | n c[n] | n c[n]
----------------------------------------------------------------------------------------------------
- 0 exp( j * 6 * pi / 8) | 1 exp( j * 5 * pi / 8) | 2 exp( j * 4 * pi / 8)
- 3 exp( j * 3 * pi / 8) | 4 exp( j * 2 * pi / 8) | 5 exp( j * 1 * pi / 8)
- 6 exp( j * 0 * pi / 8) | 7 exp(-j * 1 * pi / 8) | 8 exp(-j * 2 * pi / 8)
- 9 exp(-j * 3 * pi / 8) | 10 exp(-j * 4 * pi / 8) | 11 exp(-j * 5 * pi / 8)
- 12 exp(-j * 6 * pi / 8) | |
-</pre>
-*/
-
-/* defining rotation factors for *ChannelFiltering */
-
-#define cos0Pi FL2FXCONST_DBL( 1.f)
-#define sin0Pi FL2FXCONST_DBL( 0.f)
-
-#define cos1Pi FL2FXCONST_DBL(-1.f)
-#define sin1Pi FL2FXCONST_DBL( 0.f)
-
-#define cos1Pi_2 FL2FXCONST_DBL( 0.f)
-#define sin1Pi_2 FL2FXCONST_DBL( 1.f)
-
-#define cos1Pi_3 FL2FXCONST_DBL( 0.5f)
-#define sin1Pi_3 FL2FXCONST_DBL( 0.86602540378444f)
-
-#define cos0Pi_4 cos0Pi
-#define cos1Pi_4 FL2FXCONST_DBL(0.70710678118655f)
-#define cos2Pi_4 cos1Pi_2
-#define cos3Pi_4 (-cos1Pi_4)
-#define cos4Pi_4 (-cos0Pi_4)
-#define cos5Pi_4 cos3Pi_4
-#define cos6Pi_4 cos2Pi_4
-
-#define sin0Pi_4 sin0Pi
-#define sin1Pi_4 FL2FXCONST_DBL(0.70710678118655f)
-#define sin2Pi_4 sin1Pi_2
-#define sin3Pi_4 sin1Pi_4
-#define sin4Pi_4 sin0Pi_4
-#define sin5Pi_4 (-sin3Pi_4)
-#define sin6Pi_4 (-sin2Pi_4)
-
-#define cos0Pi_8 cos0Pi
-#define cos1Pi_8 FL2FXCONST_DBL(0.92387953251129f)
-#define cos2Pi_8 cos1Pi_4
-#define cos3Pi_8 FL2FXCONST_DBL(0.38268343236509f)
-#define cos4Pi_8 cos2Pi_4
-#define cos5Pi_8 (-cos3Pi_8)
-#define cos6Pi_8 (-cos2Pi_8)
-
-#define sin0Pi_8 sin0Pi
-#define sin1Pi_8 cos3Pi_8
-#define sin2Pi_8 sin1Pi_4
-#define sin3Pi_8 cos1Pi_8
-#define sin4Pi_8 sin2Pi_4
-#define sin5Pi_8 sin3Pi_8
-#define sin6Pi_8 sin1Pi_4
-
-#if defined(ARCH_PREFER_MULT_32x16)
- #define FIXP_HYB FIXP_SGL
- #define FIXP_CAST FX_DBL2FX_SGL
-#else
- #define FIXP_HYB FIXP_DBL
- #define FIXP_CAST
-#endif
-
-static const FIXP_HYB cr[13] =
-{
- FIXP_CAST(cos6Pi_8), FIXP_CAST(cos5Pi_8), FIXP_CAST(cos4Pi_8),
- FIXP_CAST(cos3Pi_8), FIXP_CAST(cos2Pi_8), FIXP_CAST(cos1Pi_8),
- FIXP_CAST(cos0Pi_8),
- FIXP_CAST(cos1Pi_8), FIXP_CAST(cos2Pi_8), FIXP_CAST(cos3Pi_8),
- FIXP_CAST(cos4Pi_8), FIXP_CAST(cos5Pi_8), FIXP_CAST(cos6Pi_8)
-};
-
-static const FIXP_HYB ci[13] =
-{
- FIXP_CAST( sin6Pi_8), FIXP_CAST( sin5Pi_8), FIXP_CAST( sin4Pi_8),
- FIXP_CAST( sin3Pi_8), FIXP_CAST( sin2Pi_8), FIXP_CAST( sin1Pi_8),
- FIXP_CAST( sin0Pi_8) ,
- FIXP_CAST(-sin1Pi_8), FIXP_CAST(-sin2Pi_8), FIXP_CAST(-sin3Pi_8),
- FIXP_CAST(-sin4Pi_8), FIXP_CAST(-sin5Pi_8), FIXP_CAST(-sin6Pi_8)
-};
-
-static void slotBasedEightChannelFiltering( const FIXP_DBL *pQmfReal,
- const FIXP_DBL *pQmfImag,
-
- FIXP_DBL *mHybridReal,
- FIXP_DBL *mHybridImag)
-{
-
- int bin;
- FIXP_DBL _fft[128 + ALIGNMENT_DEFAULT - 1];
- FIXP_DBL *fft = (FIXP_DBL *)ALIGN_PTR(_fft);
-
-#if defined(ARCH_PREFER_MULT_32x16)
- const FIXP_SGL *p = p8_13_20; /* BASELINE_PS */
-#else
- const FIXP_DBL *p = p8_13_20; /* BASELINE_PS */
-#endif
-
- /* pre twiddeling */
-
- /* x*(a*b + c*d) = fMultDiv2(x, fMultAddDiv2(fMultDiv2(a, b), c, d)) */
- /* x*(a*b - c*d) = fMultDiv2(x, fMultSubDiv2(fMultDiv2(a, b), c, d)) */
- FIXP_DBL accu1, accu2, accu3, accu4;
-
- #define TWIDDLE_1(n_0,n_1,n_2) \
- cplxMultDiv2(&accu1, &accu2, pQmfReal[n_0], pQmfImag[n_0], cr[n_0], ci[n_0]); \
- accu1 = fMultDiv2(p[n_0], accu1); \
- accu2 = fMultDiv2(p[n_0], accu2); \
- cplxMultDiv2(&accu3, &accu4, pQmfReal[n_1], pQmfImag[n_1], cr[n_1], ci[n_1]); \
- accu3 = fMultDiv2(p[n_1], accu3); \
- accu4 = fMultDiv2(p[n_1], accu4); \
- fft[FIXP_FFT_IDX_R(n_2)] = accu1 + accu3; \
- fft[FIXP_FFT_IDX_I(n_2)] = accu2 + accu4;
-
- #define TWIDDLE_0(n_0,n_1) \
- cplxMultDiv2(&accu1, &accu2, pQmfReal[n_0], pQmfImag[n_0], cr[n_0], ci[n_0]); \
- fft[FIXP_FFT_IDX_R(n_1)] = fMultDiv2(p[n_0], accu1); \
- fft[FIXP_FFT_IDX_I(n_1)] = fMultDiv2(p[n_0], accu2);
-
- TWIDDLE_0( 6, 0)
- TWIDDLE_0( 7, 1)
-
- TWIDDLE_1( 0, 8, 2)
- TWIDDLE_1( 1, 9, 3)
- TWIDDLE_1( 2,10, 4)
- TWIDDLE_1( 3,11, 5)
- TWIDDLE_1( 4,12, 6)
-
- TWIDDLE_0( 5, 7)
-
- fft_8 (fft);
-
- /* resort fft data into output array*/
- for(bin=0; bin<8;bin++ ) {
- mHybridReal[bin] = fft[FIXP_FFT_IDX_R(bin)] << 4;
- mHybridImag[bin] = fft[FIXP_FFT_IDX_I(bin)] << 4;
- }
-}
-
-
-/*******************************************************************************
- Functionname: fillHybridDelayLine
- *******************************************************************************
-
- Description: The delay line of the hybrid filter is filled and copied from
- left to right.
-
- Return: none
-
-*******************************************************************************/
-
-void
-fillHybridDelayLine( FIXP_DBL **fixpQmfReal, /*!< Qmf real Values */
- FIXP_DBL **fixpQmfImag, /*!< Qmf imag Values */
- FIXP_DBL fixpHybridLeftR[12], /*!< Hybrid real Values left channel */
- FIXP_DBL fixpHybridLeftI[12], /*!< Hybrid imag Values left channel */
- FIXP_DBL fixpHybridRightR[12], /*!< Hybrid real Values right channel */
- FIXP_DBL fixpHybridRightI[12], /*!< Hybrid imag Values right channel */
- HANDLE_HYBRID hHybrid )
-{
- int i;
-
- for (i = 0; i < HYBRID_FILTER_DELAY; i++) {
- slotBasedHybridAnalysis ( fixpQmfReal[i],
- fixpQmfReal[i],
- fixpHybridLeftR,
- fixpHybridLeftI,
- hHybrid );
- }
-
- FDKmemcpy(fixpHybridRightR, fixpHybridLeftR, sizeof(FIXP_DBL)*NO_SUB_QMF_CHANNELS);
- FDKmemcpy(fixpHybridRightI, fixpHybridLeftI, sizeof(FIXP_DBL)*NO_SUB_QMF_CHANNELS);
-}
-
-
-/*******************************************************************************
- Functionname: slotBasedHybridAnalysis
- *******************************************************************************
-
- Description: The lower QMF subbands are further split to provide better
- frequency resolution for PS processing.
-
- Return: none
-
-*******************************************************************************/
-
-
-void
-slotBasedHybridAnalysis ( FIXP_DBL *fixpQmfReal, /*!< Qmf real Values */
- FIXP_DBL *fixpQmfImag, /*!< Qmf imag Values */
-
- FIXP_DBL fixpHybridReal[12], /*!< Hybrid real Values */
- FIXP_DBL fixpHybridImag[12], /*!< Hybrid imag Values */
-
- HANDLE_HYBRID hHybrid)
-{
- int k, band;
- HYBRID_RES hybridRes;
- int chOffset = 0;
-
- C_ALLOC_SCRATCH_START(pTempRealSlot, FIXP_DBL, 4*HYBRID_FILTER_LENGTH);
-
- FIXP_DBL *pTempImagSlot = pTempRealSlot + HYBRID_FILTER_LENGTH;
- FIXP_DBL *pWorkRealSlot = pTempImagSlot + HYBRID_FILTER_LENGTH;
- FIXP_DBL *pWorkImagSlot = pWorkRealSlot + HYBRID_FILTER_LENGTH;
-
- /*!
- Hybrid filtering is applied to the first hHybrid->nQmfBands QMF bands (3 when 10 or 20 stereo bands
- are used, 5 when 34 stereo bands are used). For the remaining QMF bands a delay would be necessary.
- But there is no need to implement a delay because there is a look-ahead of HYBRID_FILTER_DELAY = 6
- QMF samples in the low-band buffer.
- */
-
- for(band = 0; band < hHybrid->nQmfBands; band++) {
-
- /* get hybrid resolution per qmf band */
- /* in case of baseline ps 10/20 band stereo mode : */
- /* */
- /* qmfBand[0] : 8 ( HYBRID_8_CPLX ) */
- /* qmfBand[1] : 2 ( HYBRID_2_REAL ) */
- /* qmfBand[2] : 2 ( HYBRID_2_REAL ) */
- /* */
- /* (split the 3 lower qmf band to 12 hybrid bands) */
-
- hybridRes = (HYBRID_RES)hHybrid->pResolution[band];
-
- FDKmemcpy(pWorkRealSlot, hHybrid->mQmfBufferRealSlot[band], hHybrid->qmfBufferMove * sizeof(FIXP_DBL));
- FDKmemcpy(pWorkImagSlot, hHybrid->mQmfBufferImagSlot[band], hHybrid->qmfBufferMove * sizeof(FIXP_DBL));
-
- pWorkRealSlot[hHybrid->qmfBufferMove] = fixpQmfReal[band];
- pWorkImagSlot[hHybrid->qmfBufferMove] = fixpQmfImag[band];
-
- FDKmemcpy(hHybrid->mQmfBufferRealSlot[band], pWorkRealSlot + 1, hHybrid->qmfBufferMove * sizeof(FIXP_DBL));
- FDKmemcpy(hHybrid->mQmfBufferImagSlot[band], pWorkImagSlot + 1, hHybrid->qmfBufferMove * sizeof(FIXP_DBL));
-
- if (fixpQmfReal) {
-
- /* actual filtering only if output signal requested */
- switch( hybridRes ) {
-
- /* HYBRID_2_REAL & HYBRID_8_CPLX are only needful for baseline ps */
- case HYBRID_2_REAL:
-
- slotBasedDualChannelFiltering( pWorkRealSlot,
- pWorkImagSlot,
- pTempRealSlot,
- pTempImagSlot);
- break;
-
- case HYBRID_8_CPLX:
-
- slotBasedEightChannelFiltering( pWorkRealSlot,
- pWorkImagSlot,
- pTempRealSlot,
- pTempImagSlot);
- break;
-
- default:
- FDK_ASSERT(0);
- }
-
- for(k = 0; k < (SCHAR)hybridRes; k++) {
- fixpHybridReal [chOffset + k] = pTempRealSlot[k];
- fixpHybridImag [chOffset + k] = pTempImagSlot[k];
- }
- chOffset += hybridRes;
- } /* if (mHybridReal) */
- }
-
- /* group hybrid channels 3+4 -> 3 and 2+5 -> 2 */
- fixpHybridReal[3] += fixpHybridReal[4];
- fixpHybridImag[3] += fixpHybridImag[4];
- fixpHybridReal[4] = (FIXP_DBL)0;
- fixpHybridImag[4] = (FIXP_DBL)0;
-
- fixpHybridReal[2] += fixpHybridReal[5];
- fixpHybridImag[2] += fixpHybridImag[5];
- fixpHybridReal[5] = (FIXP_DBL)0;
- fixpHybridImag[5] = (FIXP_DBL)0;
-
- /* free memory on scratch */
- C_ALLOC_SCRATCH_END(pTempRealSlot, FIXP_DBL, 4*HYBRID_FILTER_LENGTH);
-
-}
-
-
-/*******************************************************************************
- Functionname: slotBasedHybridSynthesis
- *******************************************************************************
-
- Description: The coefficients offering higher resolution for the lower QMF
- channel are simply added prior to the synthesis with the 54
- subbands QMF.
-
- Arguments:
-
- Return: none
-
-*******************************************************************************/
-
-/*! <pre>
- l,r0(n) ---\
- l,r1(n) ---- + --\
- l,r2(n) ---/ \
- + --> F0(w)
- l,r3(n) ---\ /
- l,r4(n) ---- + --/
- l,r5(n) ---/
-
-
- l,r6(n) ---\
- + ---------> F1(w)
- l,r7(n) ---/
-
-
- l,r8(n) ---\
- + ---------> F2(w)
- l,r9(n) ---/
-
- </pre>
- Hybrid QMF synthesis filterbank for the 10 and 20 stereo-bands configurations. The
- coefficients offering higher resolution for the lower QMF channel are simply added
- prior to the synthesis with the 54 subbands QMF.
-
- [see ISO/IEC 14496-3:2001/FDAM 2:2004(E) - Page 52]
-*/
-
-
-void
-slotBasedHybridSynthesis ( FIXP_DBL *fixpHybridReal, /*!< Hybrid real Values */
- FIXP_DBL *fixpHybridImag, /*!< Hybrid imag Values */
- FIXP_DBL *fixpQmfReal, /*!< Qmf real Values */
- FIXP_DBL *fixpQmfImag, /*!< Qmf imag Values */
- HANDLE_HYBRID hHybrid ) /*!< Handle to HYBRID struct. */
-{
- int k, band;
-
- HYBRID_RES hybridRes;
- int chOffset = 0;
-
- for(band = 0; band < hHybrid->nQmfBands; band++) {
-
- FIXP_DBL qmfReal = FL2FXCONST_DBL(0.f);
- FIXP_DBL qmfImag = FL2FXCONST_DBL(0.f);
- hybridRes = (HYBRID_RES)hHybrid->pResolution[band];
-
- for(k = 0; k < (SCHAR)hybridRes; k++) {
- qmfReal += fixpHybridReal[chOffset + k];
- qmfImag += fixpHybridImag[chOffset + k];
- }
-
- fixpQmfReal[band] = qmfReal;
- fixpQmfImag[band] = qmfImag;
-
- chOffset += hybridRes;
- }
-}
-
-
-