| OLD | NEW |
| 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 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 PushResampler<int16_t> resampler_; | 40 PushResampler<int16_t> resampler_; |
| 41 AudioFrame src_frame_; | 41 AudioFrame src_frame_; |
| 42 AudioFrame dst_frame_; | 42 AudioFrame dst_frame_; |
| 43 AudioFrame golden_frame_; | 43 AudioFrame golden_frame_; |
| 44 }; | 44 }; |
| 45 | 45 |
| 46 // Sets the signal value to increase by |data| with every sample. Floats are | 46 // Sets the signal value to increase by |data| with every sample. Floats are |
| 47 // used so non-integer values result in rounding error, but not an accumulating | 47 // used so non-integer values result in rounding error, but not an accumulating |
| 48 // error. | 48 // error. |
| 49 void SetMonoFrame(float data, int sample_rate_hz, AudioFrame* frame) { | 49 void SetMonoFrame(float data, int sample_rate_hz, AudioFrame* frame) { |
| 50 memset(frame->data_, 0, sizeof(frame->data_)); | 50 frame->Mute(); |
| 51 frame->num_channels_ = 1; | 51 frame->num_channels_ = 1; |
| 52 frame->sample_rate_hz_ = sample_rate_hz; | 52 frame->sample_rate_hz_ = sample_rate_hz; |
| 53 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100); | 53 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100); |
| 54 int16_t* frame_data = frame->mutable_data(); |
| 54 for (size_t i = 0; i < frame->samples_per_channel_; i++) { | 55 for (size_t i = 0; i < frame->samples_per_channel_; i++) { |
| 55 frame->data_[i] = static_cast<int16_t>(data * i); | 56 frame_data[i] = static_cast<int16_t>(data * i); |
| 56 } | 57 } |
| 57 } | 58 } |
| 58 | 59 |
| 59 // Keep the existing sample rate. | 60 // Keep the existing sample rate. |
| 60 void SetMonoFrame(float data, AudioFrame* frame) { | 61 void SetMonoFrame(float data, AudioFrame* frame) { |
| 61 SetMonoFrame(data, frame->sample_rate_hz_, frame); | 62 SetMonoFrame(data, frame->sample_rate_hz_, frame); |
| 62 } | 63 } |
| 63 | 64 |
| 64 // Sets the signal value to increase by |left| and |right| with every sample in | 65 // Sets the signal value to increase by |left| and |right| with every sample in |
| 65 // each channel respectively. | 66 // each channel respectively. |
| 66 void SetStereoFrame(float left, | 67 void SetStereoFrame(float left, |
| 67 float right, | 68 float right, |
| 68 int sample_rate_hz, | 69 int sample_rate_hz, |
| 69 AudioFrame* frame) { | 70 AudioFrame* frame) { |
| 70 memset(frame->data_, 0, sizeof(frame->data_)); | 71 frame->Mute(); |
| 71 frame->num_channels_ = 2; | 72 frame->num_channels_ = 2; |
| 72 frame->sample_rate_hz_ = sample_rate_hz; | 73 frame->sample_rate_hz_ = sample_rate_hz; |
| 73 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100); | 74 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100); |
| 75 int16_t* frame_data = frame->mutable_data(); |
| 74 for (size_t i = 0; i < frame->samples_per_channel_; i++) { | 76 for (size_t i = 0; i < frame->samples_per_channel_; i++) { |
| 75 frame->data_[i * 2] = static_cast<int16_t>(left * i); | 77 frame_data[i * 2] = static_cast<int16_t>(left * i); |
| 76 frame->data_[i * 2 + 1] = static_cast<int16_t>(right * i); | 78 frame_data[i * 2 + 1] = static_cast<int16_t>(right * i); |
| 77 } | 79 } |
| 78 } | 80 } |
| 79 | 81 |
| 80 // Keep the existing sample rate. | 82 // Keep the existing sample rate. |
| 81 void SetStereoFrame(float left, float right, AudioFrame* frame) { | 83 void SetStereoFrame(float left, float right, AudioFrame* frame) { |
| 82 SetStereoFrame(left, right, frame->sample_rate_hz_, frame); | 84 SetStereoFrame(left, right, frame->sample_rate_hz_, frame); |
| 83 } | 85 } |
| 84 | 86 |
| 85 // Sets the signal value to increase by |ch1|, |ch2|, |ch3|, |ch4| with every | 87 // Sets the signal value to increase by |ch1|, |ch2|, |ch3|, |ch4| with every |
| 86 // sample in each channel respectively. | 88 // sample in each channel respectively. |
| 87 void SetQuadFrame(float ch1, | 89 void SetQuadFrame(float ch1, |
| 88 float ch2, | 90 float ch2, |
| 89 float ch3, | 91 float ch3, |
| 90 float ch4, | 92 float ch4, |
| 91 int sample_rate_hz, | 93 int sample_rate_hz, |
| 92 AudioFrame* frame) { | 94 AudioFrame* frame) { |
| 93 memset(frame->data_, 0, sizeof(frame->data_)); | 95 frame->Mute(); |
| 94 frame->num_channels_ = 4; | 96 frame->num_channels_ = 4; |
| 95 frame->sample_rate_hz_ = sample_rate_hz; | 97 frame->sample_rate_hz_ = sample_rate_hz; |
| 96 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100); | 98 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100); |
| 99 int16_t* frame_data = frame->mutable_data(); |
| 97 for (size_t i = 0; i < frame->samples_per_channel_; i++) { | 100 for (size_t i = 0; i < frame->samples_per_channel_; i++) { |
| 98 frame->data_[i * 4] = static_cast<int16_t>(ch1 * i); | 101 frame_data[i * 4] = static_cast<int16_t>(ch1 * i); |
| 99 frame->data_[i * 4 + 1] = static_cast<int16_t>(ch2 * i); | 102 frame_data[i * 4 + 1] = static_cast<int16_t>(ch2 * i); |
| 100 frame->data_[i * 4 + 2] = static_cast<int16_t>(ch3 * i); | 103 frame_data[i * 4 + 2] = static_cast<int16_t>(ch3 * i); |
| 101 frame->data_[i * 4 + 3] = static_cast<int16_t>(ch4 * i); | 104 frame_data[i * 4 + 3] = static_cast<int16_t>(ch4 * i); |
| 102 } | 105 } |
| 103 } | 106 } |
| 104 | 107 |
| 105 void VerifyParams(const AudioFrame& ref_frame, const AudioFrame& test_frame) { | 108 void VerifyParams(const AudioFrame& ref_frame, const AudioFrame& test_frame) { |
| 106 EXPECT_EQ(ref_frame.num_channels_, test_frame.num_channels_); | 109 EXPECT_EQ(ref_frame.num_channels_, test_frame.num_channels_); |
| 107 EXPECT_EQ(ref_frame.samples_per_channel_, test_frame.samples_per_channel_); | 110 EXPECT_EQ(ref_frame.samples_per_channel_, test_frame.samples_per_channel_); |
| 108 EXPECT_EQ(ref_frame.sample_rate_hz_, test_frame.sample_rate_hz_); | 111 EXPECT_EQ(ref_frame.sample_rate_hz_, test_frame.sample_rate_hz_); |
| 109 } | 112 } |
| 110 | 113 |
| 111 // Computes the best SNR based on the error between |ref_frame| and | 114 // Computes the best SNR based on the error between |ref_frame| and |
| 112 // |test_frame|. It allows for up to a |max_delay| in samples between the | 115 // |test_frame|. It allows for up to a |max_delay| in samples between the |
| 113 // signals to compensate for the resampling delay. | 116 // signals to compensate for the resampling delay. |
| 114 float ComputeSNR(const AudioFrame& ref_frame, const AudioFrame& test_frame, | 117 float ComputeSNR(const AudioFrame& ref_frame, const AudioFrame& test_frame, |
| 115 size_t max_delay) { | 118 size_t max_delay) { |
| 116 VerifyParams(ref_frame, test_frame); | 119 VerifyParams(ref_frame, test_frame); |
| 117 float best_snr = 0; | 120 float best_snr = 0; |
| 118 size_t best_delay = 0; | 121 size_t best_delay = 0; |
| 119 for (size_t delay = 0; delay <= max_delay; delay++) { | 122 for (size_t delay = 0; delay <= max_delay; delay++) { |
| 120 float mse = 0; | 123 float mse = 0; |
| 121 float variance = 0; | 124 float variance = 0; |
| 125 const int16_t* ref_frame_data = ref_frame.data(); |
| 126 const int16_t* test_frame_data = test_frame.data(); |
| 122 for (size_t i = 0; i < ref_frame.samples_per_channel_ * | 127 for (size_t i = 0; i < ref_frame.samples_per_channel_ * |
| 123 ref_frame.num_channels_ - delay; i++) { | 128 ref_frame.num_channels_ - delay; i++) { |
| 124 int error = ref_frame.data_[i] - test_frame.data_[i + delay]; | 129 int error = ref_frame_data[i] - test_frame_data[i + delay]; |
| 125 mse += error * error; | 130 mse += error * error; |
| 126 variance += ref_frame.data_[i] * ref_frame.data_[i]; | 131 variance += ref_frame_data[i] * ref_frame_data[i]; |
| 127 } | 132 } |
| 128 float snr = 100; // We assign 100 dB to the zero-error case. | 133 float snr = 100; // We assign 100 dB to the zero-error case. |
| 129 if (mse > 0) | 134 if (mse > 0) |
| 130 snr = 10 * log10(variance / mse); | 135 snr = 10 * log10(variance / mse); |
| 131 if (snr > best_snr) { | 136 if (snr > best_snr) { |
| 132 best_snr = snr; | 137 best_snr = snr; |
| 133 best_delay = delay; | 138 best_delay = delay; |
| 134 } | 139 } |
| 135 } | 140 } |
| 136 printf("SNR=%.1f dB at delay=%" PRIuS "\n", best_snr, best_delay); | 141 printf("SNR=%.1f dB at delay=%" PRIuS "\n", best_snr, best_delay); |
| 137 return best_snr; | 142 return best_snr; |
| 138 } | 143 } |
| 139 | 144 |
| 140 void VerifyFramesAreEqual(const AudioFrame& ref_frame, | 145 void VerifyFramesAreEqual(const AudioFrame& ref_frame, |
| 141 const AudioFrame& test_frame) { | 146 const AudioFrame& test_frame) { |
| 142 VerifyParams(ref_frame, test_frame); | 147 VerifyParams(ref_frame, test_frame); |
| 148 const int16_t* ref_frame_data = ref_frame.data(); |
| 149 const int16_t* test_frame_data = test_frame.data(); |
| 143 for (size_t i = 0; | 150 for (size_t i = 0; |
| 144 i < ref_frame.samples_per_channel_ * ref_frame.num_channels_; i++) { | 151 i < ref_frame.samples_per_channel_ * ref_frame.num_channels_; i++) { |
| 145 EXPECT_EQ(ref_frame.data_[i], test_frame.data_[i]); | 152 EXPECT_EQ(ref_frame_data[i], test_frame_data[i]); |
| 146 } | 153 } |
| 147 } | 154 } |
| 148 | 155 |
| 149 void UtilityTest::RunResampleTest(int src_channels, | 156 void UtilityTest::RunResampleTest(int src_channels, |
| 150 int src_sample_rate_hz, | 157 int src_sample_rate_hz, |
| 151 int dst_channels, | 158 int dst_channels, |
| 152 int dst_sample_rate_hz) { | 159 int dst_sample_rate_hz) { |
| 153 PushResampler<int16_t> resampler; // Create a new one with every test. | 160 PushResampler<int16_t> resampler; // Create a new one with every test. |
| 154 const int16_t kSrcCh1 = 30; // Shouldn't overflow for any used sample rate. | 161 const int16_t kSrcCh1 = 30; // Shouldn't overflow for any used sample rate. |
| 155 const int16_t kSrcCh2 = 15; | 162 const int16_t kSrcCh2 = 15; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 kDstChannels[dst_channel], kSampleRates[dst_rate]); | 267 kDstChannels[dst_channel], kSampleRates[dst_rate]); |
| 261 } | 268 } |
| 262 } | 269 } |
| 263 } | 270 } |
| 264 } | 271 } |
| 265 } | 272 } |
| 266 | 273 |
| 267 } // namespace | 274 } // namespace |
| 268 } // namespace voe | 275 } // namespace voe |
| 269 } // namespace webrtc | 276 } // namespace webrtc |
| OLD | NEW |