aboutsummaryrefslogtreecommitdiffstats
path: root/fdk-aac/libSBRdec/src/env_calc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'fdk-aac/libSBRdec/src/env_calc.cpp')
-rw-r--r--fdk-aac/libSBRdec/src/env_calc.cpp76
1 files changed, 35 insertions, 41 deletions
diff --git a/fdk-aac/libSBRdec/src/env_calc.cpp b/fdk-aac/libSBRdec/src/env_calc.cpp
index cb1474f..1242833 100644
--- a/fdk-aac/libSBRdec/src/env_calc.cpp
+++ b/fdk-aac/libSBRdec/src/env_calc.cpp
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
@@ -493,7 +493,7 @@ static void mapSineFlags(
}
}
-#define INTER_TES_SF_CHANGE 3
+#define INTER_TES_SF_CHANGE 4
typedef struct {
FIXP_DBL subsample_power_low[(((1024) / (32) * (4) / 2) + (3 * (4)))];
@@ -2325,7 +2325,15 @@ static void calcSubbandGain(
}
/* gain = nrgRef / B */
- FDK_divide_MantExp(nrgRef, nrgRef_e, b, b_e, ptrNrgGain, ptrNrgGain_e);
+ INT result_exp = 0;
+ *ptrNrgGain = fDivNorm(nrgRef, b, &result_exp);
+ *ptrNrgGain_e = (SCHAR)result_exp + (nrgRef_e - b_e);
+
+ /* There could be a one bit diffs. This is important to compensate,
+ because later in the code values are compared by exponent only. */
+ int headroom = CountLeadingBits(*ptrNrgGain);
+ *ptrNrgGain <<= headroom;
+ *ptrNrgGain_e -= headroom;
}
}
@@ -2431,8 +2439,7 @@ static void adjustTimeSlot_EldGrid(
sbNoise = *pNoiseLevel++;
if (((INT)sineLevel_curr | noNoiseFlag) == 0) {
signalReal +=
- (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise)
- << 4);
+ fMult(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise);
}
signalReal += sineLevel_curr * p_harmonicPhase[0];
signalReal =
@@ -2466,8 +2473,7 @@ static void adjustTimeSlot_EldGrid(
sbNoise = *pNoiseLevel++;
if (((INT)sineLevel_curr | noNoiseFlag) == 0) {
signalReal +=
- (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise)
- << 4);
+ fMult(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise);
}
signalReal += sineLevel_curr * p_harmonicPhase[0];
*ptrReal++ = signalReal;
@@ -2527,8 +2533,7 @@ static void adjustTimeSlotLC(
else if (!noNoiseFlag)
/* Add noisefloor to the amplified signal */
signalReal +=
- (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])
- << 4);
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]);
{
if (!(harmIndex & 0x1)) {
@@ -2575,9 +2580,8 @@ static void adjustTimeSlotLC(
!noNoiseFlag) {
/* Add noisefloor to the amplified signal */
index &= (SBR_NF_NO_RANDOM_VAL - 1);
- signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0],
- pNoiseLevel[0])
- << 4);
+ signalReal +=
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]);
}
/* The next multiplication constitutes the actual envelope adjustment of
@@ -2602,9 +2606,8 @@ static void adjustTimeSlotLC(
else if (!noNoiseFlag) {
/* Add noisefloor to the amplified signal */
index &= (SBR_NF_NO_RANDOM_VAL - 1);
- signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0],
- pNoiseLevel[0])
- << 4);
+ signalReal +=
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]);
}
pNoiseLevel++;
@@ -2633,10 +2636,8 @@ static void adjustTimeSlotLC(
else if (!noNoiseFlag) {
/* Add noisefloor to the amplified signal */
index &= (SBR_NF_NO_RANDOM_VAL - 1);
- signalReal =
- signalReal +
- (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])
- << 4);
+ signalReal = signalReal + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0],
+ pNoiseLevel[0]);
}
if (!(harmIndex & 0x1)) {
@@ -2741,11 +2742,9 @@ static void adjustTimeSlotHQ_GainAndNoise(
/* Add noisefloor to the amplified signal */
index &= (SBR_NF_NO_RANDOM_VAL - 1);
noiseReal =
- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise)
- << 4;
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
noiseImag =
- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise)
- << 4;
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
*ptrReal++ = (signalReal + noiseReal);
*ptrImag++ = (signalImag + noiseImag);
}
@@ -2763,13 +2762,12 @@ static void adjustTimeSlotHQ_GainAndNoise(
smoothedNoise = noiseLevel[k];
index &= (SBR_NF_NO_RANDOM_VAL - 1);
noiseReal =
- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
noiseImag =
- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
- /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */
- signalReal += noiseReal << 4;
- signalImag += noiseImag << 4;
+ signalReal += noiseReal;
+ signalImag += noiseImag;
}
*ptrReal++ = signalReal;
*ptrImag++ = signalImag;
@@ -2944,13 +2942,10 @@ static void adjustTimeSlotHQ(
} else {
/* Add noisefloor to the amplified signal */
index &= (SBR_NF_NO_RANDOM_VAL - 1);
- /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */
noiseReal =
- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise)
- << 4;
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
noiseImag =
- fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise)
- << 4;
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
*ptrReal++ = (signalReal + noiseReal);
*ptrImag++ = (signalImag + noiseImag);
}
@@ -2992,14 +2987,13 @@ static void adjustTimeSlotHQ(
/* Add noisefloor to the amplified signal */
smoothedNoise = noiseLevel[k];
index &= (SBR_NF_NO_RANDOM_VAL - 1);
- noiseReal = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0],
- smoothedNoise);
- noiseImag = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1],
- smoothedNoise);
-
- /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */
- signalReal += noiseReal << 4;
- signalImag += noiseImag << 4;
+ noiseReal =
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
+ noiseImag =
+ fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
+
+ signalReal += noiseReal;
+ signalImag += noiseImag;
}
}
*ptrReal++ = signalReal;