Run fullband processing at output rate on ARM
The audio processing in the band-split domain on ARM platforms operate at a sampling frequency of 32 kHz. This CL upsamples the signal to fullband before the "fullband processing" if an output rate of 48 kHz is chosen. Change-Id: I268acd33aff1fcfa4f75ba8c0fb3e16abb9f74e8 Bug: b/130016532 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/155640 Commit-Queue: Gustaf Ullberg <gustaf@webrtc.org> Reviewed-by: Per Åhgren <peah@webrtc.org> Cr-Commit-Position: refs/heads/master@{#29415}
This commit is contained in:
committed by
Commit Bot
parent
1d3008bfc6
commit
422b9e0982
@ -10,6 +10,7 @@
|
||||
|
||||
#include "modules/audio_processing/audio_buffer.h"
|
||||
|
||||
#include <cmath>
|
||||
#include "test/gtest.h"
|
||||
|
||||
namespace webrtc {
|
||||
@ -44,4 +45,47 @@ TEST(AudioBufferTest, SetNumChannelsDeathTest) {
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST(AudioBufferTest, CopyWithoutResampling) {
|
||||
AudioBuffer ab1(32000, 2, 32000, 2, 32000, 2);
|
||||
AudioBuffer ab2(32000, 2, 32000, 2, 32000, 2);
|
||||
// Fill first buffer.
|
||||
for (size_t ch = 0; ch < ab1.num_channels(); ++ch) {
|
||||
for (size_t i = 0; i < ab1.num_frames(); ++i) {
|
||||
ab1.channels()[ch][i] = i + ch;
|
||||
}
|
||||
}
|
||||
// Copy to second buffer.
|
||||
ab1.CopyTo(&ab2);
|
||||
// Verify content of second buffer.
|
||||
for (size_t ch = 0; ch < ab2.num_channels(); ++ch) {
|
||||
for (size_t i = 0; i < ab2.num_frames(); ++i) {
|
||||
EXPECT_EQ(ab2.channels()[ch][i], i + ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(AudioBufferTest, CopyWithResampling) {
|
||||
AudioBuffer ab1(32000, 2, 32000, 2, 48000, 2);
|
||||
AudioBuffer ab2(48000, 2, 48000, 2, 48000, 2);
|
||||
float energy_ab1 = 0.f;
|
||||
float energy_ab2 = 0.f;
|
||||
const float pi = std::acos(-1.f);
|
||||
// Put a sine and compute energy of first buffer.
|
||||
for (size_t ch = 0; ch < ab1.num_channels(); ++ch) {
|
||||
for (size_t i = 0; i < ab1.num_frames(); ++i) {
|
||||
ab1.channels()[ch][i] = std::sin(2 * pi * 100.f / 32000.f * i);
|
||||
energy_ab1 += ab1.channels()[ch][i] * ab1.channels()[ch][i];
|
||||
}
|
||||
}
|
||||
// Copy to second buffer.
|
||||
ab1.CopyTo(&ab2);
|
||||
// Compute energy of second buffer.
|
||||
for (size_t ch = 0; ch < ab2.num_channels(); ++ch) {
|
||||
for (size_t i = 0; i < ab2.num_frames(); ++i) {
|
||||
energy_ab2 += ab2.channels()[ch][i] * ab2.channels()[ch][i];
|
||||
}
|
||||
}
|
||||
// Verify that energies match.
|
||||
EXPECT_NEAR(energy_ab1, energy_ab2 * 32000.f / 48000.f, .01f * energy_ab1);
|
||||
}
|
||||
} // namespace webrtc
|
||||
|
||||
Reference in New Issue
Block a user