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 |