Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: webrtc/modules/audio_coding/codecs/cng/webrtc_cng.cc

Issue 2519873003: ComfortNoise: Calculate used scale factor in Q13 (Closed)
Patch Set: One more comment. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h" 11 #include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h"
12 12
13 #include <algorithm> 13 #include <algorithm>
14 14
15 #include "webrtc/base/safe_conversions.h"
15 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h" 16 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h"
16 17
17 namespace webrtc { 18 namespace webrtc {
18 19
19 namespace { 20 namespace {
20 21
21 const size_t kCngMaxOutsizeOrder = 640; 22 const size_t kCngMaxOutsizeOrder = 640;
22 23
23 // TODO(ossu): Rename the left-over WebRtcCng according to style guide. 24 // TODO(ossu): Rename the left-over WebRtcCng according to style guide.
24 void WebRtcCng_K2a16(int16_t* k, int useOrder, int16_t* a); 25 void WebRtcCng_K2a16(int16_t* k, int useOrder, int16_t* a);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 112
112 bool ComfortNoiseDecoder::Generate(rtc::ArrayView<int16_t> out_data, 113 bool ComfortNoiseDecoder::Generate(rtc::ArrayView<int16_t> out_data,
113 bool new_period) { 114 bool new_period) {
114 int16_t excitation[kCngMaxOutsizeOrder]; 115 int16_t excitation[kCngMaxOutsizeOrder];
115 int16_t low[kCngMaxOutsizeOrder]; 116 int16_t low[kCngMaxOutsizeOrder];
116 int16_t lpPoly[WEBRTC_CNG_MAX_LPC_ORDER + 1]; 117 int16_t lpPoly[WEBRTC_CNG_MAX_LPC_ORDER + 1];
117 int16_t ReflBetaStd = 26214; /* 0.8 in q15. */ 118 int16_t ReflBetaStd = 26214; /* 0.8 in q15. */
118 int16_t ReflBetaCompStd = 6553; /* 0.2 in q15. */ 119 int16_t ReflBetaCompStd = 6553; /* 0.2 in q15. */
119 int16_t ReflBetaNewP = 19661; /* 0.6 in q15. */ 120 int16_t ReflBetaNewP = 19661; /* 0.6 in q15. */
120 int16_t ReflBetaCompNewP = 13107; /* 0.4 in q15. */ 121 int16_t ReflBetaCompNewP = 13107; /* 0.4 in q15. */
121 int16_t Beta, BetaC, tmp1, tmp2, tmp3; 122 int16_t Beta, BetaC; /* These are in Q15. */
122 int32_t targetEnergy; 123 int32_t targetEnergy;
123 int16_t En; 124 int16_t En;
124 int16_t temp16; 125 int16_t temp16;
125 const size_t num_samples = out_data.size(); 126 const size_t num_samples = out_data.size();
126 127
127 if (num_samples > kCngMaxOutsizeOrder) { 128 if (num_samples > kCngMaxOutsizeOrder) {
128 return false; 129 return false;
129 } 130 }
130 131
131 if (new_period) { 132 if (new_period) {
132 dec_used_scale_factor_ = dec_target_scale_factor_; 133 dec_used_scale_factor_ = dec_target_scale_factor_;
133 Beta = ReflBetaNewP; 134 Beta = ReflBetaNewP;
134 BetaC = ReflBetaCompNewP; 135 BetaC = ReflBetaCompNewP;
135 } else { 136 } else {
136 Beta = ReflBetaStd; 137 Beta = ReflBetaStd;
137 BetaC = ReflBetaCompStd; 138 BetaC = ReflBetaCompStd;
138 } 139 }
139 140
140 /* Here we use a 0.5 weighting, should possibly be modified to 0.6. */ 141 /* Calculate new scale factor in Q13 */
141 tmp1 = dec_used_scale_factor_ << 2; /* Q13->Q15 */ 142 dec_used_scale_factor_ =
142 tmp2 = dec_target_scale_factor_ << 2; /* Q13->Q15 */ 143 rtc::checked_cast<int16_t>(
143 tmp3 = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(tmp1, Beta, 15); 144 WEBRTC_SPL_MUL_16_16_RSFT(dec_used_scale_factor_, Beta >> 2, 13) +
144 tmp3 += (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(tmp2, BetaC, 15); 145 WEBRTC_SPL_MUL_16_16_RSFT(dec_target_scale_factor_, BetaC >> 2, 13));
145 dec_used_scale_factor_ = tmp3 >> 2; /* Q15->Q13 */
146 146
147 dec_used_energy_ = dec_used_energy_ >> 1; 147 dec_used_energy_ = dec_used_energy_ >> 1;
148 dec_used_energy_ += dec_target_energy_ >> 1; 148 dec_used_energy_ += dec_target_energy_ >> 1;
149 149
150 /* Do the same for the reflection coeffs. */ 150 /* Do the same for the reflection coeffs, albeit in Q15. */
151 for (size_t i = 0; i < WEBRTC_CNG_MAX_LPC_ORDER; i++) { 151 for (size_t i = 0; i < WEBRTC_CNG_MAX_LPC_ORDER; i++) {
152 dec_used_reflCoefs_[i] = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT( 152 dec_used_reflCoefs_[i] = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(
153 dec_used_reflCoefs_[i], Beta, 15); 153 dec_used_reflCoefs_[i], Beta, 15);
154 dec_used_reflCoefs_[i] += (int16_t) WEBRTC_SPL_MUL_16_16_RSFT( 154 dec_used_reflCoefs_[i] += (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(
155 dec_target_reflCoefs_[i], BetaC, 15); 155 dec_target_reflCoefs_[i], BetaC, 15);
156 } 156 }
157 157
158 /* Compute the polynomial coefficients. */ 158 /* Compute the polynomial coefficients. */
159 WebRtcCng_K2a16(dec_used_reflCoefs_, WEBRTC_CNG_MAX_LPC_ORDER, lpPoly); 159 WebRtcCng_K2a16(dec_used_reflCoefs_, WEBRTC_CNG_MAX_LPC_ORDER, lpPoly);
160 160
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 anyptr = any; 433 anyptr = any;
434 for (i = 0; i < (m + 2); i++) { 434 for (i = 0; i < (m + 2); i++) {
435 *aptr++ = *anyptr++; 435 *aptr++ = *anyptr++;
436 } 436 }
437 } 437 }
438 } 438 }
439 439
440 } // namespace 440 } // namespace
441 441
442 } // namespace webrtc 442 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698