Home | History | Annotate | Download | only in agc
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      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
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "webrtc/tools/agc/test_utils.h"
     12 
     13 #include <cmath>
     14 
     15 #include <algorithm>
     16 
     17 #include "webrtc/modules/include/module_common_types.h"
     18 
     19 namespace webrtc {
     20 
     21 float MicLevel2Gain(int gain_range_db, int level) {
     22   return (level - 127.0f) / 128.0f * gain_range_db / 2;
     23 }
     24 
     25 float Db2Linear(float db) {
     26   return powf(10.0f, db / 20.0f);
     27 }
     28 
     29 void ApplyGainLinear(float gain, float last_gain, AudioFrame* frame) {
     30   const size_t frame_length =
     31       frame->samples_per_channel_ * frame->num_channels_;
     32   // Smooth the transition between gain levels across the frame.
     33   float smoothed_gain = last_gain;
     34   float gain_step = (gain - last_gain) / (frame_length - 1);
     35   for (size_t i = 0; i < frame_length; ++i) {
     36     smoothed_gain += gain_step;
     37     float sample = std::floor(frame->data_[i] * smoothed_gain + 0.5);
     38     sample = std::max(std::min(32767.0f, sample), -32768.0f);
     39     frame->data_[i] = static_cast<int16_t>(sample);
     40   }
     41 }
     42 
     43 void ApplyGain(float gain_db, float last_gain_db, AudioFrame* frame) {
     44   ApplyGainLinear(Db2Linear(gain_db), Db2Linear(last_gain_db), frame);
     45 }
     46 
     47 void SimulateMic(int gain_range_db, int mic_level, int last_mic_level,
     48                  AudioFrame* frame) {
     49   assert(mic_level >= 0 && mic_level <= 255);
     50   assert(last_mic_level >= 0 && last_mic_level <= 255);
     51   ApplyGain(MicLevel2Gain(gain_range_db, mic_level),
     52             MicLevel2Gain(gain_range_db, last_mic_level),
     53             frame);
     54 }
     55 
     56 void SimulateMic(int gain_map[255], int mic_level, int last_mic_level,
     57                  AudioFrame* frame) {
     58   assert(mic_level >= 0 && mic_level <= 255);
     59   assert(last_mic_level >= 0 && last_mic_level <= 255);
     60   ApplyGain(gain_map[mic_level], gain_map[last_mic_level], frame);
     61 }
     62 
     63 }  // namespace webrtc
     64 
     65