Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(588)

Side by Side Diff: webrtc/modules/audio_coding/neteq/expand.cc

Issue 1181073002: Reland "Upconvert various types to int.", neteq portion. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/modules/audio_coding/neteq/expand.h ('k') | webrtc/modules/audio_coding/neteq/merge.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 voiced_vector + temp_length, parameters.current_voice_mix_factor, 232 voiced_vector + temp_length, parameters.current_voice_mix_factor,
233 unvoiced_vector + temp_length, temp_scale, 14, 233 unvoiced_vector + temp_length, temp_scale, 14,
234 temp_data + temp_length, static_cast<int>(current_lag - temp_length)); 234 temp_data + temp_length, static_cast<int>(current_lag - temp_length));
235 } 235 }
236 236
237 // Select muting slope depending on how many consecutive expands we have 237 // Select muting slope depending on how many consecutive expands we have
238 // done. 238 // done.
239 if (consecutive_expands_ == 3) { 239 if (consecutive_expands_ == 3) {
240 // Let the mute factor decrease from 1.0 to 0.95 in 6.25 ms. 240 // Let the mute factor decrease from 1.0 to 0.95 in 6.25 ms.
241 // mute_slope = 0.0010 / fs_mult in Q20. 241 // mute_slope = 0.0010 / fs_mult in Q20.
242 parameters.mute_slope = std::max(parameters.mute_slope, 242 parameters.mute_slope = std::max(parameters.mute_slope, 1049 / fs_mult);
243 static_cast<int16_t>(1049 / fs_mult));
244 } 243 }
245 if (consecutive_expands_ == 7) { 244 if (consecutive_expands_ == 7) {
246 // Let the mute factor decrease from 1.0 to 0.90 in 6.25 ms. 245 // Let the mute factor decrease from 1.0 to 0.90 in 6.25 ms.
247 // mute_slope = 0.0020 / fs_mult in Q20. 246 // mute_slope = 0.0020 / fs_mult in Q20.
248 parameters.mute_slope = std::max(parameters.mute_slope, 247 parameters.mute_slope = std::max(parameters.mute_slope, 2097 / fs_mult);
249 static_cast<int16_t>(2097 / fs_mult));
250 } 248 }
251 249
252 // Mute segment according to slope value. 250 // Mute segment according to slope value.
253 if ((consecutive_expands_ != 0) || !parameters.onset) { 251 if ((consecutive_expands_ != 0) || !parameters.onset) {
254 // Mute to the previous level, then continue with the muting. 252 // Mute to the previous level, then continue with the muting.
255 WebRtcSpl_AffineTransformVector(temp_data, temp_data, 253 WebRtcSpl_AffineTransformVector(temp_data, temp_data,
256 parameters.mute_factor, 8192, 254 parameters.mute_factor, 8192,
257 14, static_cast<int>(current_lag)); 255 14, static_cast<int>(current_lag));
258 256
259 if (!stop_muting_) { 257 if (!stop_muting_) {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 int fs_mult_lpc_analysis_len = fs_mult * kLpcAnalysisLength; 359 int fs_mult_lpc_analysis_len = fs_mult * kLpcAnalysisLength;
362 360
363 const size_t signal_length = 256 * fs_mult; 361 const size_t signal_length = 256 * fs_mult;
364 const int16_t* audio_history = 362 const int16_t* audio_history =
365 &(*sync_buffer_)[0][sync_buffer_->Size() - signal_length]; 363 &(*sync_buffer_)[0][sync_buffer_->Size() - signal_length];
366 364
367 // Initialize. 365 // Initialize.
368 InitializeForAnExpandPeriod(); 366 InitializeForAnExpandPeriod();
369 367
370 // Calculate correlation in downsampled domain (4 kHz sample rate). 368 // Calculate correlation in downsampled domain (4 kHz sample rate).
371 int16_t correlation_scale; 369 int correlation_scale;
372 int correlation_length = 51; // TODO(hlundin): Legacy bit-exactness. 370 int correlation_length = 51; // TODO(hlundin): Legacy bit-exactness.
373 // If it is decided to break bit-exactness |correlation_length| should be 371 // If it is decided to break bit-exactness |correlation_length| should be
374 // initialized to the return value of Correlation(). 372 // initialized to the return value of Correlation().
375 Correlation(audio_history, signal_length, correlation_vector, 373 Correlation(audio_history, signal_length, correlation_vector,
376 &correlation_scale); 374 &correlation_scale);
377 375
378 // Find peaks in correlation vector. 376 // Find peaks in correlation vector.
379 DspHelper::PeakDetection(correlation_vector, correlation_length, 377 DspHelper::PeakDetection(correlation_vector, correlation_length,
380 kNumCorrelationCandidates, fs_mult, 378 kNumCorrelationCandidates, fs_mult,
381 best_correlation_index, best_correlation); 379 best_correlation_index, best_correlation);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 436
439 for (size_t channel_ix = 0; channel_ix < num_channels_; ++channel_ix) { 437 for (size_t channel_ix = 0; channel_ix < num_channels_; ++channel_ix) {
440 ChannelParameters& parameters = channel_parameters_[channel_ix]; 438 ChannelParameters& parameters = channel_parameters_[channel_ix];
441 // Calculate suitable scaling. 439 // Calculate suitable scaling.
442 int16_t signal_max = WebRtcSpl_MaxAbsValueW16( 440 int16_t signal_max = WebRtcSpl_MaxAbsValueW16(
443 &audio_history[signal_length - correlation_length - start_index 441 &audio_history[signal_length - correlation_length - start_index
444 - correlation_lags], 442 - correlation_lags],
445 correlation_length + start_index + correlation_lags - 1); 443 correlation_length + start_index + correlation_lags - 1);
446 correlation_scale = ((31 - WebRtcSpl_NormW32(signal_max * signal_max)) 444 correlation_scale = ((31 - WebRtcSpl_NormW32(signal_max * signal_max))
447 + (31 - WebRtcSpl_NormW32(correlation_length))) - 31; 445 + (31 - WebRtcSpl_NormW32(correlation_length))) - 31;
448 correlation_scale = std::max(static_cast<int16_t>(0), correlation_scale); 446 correlation_scale = std::max(0, correlation_scale);
449 447
450 // Calculate the correlation, store in |correlation_vector2|. 448 // Calculate the correlation, store in |correlation_vector2|.
451 WebRtcSpl_CrossCorrelation( 449 WebRtcSpl_CrossCorrelation(
452 correlation_vector2, 450 correlation_vector2,
453 &(audio_history[signal_length - correlation_length]), 451 &(audio_history[signal_length - correlation_length]),
454 &(audio_history[signal_length - correlation_length - start_index]), 452 &(audio_history[signal_length - correlation_length - start_index]),
455 correlation_length, correlation_lags, correlation_scale, -1); 453 correlation_length, correlation_lags, correlation_scale, -1);
456 454
457 // Find maximizing index. 455 // Find maximizing index.
458 best_index = WebRtcSpl_MaxIndexW32(correlation_vector2, correlation_lags); 456 best_index = WebRtcSpl_MaxIndexW32(correlation_vector2, correlation_lags);
459 int32_t max_correlation = correlation_vector2[best_index]; 457 int32_t max_correlation = correlation_vector2[best_index];
460 // Compensate index with start offset. 458 // Compensate index with start offset.
461 best_index = best_index + start_index; 459 best_index = best_index + start_index;
462 460
463 // Calculate energies. 461 // Calculate energies.
464 int32_t energy1 = WebRtcSpl_DotProductWithScale( 462 int32_t energy1 = WebRtcSpl_DotProductWithScale(
465 &(audio_history[signal_length - correlation_length]), 463 &(audio_history[signal_length - correlation_length]),
466 &(audio_history[signal_length - correlation_length]), 464 &(audio_history[signal_length - correlation_length]),
467 correlation_length, correlation_scale); 465 correlation_length, correlation_scale);
468 int32_t energy2 = WebRtcSpl_DotProductWithScale( 466 int32_t energy2 = WebRtcSpl_DotProductWithScale(
469 &(audio_history[signal_length - correlation_length - best_index]), 467 &(audio_history[signal_length - correlation_length - best_index]),
470 &(audio_history[signal_length - correlation_length - best_index]), 468 &(audio_history[signal_length - correlation_length - best_index]),
471 correlation_length, correlation_scale); 469 correlation_length, correlation_scale);
472 470
473 // Calculate the correlation coefficient between the two portions of the 471 // Calculate the correlation coefficient between the two portions of the
474 // signal. 472 // signal.
475 int16_t corr_coefficient; 473 int32_t corr_coefficient;
476 if ((energy1 > 0) && (energy2 > 0)) { 474 if ((energy1 > 0) && (energy2 > 0)) {
477 int energy1_scale = std::max(16 - WebRtcSpl_NormW32(energy1), 0); 475 int energy1_scale = std::max(16 - WebRtcSpl_NormW32(energy1), 0);
478 int energy2_scale = std::max(16 - WebRtcSpl_NormW32(energy2), 0); 476 int energy2_scale = std::max(16 - WebRtcSpl_NormW32(energy2), 0);
479 // Make sure total scaling is even (to simplify scale factor after sqrt). 477 // Make sure total scaling is even (to simplify scale factor after sqrt).
480 if ((energy1_scale + energy2_scale) & 1) { 478 if ((energy1_scale + energy2_scale) & 1) {
481 // If sum is odd, add 1 to make it even. 479 // If sum is odd, add 1 to make it even.
482 energy1_scale += 1; 480 energy1_scale += 1;
483 } 481 }
484 int16_t scaled_energy1 = energy1 >> energy1_scale; 482 int32_t scaled_energy1 = energy1 >> energy1_scale;
485 int16_t scaled_energy2 = energy2 >> energy2_scale; 483 int32_t scaled_energy2 = energy2 >> energy2_scale;
486 int16_t sqrt_energy_product = WebRtcSpl_SqrtFloor( 484 int16_t sqrt_energy_product = static_cast<int16_t>(
487 scaled_energy1 * scaled_energy2); 485 WebRtcSpl_SqrtFloor(scaled_energy1 * scaled_energy2));
488 // Calculate max_correlation / sqrt(energy1 * energy2) in Q14. 486 // Calculate max_correlation / sqrt(energy1 * energy2) in Q14.
489 int cc_shift = 14 - (energy1_scale + energy2_scale) / 2; 487 int cc_shift = 14 - (energy1_scale + energy2_scale) / 2;
490 max_correlation = WEBRTC_SPL_SHIFT_W32(max_correlation, cc_shift); 488 max_correlation = WEBRTC_SPL_SHIFT_W32(max_correlation, cc_shift);
491 corr_coefficient = WebRtcSpl_DivW32W16(max_correlation, 489 corr_coefficient = WebRtcSpl_DivW32W16(max_correlation,
492 sqrt_energy_product); 490 sqrt_energy_product);
493 corr_coefficient = std::min(static_cast<int16_t>(16384), 491 // Cap at 1.0 in Q14.
494 corr_coefficient); // Cap at 1.0 in Q14. 492 corr_coefficient = std::min(16384, corr_coefficient);
495 } else { 493 } else {
496 corr_coefficient = 0; 494 corr_coefficient = 0;
497 } 495 }
498 496
499 // Extract the two vectors expand_vector0 and expand_vector1 from 497 // Extract the two vectors expand_vector0 and expand_vector1 from
500 // |audio_history|. 498 // |audio_history|.
501 int16_t expansion_length = static_cast<int16_t>(max_lag_ + overlap_length_); 499 int16_t expansion_length = static_cast<int16_t>(max_lag_ + overlap_length_);
502 const int16_t* vector1 = &(audio_history[signal_length - expansion_length]); 500 const int16_t* vector1 = &(audio_history[signal_length - expansion_length]);
503 const int16_t* vector2 = vector1 - distortion_lag; 501 const int16_t* vector2 = vector1 - distortion_lag;
504 // Normalize the second vector to the same energy as the first. 502 // Normalize the second vector to the same energy as the first.
505 energy1 = WebRtcSpl_DotProductWithScale(vector1, vector1, expansion_length, 503 energy1 = WebRtcSpl_DotProductWithScale(vector1, vector1, expansion_length,
506 correlation_scale); 504 correlation_scale);
507 energy2 = WebRtcSpl_DotProductWithScale(vector2, vector2, expansion_length, 505 energy2 = WebRtcSpl_DotProductWithScale(vector2, vector2, expansion_length,
508 correlation_scale); 506 correlation_scale);
509 // Confirm that amplitude ratio sqrt(energy1 / energy2) is within 0.5 - 2.0, 507 // Confirm that amplitude ratio sqrt(energy1 / energy2) is within 0.5 - 2.0,
510 // i.e., energy1 / energy1 is within 0.25 - 4. 508 // i.e., energy1 / energy1 is within 0.25 - 4.
511 int16_t amplitude_ratio; 509 int16_t amplitude_ratio;
512 if ((energy1 / 4 < energy2) && (energy1 > energy2 / 4)) { 510 if ((energy1 / 4 < energy2) && (energy1 > energy2 / 4)) {
513 // Energy constraint fulfilled. Use both vectors and scale them 511 // Energy constraint fulfilled. Use both vectors and scale them
514 // accordingly. 512 // accordingly.
515 int16_t scaled_energy2 = std::max(16 - WebRtcSpl_NormW32(energy2), 0); 513 int32_t scaled_energy2 = std::max(16 - WebRtcSpl_NormW32(energy2), 0);
516 int16_t scaled_energy1 = scaled_energy2 - 13; 514 int32_t scaled_energy1 = scaled_energy2 - 13;
517 // Calculate scaled_energy1 / scaled_energy2 in Q13. 515 // Calculate scaled_energy1 / scaled_energy2 in Q13.
518 int32_t energy_ratio = WebRtcSpl_DivW32W16( 516 int32_t energy_ratio = WebRtcSpl_DivW32W16(
519 WEBRTC_SPL_SHIFT_W32(energy1, -scaled_energy1), 517 WEBRTC_SPL_SHIFT_W32(energy1, -scaled_energy1),
520 energy2 >> scaled_energy2); 518 energy2 >> scaled_energy2);
521 // Calculate sqrt ratio in Q13 (sqrt of en1/en2 in Q26). 519 // Calculate sqrt ratio in Q13 (sqrt of en1/en2 in Q26).
522 amplitude_ratio = WebRtcSpl_SqrtFloor(energy_ratio << 13); 520 amplitude_ratio = WebRtcSpl_SqrtFloor(energy_ratio << 13);
523 // Copy the two vectors and give them the same energy. 521 // Copy the two vectors and give them the same energy.
524 parameters.expand_vector0.Clear(); 522 parameters.expand_vector0.Clear();
525 parameters.expand_vector0.PushBack(vector1, expansion_length); 523 parameters.expand_vector0.PushBack(vector1, expansion_length);
526 parameters.expand_vector1.Clear(); 524 parameters.expand_vector1.Clear();
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 parameters.ar_gain = unvoiced_gain; 673 parameters.ar_gain = unvoiced_gain;
676 674
677 // Calculate voice_mix_factor from corr_coefficient. 675 // Calculate voice_mix_factor from corr_coefficient.
678 // Let x = corr_coefficient. Then, we compute: 676 // Let x = corr_coefficient. Then, we compute:
679 // if (x > 0.48) 677 // if (x > 0.48)
680 // voice_mix_factor = (-5179 + 19931x - 16422x^2 + 5776x^3) / 4096; 678 // voice_mix_factor = (-5179 + 19931x - 16422x^2 + 5776x^3) / 4096;
681 // else 679 // else
682 // voice_mix_factor = 0; 680 // voice_mix_factor = 0;
683 if (corr_coefficient > 7875) { 681 if (corr_coefficient > 7875) {
684 int16_t x1, x2, x3; 682 int16_t x1, x2, x3;
685 x1 = corr_coefficient; // |corr_coefficient| is in Q14. 683 // |corr_coefficient| is in Q14.
684 x1 = static_cast<int16_t>(corr_coefficient);
686 x2 = (x1 * x1) >> 14; // Shift 14 to keep result in Q14. 685 x2 = (x1 * x1) >> 14; // Shift 14 to keep result in Q14.
687 x3 = (x1 * x2) >> 14; 686 x3 = (x1 * x2) >> 14;
688 static const int kCoefficients[4] = { -5179, 19931, -16422, 5776 }; 687 static const int kCoefficients[4] = { -5179, 19931, -16422, 5776 };
689 int32_t temp_sum = kCoefficients[0] << 14; 688 int32_t temp_sum = kCoefficients[0] << 14;
690 temp_sum += kCoefficients[1] * x1; 689 temp_sum += kCoefficients[1] * x1;
691 temp_sum += kCoefficients[2] * x2; 690 temp_sum += kCoefficients[2] * x2;
692 temp_sum += kCoefficients[3] * x3; 691 temp_sum += kCoefficients[3] * x3;
693 parameters.voice_mix_factor = 692 parameters.voice_mix_factor =
694 static_cast<int16_t>(std::min(temp_sum / 4096, 16384)); 693 static_cast<int16_t>(std::min(temp_sum / 4096, 16384));
695 parameters.voice_mix_factor = std::max(parameters.voice_mix_factor, 694 parameters.voice_mix_factor = std::max(parameters.voice_mix_factor,
696 static_cast<int16_t>(0)); 695 static_cast<int16_t>(0));
697 } else { 696 } else {
698 parameters.voice_mix_factor = 0; 697 parameters.voice_mix_factor = 0;
699 } 698 }
700 699
701 // Calculate muting slope. Reuse value from earlier scaling of 700 // Calculate muting slope. Reuse value from earlier scaling of
702 // |expand_vector0| and |expand_vector1|. 701 // |expand_vector0| and |expand_vector1|.
703 int16_t slope = amplitude_ratio; 702 int16_t slope = amplitude_ratio;
704 if (slope > 12288) { 703 if (slope > 12288) {
705 // slope > 1.5. 704 // slope > 1.5.
706 // Calculate (1 - (1 / slope)) / distortion_lag = 705 // Calculate (1 - (1 / slope)) / distortion_lag =
707 // (slope - 1) / (distortion_lag * slope). 706 // (slope - 1) / (distortion_lag * slope).
708 // |slope| is in Q13, so 1 corresponds to 8192. Shift up to Q25 before 707 // |slope| is in Q13, so 1 corresponds to 8192. Shift up to Q25 before
709 // the division. 708 // the division.
710 // Shift the denominator from Q13 to Q5 before the division. The result of 709 // Shift the denominator from Q13 to Q5 before the division. The result of
711 // the division will then be in Q20. 710 // the division will then be in Q20.
712 int16_t temp_ratio = WebRtcSpl_DivW32W16( 711 int temp_ratio = WebRtcSpl_DivW32W16(
713 (slope - 8192) << 12, 712 (slope - 8192) << 12,
714 static_cast<int16_t>((distortion_lag * slope) >> 8)); 713 static_cast<int16_t>((distortion_lag * slope) >> 8));
715 if (slope > 14746) { 714 if (slope > 14746) {
716 // slope > 1.8. 715 // slope > 1.8.
717 // Divide by 2, with proper rounding. 716 // Divide by 2, with proper rounding.
718 parameters.mute_slope = (temp_ratio + 1) / 2; 717 parameters.mute_slope = (temp_ratio + 1) / 2;
719 } else { 718 } else {
720 // Divide by 8, with proper rounding. 719 // Divide by 8, with proper rounding.
721 parameters.mute_slope = (temp_ratio + 4) / 8; 720 parameters.mute_slope = (temp_ratio + 4) / 8;
722 } 721 }
723 parameters.onset = true; 722 parameters.onset = true;
724 } else { 723 } else {
725 // Calculate (1 - slope) / distortion_lag. 724 // Calculate (1 - slope) / distortion_lag.
726 // Shift |slope| by 7 to Q20 before the division. The result is in Q20. 725 // Shift |slope| by 7 to Q20 before the division. The result is in Q20.
727 parameters.mute_slope = WebRtcSpl_DivW32W16( 726 parameters.mute_slope = WebRtcSpl_DivW32W16(
728 (8192 - slope) << 7, static_cast<int16_t>(distortion_lag)); 727 (8192 - slope) << 7, static_cast<int16_t>(distortion_lag));
729 if (parameters.voice_mix_factor <= 13107) { 728 if (parameters.voice_mix_factor <= 13107) {
730 // Make sure the mute factor decreases from 1.0 to 0.9 in no more than 729 // Make sure the mute factor decreases from 1.0 to 0.9 in no more than
731 // 6.25 ms. 730 // 6.25 ms.
732 // mute_slope >= 0.005 / fs_mult in Q20. 731 // mute_slope >= 0.005 / fs_mult in Q20.
733 parameters.mute_slope = std::max(static_cast<int16_t>(5243 / fs_mult), 732 parameters.mute_slope = std::max(5243 / fs_mult, parameters.mute_slope);
734 parameters.mute_slope);
735 } else if (slope > 8028) { 733 } else if (slope > 8028) {
736 parameters.mute_slope = 0; 734 parameters.mute_slope = 0;
737 } 735 }
738 parameters.onset = false; 736 parameters.onset = false;
739 } 737 }
740 } 738 }
741 } 739 }
742 740
743 Expand::ChannelParameters::ChannelParameters() 741 Expand::ChannelParameters::ChannelParameters()
744 : mute_factor(16384), 742 : mute_factor(16384),
745 ar_gain(0), 743 ar_gain(0),
746 ar_gain_scale(0), 744 ar_gain_scale(0),
747 voice_mix_factor(0), 745 voice_mix_factor(0),
748 current_voice_mix_factor(0), 746 current_voice_mix_factor(0),
749 onset(false), 747 onset(false),
750 mute_slope(0) { 748 mute_slope(0) {
751 memset(ar_filter, 0, sizeof(ar_filter)); 749 memset(ar_filter, 0, sizeof(ar_filter));
752 memset(ar_filter_state, 0, sizeof(ar_filter_state)); 750 memset(ar_filter_state, 0, sizeof(ar_filter_state));
753 } 751 }
754 752
755 void Expand::Correlation(const int16_t* input, 753 void Expand::Correlation(const int16_t* input,
756 size_t input_length, 754 size_t input_length,
757 int16_t* output, 755 int16_t* output,
758 int16_t* output_scale) const { 756 int* output_scale) const {
759 // Set parameters depending on sample rate. 757 // Set parameters depending on sample rate.
760 const int16_t* filter_coefficients; 758 const int16_t* filter_coefficients;
761 int16_t num_coefficients; 759 int16_t num_coefficients;
762 int16_t downsampling_factor; 760 int16_t downsampling_factor;
763 if (fs_hz_ == 8000) { 761 if (fs_hz_ == 8000) {
764 num_coefficients = 3; 762 num_coefficients = 3;
765 downsampling_factor = 2; 763 downsampling_factor = 2;
766 filter_coefficients = DspHelper::kDownsample8kHzTbl; 764 filter_coefficients = DspHelper::kDownsample8kHzTbl;
767 } else if (fs_hz_ == 16000) { 765 } else if (fs_hz_ == 16000) {
768 num_coefficients = 5; 766 num_coefficients = 5;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 RandomVector* random_vector, 835 RandomVector* random_vector,
838 int fs, 836 int fs,
839 size_t num_channels) const { 837 size_t num_channels) const {
840 return new Expand(background_noise, sync_buffer, random_vector, fs, 838 return new Expand(background_noise, sync_buffer, random_vector, fs,
841 num_channels); 839 num_channels);
842 } 840 }
843 841
844 // TODO(turajs): This can be moved to BackgroundNoise class. 842 // TODO(turajs): This can be moved to BackgroundNoise class.
845 void Expand::GenerateBackgroundNoise(int16_t* random_vector, 843 void Expand::GenerateBackgroundNoise(int16_t* random_vector,
846 size_t channel, 844 size_t channel,
847 int16_t mute_slope, 845 int mute_slope,
848 bool too_many_expands, 846 bool too_many_expands,
849 size_t num_noise_samples, 847 size_t num_noise_samples,
850 int16_t* buffer) { 848 int16_t* buffer) {
851 static const int kNoiseLpcOrder = BackgroundNoise::kMaxLpcOrder; 849 static const int kNoiseLpcOrder = BackgroundNoise::kMaxLpcOrder;
852 int16_t scaled_random_vector[kMaxSampleRate / 8000 * 125]; 850 int16_t scaled_random_vector[kMaxSampleRate / 8000 * 125];
853 assert(num_noise_samples <= static_cast<size_t>(kMaxSampleRate / 8000 * 125)); 851 assert(num_noise_samples <= static_cast<size_t>(kMaxSampleRate / 8000 * 125));
854 int16_t* noise_samples = &buffer[kNoiseLpcOrder]; 852 int16_t* noise_samples = &buffer[kNoiseLpcOrder];
855 if (background_noise_->initialized()) { 853 if (background_noise_->initialized()) {
856 // Use background noise parameters. 854 // Use background noise parameters.
857 memcpy(noise_samples - kNoiseLpcOrder, 855 memcpy(noise_samples - kNoiseLpcOrder,
(...skipping 22 matching lines...) Expand all
880 &(noise_samples[num_noise_samples - kNoiseLpcOrder]), 878 &(noise_samples[num_noise_samples - kNoiseLpcOrder]),
881 kNoiseLpcOrder); 879 kNoiseLpcOrder);
882 880
883 // Unmute the background noise. 881 // Unmute the background noise.
884 int16_t bgn_mute_factor = background_noise_->MuteFactor(channel); 882 int16_t bgn_mute_factor = background_noise_->MuteFactor(channel);
885 NetEq::BackgroundNoiseMode bgn_mode = background_noise_->mode(); 883 NetEq::BackgroundNoiseMode bgn_mode = background_noise_->mode();
886 if (bgn_mode == NetEq::kBgnFade && too_many_expands && 884 if (bgn_mode == NetEq::kBgnFade && too_many_expands &&
887 bgn_mute_factor > 0) { 885 bgn_mute_factor > 0) {
888 // Fade BGN to zero. 886 // Fade BGN to zero.
889 // Calculate muting slope, approximately -2^18 / fs_hz. 887 // Calculate muting slope, approximately -2^18 / fs_hz.
890 int16_t mute_slope; 888 int mute_slope;
891 if (fs_hz_ == 8000) { 889 if (fs_hz_ == 8000) {
892 mute_slope = -32; 890 mute_slope = -32;
893 } else if (fs_hz_ == 16000) { 891 } else if (fs_hz_ == 16000) {
894 mute_slope = -16; 892 mute_slope = -16;
895 } else if (fs_hz_ == 32000) { 893 } else if (fs_hz_ == 32000) {
896 mute_slope = -8; 894 mute_slope = -8;
897 } else { 895 } else {
898 mute_slope = -5; 896 mute_slope = -5;
899 } 897 }
900 // Use UnmuteSignal function with negative slope. 898 // Use UnmuteSignal function with negative slope.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 const size_t kMaxRandSamples = RandomVector::kRandomTableSize; 938 const size_t kMaxRandSamples = RandomVector::kRandomTableSize;
941 while (samples_generated < length) { 939 while (samples_generated < length) {
942 size_t rand_length = std::min(length - samples_generated, kMaxRandSamples); 940 size_t rand_length = std::min(length - samples_generated, kMaxRandSamples);
943 random_vector_->IncreaseSeedIncrement(seed_increment); 941 random_vector_->IncreaseSeedIncrement(seed_increment);
944 random_vector_->Generate(rand_length, &random_vector[samples_generated]); 942 random_vector_->Generate(rand_length, &random_vector[samples_generated]);
945 samples_generated += rand_length; 943 samples_generated += rand_length;
946 } 944 }
947 } 945 }
948 946
949 } // namespace webrtc 947 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_coding/neteq/expand.h ('k') | webrtc/modules/audio_coding/neteq/merge.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698