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 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 array_normal_(GetArrayNormalIfExists(array_geometry)), | 215 array_normal_(GetArrayNormalIfExists(array_geometry)), |
216 min_mic_spacing_(GetMinimumSpacing(array_geometry)), | 216 min_mic_spacing_(GetMinimumSpacing(array_geometry)), |
217 target_angle_radians_(target_direction.azimuth()), | 217 target_angle_radians_(target_direction.azimuth()), |
218 away_radians_(std::min( | 218 away_radians_(std::min( |
219 static_cast<float>(M_PI), | 219 static_cast<float>(M_PI), |
220 std::max(kMinAwayRadians, | 220 std::max(kMinAwayRadians, |
221 kAwaySlope * static_cast<float>(M_PI) / min_mic_spacing_))) { | 221 kAwaySlope * static_cast<float>(M_PI) / min_mic_spacing_))) { |
222 WindowGenerator::KaiserBesselDerived(kKbdAlpha, kFftSize, window_); | 222 WindowGenerator::KaiserBesselDerived(kKbdAlpha, kFftSize, window_); |
223 } | 223 } |
224 | 224 |
| 225 NonlinearBeamformer::~NonlinearBeamformer() = default; |
| 226 |
225 void NonlinearBeamformer::Initialize(int chunk_size_ms, int sample_rate_hz) { | 227 void NonlinearBeamformer::Initialize(int chunk_size_ms, int sample_rate_hz) { |
226 chunk_length_ = | 228 chunk_length_ = |
227 static_cast<size_t>(sample_rate_hz / (1000.f / chunk_size_ms)); | 229 static_cast<size_t>(sample_rate_hz / (1000.f / chunk_size_ms)); |
228 sample_rate_hz_ = sample_rate_hz; | 230 sample_rate_hz_ = sample_rate_hz; |
229 | 231 |
230 high_pass_postfilter_mask_ = 1.f; | 232 high_pass_postfilter_mask_ = 1.f; |
231 is_target_present_ = false; | 233 is_target_present_ = false; |
232 hold_target_blocks_ = kHoldTargetSeconds * 2 * sample_rate_hz / kFftSize; | 234 hold_target_blocks_ = kHoldTargetSeconds * 2 * sample_rate_hz / kFftSize; |
233 interference_blocks_count_ = hold_target_blocks_; | 235 interference_blocks_count_ = hold_target_blocks_; |
234 | 236 |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 NormalizeCovMats(); | 433 NormalizeCovMats(); |
432 } | 434 } |
433 | 435 |
434 bool NonlinearBeamformer::IsInBeam(const SphericalPointf& spherical_point) { | 436 bool NonlinearBeamformer::IsInBeam(const SphericalPointf& spherical_point) { |
435 // If more than half-beamwidth degrees away from the beam's center, | 437 // If more than half-beamwidth degrees away from the beam's center, |
436 // you are out of the beam. | 438 // you are out of the beam. |
437 return fabs(spherical_point.azimuth() - target_angle_radians_) < | 439 return fabs(spherical_point.azimuth() - target_angle_radians_) < |
438 kHalfBeamWidthRadians; | 440 kHalfBeamWidthRadians; |
439 } | 441 } |
440 | 442 |
| 443 bool NonlinearBeamformer::is_target_present() { return is_target_present_; } |
| 444 |
441 void NonlinearBeamformer::ProcessAudioBlock(const complex_f* const* input, | 445 void NonlinearBeamformer::ProcessAudioBlock(const complex_f* const* input, |
442 size_t num_input_channels, | 446 size_t num_input_channels, |
443 size_t num_freq_bins, | 447 size_t num_freq_bins, |
444 size_t num_output_channels, | 448 size_t num_output_channels, |
445 complex_f* const* output) { | 449 complex_f* const* output) { |
446 RTC_CHECK_EQ(kNumFreqBins, num_freq_bins); | 450 RTC_CHECK_EQ(kNumFreqBins, num_freq_bins); |
447 RTC_CHECK_EQ(num_input_channels_, num_input_channels); | 451 RTC_CHECK_EQ(num_input_channels_, num_input_channels); |
448 RTC_CHECK_EQ(0u, num_output_channels); | 452 RTC_CHECK_EQ(0u, num_output_channels); |
449 | 453 |
450 // Calculating the post-filter masks. Note that we need two for each | 454 // Calculating the post-filter masks. Note that we need two for each |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 new_mask_ + high_mean_end_bin_ + 1); | 588 new_mask_ + high_mean_end_bin_ + 1); |
585 if (new_mask_[quantile] > kMaskTargetThreshold) { | 589 if (new_mask_[quantile] > kMaskTargetThreshold) { |
586 is_target_present_ = true; | 590 is_target_present_ = true; |
587 interference_blocks_count_ = 0; | 591 interference_blocks_count_ = 0; |
588 } else { | 592 } else { |
589 is_target_present_ = interference_blocks_count_++ < hold_target_blocks_; | 593 is_target_present_ = interference_blocks_count_++ < hold_target_blocks_; |
590 } | 594 } |
591 } | 595 } |
592 | 596 |
593 } // namespace webrtc | 597 } // namespace webrtc |
OLD | NEW |