| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 var_decay_rate(0.9f), | 44 var_decay_rate(0.9f), |
| 45 var_window_size(10), | 45 var_window_size(10), |
| 46 analysis_rate(800), | 46 analysis_rate(800), |
| 47 gain_change_limit(0.1f), | 47 gain_change_limit(0.1f), |
| 48 rho(0.02f) {} | 48 rho(0.02f) {} |
| 49 int sample_rate_hz; | 49 int sample_rate_hz; |
| 50 int num_capture_channels; | 50 int num_capture_channels; |
| 51 int num_render_channels; | 51 int num_render_channels; |
| 52 intelligibility::VarianceArray::StepType var_type; | 52 intelligibility::VarianceArray::StepType var_type; |
| 53 float var_decay_rate; | 53 float var_decay_rate; |
| 54 int var_window_size; | 54 size_t var_window_size; |
| 55 int analysis_rate; | 55 int analysis_rate; |
| 56 float gain_change_limit; | 56 float gain_change_limit; |
| 57 float rho; | 57 float rho; |
| 58 }; | 58 }; |
| 59 | 59 |
| 60 explicit IntelligibilityEnhancer(const Config& config); | 60 explicit IntelligibilityEnhancer(const Config& config); |
| 61 IntelligibilityEnhancer(); // Initialize with default config. | 61 IntelligibilityEnhancer(); // Initialize with default config. |
| 62 | 62 |
| 63 // Reads and processes chunk of noise stream in time domain. | 63 // Reads and processes chunk of noise stream in time domain. |
| 64 void AnalyzeCaptureAudio(float* const* audio, | 64 void AnalyzeCaptureAudio(float* const* audio, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 79 | 79 |
| 80 // Provides access point to the frequency domain. | 80 // Provides access point to the frequency domain. |
| 81 class TransformCallback : public LappedTransform::Callback { | 81 class TransformCallback : public LappedTransform::Callback { |
| 82 public: | 82 public: |
| 83 TransformCallback(IntelligibilityEnhancer* parent, AudioSource source); | 83 TransformCallback(IntelligibilityEnhancer* parent, AudioSource source); |
| 84 | 84 |
| 85 // All in frequency domain, receives input |in_block|, applies | 85 // All in frequency domain, receives input |in_block|, applies |
| 86 // intelligibility enhancement, and writes result to |out_block|. | 86 // intelligibility enhancement, and writes result to |out_block|. |
| 87 void ProcessAudioBlock(const std::complex<float>* const* in_block, | 87 void ProcessAudioBlock(const std::complex<float>* const* in_block, |
| 88 int in_channels, | 88 int in_channels, |
| 89 int frames, | 89 size_t frames, |
| 90 int out_channels, | 90 int out_channels, |
| 91 std::complex<float>* const* out_block) override; | 91 std::complex<float>* const* out_block) override; |
| 92 | 92 |
| 93 private: | 93 private: |
| 94 IntelligibilityEnhancer* parent_; | 94 IntelligibilityEnhancer* parent_; |
| 95 AudioSource source_; | 95 AudioSource source_; |
| 96 }; | 96 }; |
| 97 friend class TransformCallback; | 97 friend class TransformCallback; |
| 98 FRIEND_TEST_ALL_PREFIXES(IntelligibilityEnhancerTest, TestErbCreation); | 98 FRIEND_TEST_ALL_PREFIXES(IntelligibilityEnhancerTest, TestErbCreation); |
| 99 FRIEND_TEST_ALL_PREFIXES(IntelligibilityEnhancerTest, TestSolveForGains); | 99 FRIEND_TEST_ALL_PREFIXES(IntelligibilityEnhancerTest, TestSolveForGains); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 115 void SolveForLambda(float power_target, float power_bot, float power_top); | 115 void SolveForLambda(float power_target, float power_bot, float power_top); |
| 116 | 116 |
| 117 // Transforms freq gains to ERB gains. | 117 // Transforms freq gains to ERB gains. |
| 118 void UpdateErbGains(); | 118 void UpdateErbGains(); |
| 119 | 119 |
| 120 // Updates variance calculation for noise input with |in_block|. | 120 // Updates variance calculation for noise input with |in_block|. |
| 121 void ProcessNoiseBlock(const std::complex<float>* in_block, | 121 void ProcessNoiseBlock(const std::complex<float>* in_block, |
| 122 std::complex<float>* out_block); | 122 std::complex<float>* out_block); |
| 123 | 123 |
| 124 // Returns number of ERB filters. | 124 // Returns number of ERB filters. |
| 125 static int GetBankSize(int sample_rate, int erb_resolution); | 125 static size_t GetBankSize(int sample_rate, size_t erb_resolution); |
| 126 | 126 |
| 127 // Initializes ERB filterbank. | 127 // Initializes ERB filterbank. |
| 128 void CreateErbBank(); | 128 void CreateErbBank(); |
| 129 | 129 |
| 130 // Analytically solves quadratic for optimal gains given |lambda|. | 130 // Analytically solves quadratic for optimal gains given |lambda|. |
| 131 // Negative gains are set to 0. Stores the results in |sols|. | 131 // Negative gains are set to 0. Stores the results in |sols|. |
| 132 void SolveForGainsGivenLambda(float lambda, int start_freq, float* sols); | 132 void SolveForGainsGivenLambda(float lambda, size_t start_freq, float* sols); |
| 133 | 133 |
| 134 // Computes variance across ERB filters from freq variance |var|. | 134 // Computes variance across ERB filters from freq variance |var|. |
| 135 // Stores in |result|. | 135 // Stores in |result|. |
| 136 void FilterVariance(const float* var, float* result); | 136 void FilterVariance(const float* var, float* result); |
| 137 | 137 |
| 138 // Returns dot product of vectors specified by size |length| arrays |a|,|b|. | 138 // Returns dot product of vectors specified by size |length| arrays |a|,|b|. |
| 139 static float DotProduct(const float* a, const float* b, int length); | 139 static float DotProduct(const float* a, const float* b, size_t length); |
| 140 | 140 |
| 141 const int freqs_; // Num frequencies in frequency domain. | 141 const size_t freqs_; // Num frequencies in frequency domain. |
| 142 const int window_size_; // Window size in samples; also the block size. | 142 const size_t window_size_; // Window size in samples; also the block size. |
| 143 const int chunk_length_; // Chunk size in samples. | 143 const size_t chunk_length_; // Chunk size in samples. |
| 144 const int bank_size_; // Num ERB filters. | 144 const size_t bank_size_; // Num ERB filters. |
| 145 const int sample_rate_hz_; | 145 const int sample_rate_hz_; |
| 146 const int erb_resolution_; | 146 const int erb_resolution_; |
| 147 const int num_capture_channels_; | 147 const int num_capture_channels_; |
| 148 const int num_render_channels_; | 148 const int num_render_channels_; |
| 149 const int analysis_rate_; // Num blocks before gains recalculated. | 149 const int analysis_rate_; // Num blocks before gains recalculated. |
| 150 | 150 |
| 151 const bool active_; // Whether render gains are being updated. | 151 const bool active_; // Whether render gains are being updated. |
| 152 // TODO(ekm): Add logic for updating |active_|. | 152 // TODO(ekm): Add logic for updating |active_|. |
| 153 | 153 |
| 154 intelligibility::VarianceArray clear_variance_; | 154 intelligibility::VarianceArray clear_variance_; |
| 155 intelligibility::VarianceArray noise_variance_; | 155 intelligibility::VarianceArray noise_variance_; |
| 156 rtc::scoped_ptr<float[]> filtered_clear_var_; | 156 rtc::scoped_ptr<float[]> filtered_clear_var_; |
| 157 rtc::scoped_ptr<float[]> filtered_noise_var_; | 157 rtc::scoped_ptr<float[]> filtered_noise_var_; |
| 158 std::vector<std::vector<float>> filter_bank_; | 158 std::vector<std::vector<float>> filter_bank_; |
| 159 rtc::scoped_ptr<float[]> center_freqs_; | 159 rtc::scoped_ptr<float[]> center_freqs_; |
| 160 int start_freq_; | 160 size_t start_freq_; |
| 161 rtc::scoped_ptr<float[]> rho_; // Production and interpretation SNR. | 161 rtc::scoped_ptr<float[]> rho_; // Production and interpretation SNR. |
| 162 // for each ERB band. | 162 // for each ERB band. |
| 163 rtc::scoped_ptr<float[]> gains_eq_; // Pre-filter modified gains. | 163 rtc::scoped_ptr<float[]> gains_eq_; // Pre-filter modified gains. |
| 164 intelligibility::GainApplier gain_applier_; | 164 intelligibility::GainApplier gain_applier_; |
| 165 | 165 |
| 166 // Destination buffers used to reassemble blocked chunks before overwriting | 166 // Destination buffers used to reassemble blocked chunks before overwriting |
| 167 // the original input array with modifications. | 167 // the original input array with modifications. |
| 168 ChannelBuffer<float> temp_render_out_buffer_; | 168 ChannelBuffer<float> temp_render_out_buffer_; |
| 169 ChannelBuffer<float> temp_capture_out_buffer_; | 169 ChannelBuffer<float> temp_capture_out_buffer_; |
| 170 | 170 |
| 171 rtc::scoped_ptr<float[]> kbd_window_; | 171 rtc::scoped_ptr<float[]> kbd_window_; |
| 172 TransformCallback render_callback_; | 172 TransformCallback render_callback_; |
| 173 TransformCallback capture_callback_; | 173 TransformCallback capture_callback_; |
| 174 rtc::scoped_ptr<LappedTransform> render_mangler_; | 174 rtc::scoped_ptr<LappedTransform> render_mangler_; |
| 175 rtc::scoped_ptr<LappedTransform> capture_mangler_; | 175 rtc::scoped_ptr<LappedTransform> capture_mangler_; |
| 176 int block_count_; | 176 int block_count_; |
| 177 int analysis_step_; | 177 int analysis_step_; |
| 178 }; | 178 }; |
| 179 | 179 |
| 180 } // namespace webrtc | 180 } // namespace webrtc |
| 181 | 181 |
| 182 #endif // WEBRTC_MODULES_AUDIO_PROCESSING_INTELLIGIBILITY_INTELLIGIBILITY_ENHAN
CER_H_ | 182 #endif // WEBRTC_MODULES_AUDIO_PROCESSING_INTELLIGIBILITY_INTELLIGIBILITY_ENHAN
CER_H_ |
| OLD | NEW |