| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|