-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow the RTP level indicator computation to work at any sample rate.
Break out the computation to a separate class, and call directly into this from channel.cc rather than going through AudioProcessing. This circumvents AudioProcessing's sample rate limitations. We now compute the RMS over all samples rather than downmixing to a single channel. This makes the call point in channel.cc easier, is more "correct" and should have similar (negligible) complexity. This caused slight changes in the RMS output, so the ApmTest.Process reference has been updated. Snippet of the failing output: [ RUN ] ApmTest.Process Running test 4 of 12... Value of: rms_level Actual: 27 Expected: test->rms_level() Which is: 28 Running test 5 of 12... Value of: rms_level Actual: 26 Expected: test->rms_level() Which is: 27 Running test 6 of 12... Value of: rms_level Actual: 26 Expected: test->rms_level() Which is: 27 Running test 10 of 12... Value of: rms_level Actual: 27 Expected: test->rms_level() Which is: 28 Running test 11 of 12... Value of: rms_level Actual: 26 Expected: test->rms_level() Which is: 27 Running test 12 of 12... Value of: rms_level Actual: 26 Expected: test->rms_level() Which is: 27 BUG=3290 TESTED=Chrome assert is avoided and both voe_cmd_test and apprtc produce reasonable printed out results from RMS(). R=bjornv@webrtc.org Review URL: https://webrtc-codereview.appspot.com/16459004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6056 4adac7df-926f-26a2-2b94-8c16560cd09d
- Loading branch information
andrew@webrtc.org
committed
May 5, 2014
1 parent
a0edf4c
commit 382c0c2
Showing
9 changed files
with
147 additions
and
126 deletions.
There are no files selected for viewing
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/* | ||
* Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | ||
* | ||
* Use of this source code is governed by a BSD-style license | ||
* that can be found in the LICENSE file in the root of the source | ||
* tree. An additional intellectual property rights grant can be found | ||
* in the file PATENTS. All contributing project authors may | ||
* be found in the AUTHORS file in the root of the source tree. | ||
*/ | ||
|
||
#include "webrtc/modules/audio_processing/rms_level.h" | ||
|
||
#include <assert.h> | ||
#include <math.h> | ||
|
||
namespace webrtc { | ||
|
||
static const float kMaxSquaredLevel = 32768.0 * 32768.0; | ||
|
||
RMSLevel::RMSLevel() | ||
: sum_square_(0.0), | ||
sample_count_(0) {} | ||
|
||
RMSLevel::~RMSLevel() {} | ||
|
||
void RMSLevel::Reset() { | ||
sum_square_ = 0.0; | ||
sample_count_ = 0; | ||
} | ||
|
||
void RMSLevel::Process(const int16_t* data, int length) { | ||
for (int i = 0; i < length; ++i) { | ||
sum_square_ += data[i] * data[i]; | ||
} | ||
sample_count_ += length; | ||
} | ||
|
||
void RMSLevel::ProcessMuted(int length) { | ||
sample_count_ += length; | ||
} | ||
|
||
int RMSLevel::RMS() { | ||
if (sample_count_ == 0 || sum_square_ == 0.0) { | ||
Reset(); | ||
return kMinLevel; | ||
} | ||
|
||
// Normalize by the max level. | ||
float rms = sum_square_ / (sample_count_ * kMaxSquaredLevel); | ||
// 20log_10(x^0.5) = 10log_10(x) | ||
rms = 10 * log10(rms); | ||
assert(rms <= 0); | ||
if (rms < -kMinLevel) | ||
rms = -kMinLevel; | ||
|
||
rms = -rms; | ||
Reset(); | ||
return static_cast<int>(rms + 0.5); | ||
} | ||
|
||
} // namespace webrtc |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
/* | ||
* Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | ||
* | ||
* Use of this source code is governed by a BSD-style license | ||
* that can be found in the LICENSE file in the root of the source | ||
* tree. An additional intellectual property rights grant can be found | ||
* in the file PATENTS. All contributing project authors may | ||
* be found in the AUTHORS file in the root of the source tree. | ||
*/ | ||
|
||
#include "webrtc/typedefs.h" | ||
|
||
namespace webrtc { | ||
|
||
// Computes the root mean square (RMS) level in dBFs (decibels from digital | ||
// full-scale) of audio data. The computation follows RFC 6465: | ||
// https://tools.ietf.org/html/rfc6465 | ||
// with the intent that it can provide the RTP audio level indication. | ||
// | ||
// The expected approach is to provide constant-sized chunks of audio to | ||
// Process(). When enough chunks have been accumulated to form a packet, call | ||
// RMS() to get the audio level indicator for the RTP header. | ||
class RMSLevel { | ||
public: | ||
static const int kMinLevel = 127; | ||
|
||
RMSLevel(); | ||
~RMSLevel(); | ||
|
||
// Can be called to reset internal states, but is not required during normal | ||
// operation. | ||
void Reset(); | ||
|
||
// Pass each chunk of audio to Process() to accumulate the level. | ||
void Process(const int16_t* data, int length); | ||
|
||
// If all samples with the given |length| have a magnitude of zero, this is | ||
// a shortcut to avoid some computation. | ||
void ProcessMuted(int length); | ||
|
||
// Computes the RMS level over all data passed to Process() since the last | ||
// call to RMS(). The returned value is positive but should be interpreted as | ||
// negative as per the RFC. It is constrained to [0, 127]. | ||
int RMS(); | ||
|
||
private: | ||
float sum_square_; | ||
int sample_count_; | ||
}; | ||
|
||
} // namespace webrtc |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters