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 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 DspHelper::CrossFade(voiced_vector, unvoiced_vector, temp_lenght, | 220 DspHelper::CrossFade(voiced_vector, unvoiced_vector, temp_lenght, |
221 ¶meters.current_voice_mix_factor, | 221 ¶meters.current_voice_mix_factor, |
222 mix_factor_increment, temp_data); | 222 mix_factor_increment, temp_data); |
223 | 223 |
224 // End of cross-fading period was reached before end of expanded signal | 224 // End of cross-fading period was reached before end of expanded signal |
225 // path. Mix the rest with a fixed mixing factor. | 225 // path. Mix the rest with a fixed mixing factor. |
226 if (temp_lenght < current_lag) { | 226 if (temp_lenght < current_lag) { |
227 if (mix_factor_increment != 0) { | 227 if (mix_factor_increment != 0) { |
228 parameters.current_voice_mix_factor = parameters.voice_mix_factor; | 228 parameters.current_voice_mix_factor = parameters.voice_mix_factor; |
229 } | 229 } |
230 int temp_scale = 16384 - parameters.current_voice_mix_factor; | 230 int16_t temp_scale = 16384 - parameters.current_voice_mix_factor; |
231 WebRtcSpl_ScaleAndAddVectorsWithRound( | 231 WebRtcSpl_ScaleAndAddVectorsWithRound( |
232 voiced_vector + temp_lenght, parameters.current_voice_mix_factor, | 232 voiced_vector + temp_lenght, parameters.current_voice_mix_factor, |
233 unvoiced_vector + temp_lenght, temp_scale, 14, | 233 unvoiced_vector + temp_lenght, temp_scale, 14, |
234 temp_data + temp_lenght, static_cast<int>(current_lag - temp_lenght)); | 234 temp_data + temp_lenght, static_cast<int>(current_lag - temp_lenght)); |
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. |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
662 128, | 662 128, |
663 unvoiced_prescale); | 663 unvoiced_prescale); |
664 | 664 |
665 // Normalize |unvoiced_energy| to 28 or 29 bits to preserve sqrt() accuracy. | 665 // Normalize |unvoiced_energy| to 28 or 29 bits to preserve sqrt() accuracy. |
666 int16_t unvoiced_scale = WebRtcSpl_NormW32(unvoiced_energy) - 3; | 666 int16_t unvoiced_scale = WebRtcSpl_NormW32(unvoiced_energy) - 3; |
667 // Make sure we do an odd number of shifts since we already have 7 shifts | 667 // Make sure we do an odd number of shifts since we already have 7 shifts |
668 // from dividing with 128 earlier. This will make the total scale factor | 668 // from dividing with 128 earlier. This will make the total scale factor |
669 // even, which is suitable for the sqrt. | 669 // even, which is suitable for the sqrt. |
670 unvoiced_scale += ((unvoiced_scale & 0x1) ^ 0x1); | 670 unvoiced_scale += ((unvoiced_scale & 0x1) ^ 0x1); |
671 unvoiced_energy = WEBRTC_SPL_SHIFT_W32(unvoiced_energy, unvoiced_scale); | 671 unvoiced_energy = WEBRTC_SPL_SHIFT_W32(unvoiced_energy, unvoiced_scale); |
672 int32_t unvoiced_gain = WebRtcSpl_SqrtFloor(unvoiced_energy); | 672 int16_t unvoiced_gain = |
| 673 static_cast<int16_t>(WebRtcSpl_SqrtFloor(unvoiced_energy)); |
673 parameters.ar_gain_scale = 13 | 674 parameters.ar_gain_scale = 13 |
674 + (unvoiced_scale + 7 - unvoiced_prescale) / 2; | 675 + (unvoiced_scale + 7 - unvoiced_prescale) / 2; |
675 parameters.ar_gain = unvoiced_gain; | 676 parameters.ar_gain = unvoiced_gain; |
676 | 677 |
677 // Calculate voice_mix_factor from corr_coefficient. | 678 // Calculate voice_mix_factor from corr_coefficient. |
678 // Let x = corr_coefficient. Then, we compute: | 679 // Let x = corr_coefficient. Then, we compute: |
679 // if (x > 0.48) | 680 // if (x > 0.48) |
680 // voice_mix_factor = (-5179 + 19931x - 16422x^2 + 5776x^3) / 4096; | 681 // voice_mix_factor = (-5179 + 19931x - 16422x^2 + 5776x^3) / 4096; |
681 // else | 682 // else |
682 // voice_mix_factor = 0; | 683 // voice_mix_factor = 0; |
(...skipping 19 matching lines...) Expand all Loading... |
702 // |expand_vector0| and |expand_vector1|. | 703 // |expand_vector0| and |expand_vector1|. |
703 int16_t slope = amplitude_ratio; | 704 int16_t slope = amplitude_ratio; |
704 if (slope > 12288) { | 705 if (slope > 12288) { |
705 // slope > 1.5. | 706 // slope > 1.5. |
706 // Calculate (1 - (1 / slope)) / distortion_lag = | 707 // Calculate (1 - (1 / slope)) / distortion_lag = |
707 // (slope - 1) / (distortion_lag * slope). | 708 // (slope - 1) / (distortion_lag * slope). |
708 // |slope| is in Q13, so 1 corresponds to 8192. Shift up to Q25 before | 709 // |slope| is in Q13, so 1 corresponds to 8192. Shift up to Q25 before |
709 // the division. | 710 // the division. |
710 // Shift the denominator from Q13 to Q5 before the division. The result of | 711 // Shift the denominator from Q13 to Q5 before the division. The result of |
711 // the division will then be in Q20. | 712 // the division will then be in Q20. |
712 int16_t temp_ratio = WebRtcSpl_DivW32W16((slope - 8192) << 12, | 713 int16_t temp_ratio = WebRtcSpl_DivW32W16( |
713 (distortion_lag * slope) >> 8); | 714 (slope - 8192) << 12, |
| 715 static_cast<int16_t>((distortion_lag * slope) >> 8)); |
714 if (slope > 14746) { | 716 if (slope > 14746) { |
715 // slope > 1.8. | 717 // slope > 1.8. |
716 // Divide by 2, with proper rounding. | 718 // Divide by 2, with proper rounding. |
717 parameters.mute_slope = (temp_ratio + 1) / 2; | 719 parameters.mute_slope = (temp_ratio + 1) / 2; |
718 } else { | 720 } else { |
719 // Divide by 8, with proper rounding. | 721 // Divide by 8, with proper rounding. |
720 parameters.mute_slope = (temp_ratio + 4) / 8; | 722 parameters.mute_slope = (temp_ratio + 4) / 8; |
721 } | 723 } |
722 parameters.onset = true; | 724 parameters.onset = true; |
723 } else { | 725 } else { |
724 // Calculate (1 - slope) / distortion_lag. | 726 // Calculate (1 - slope) / distortion_lag. |
725 // Shift |slope| by 7 to Q20 before the division. The result is in Q20. | 727 // Shift |slope| by 7 to Q20 before the division. The result is in Q20. |
726 parameters.mute_slope = WebRtcSpl_DivW32W16((8192 - slope) << 7, | 728 parameters.mute_slope = WebRtcSpl_DivW32W16( |
727 distortion_lag); | 729 (8192 - slope) << 7, static_cast<int16_t>(distortion_lag)); |
728 if (parameters.voice_mix_factor <= 13107) { | 730 if (parameters.voice_mix_factor <= 13107) { |
729 // Make sure the mute factor decreases from 1.0 to 0.9 in no more than | 731 // Make sure the mute factor decreases from 1.0 to 0.9 in no more than |
730 // 6.25 ms. | 732 // 6.25 ms. |
731 // mute_slope >= 0.005 / fs_mult in Q20. | 733 // mute_slope >= 0.005 / fs_mult in Q20. |
732 parameters.mute_slope = std::max(static_cast<int16_t>(5243 / fs_mult), | 734 parameters.mute_slope = std::max(static_cast<int16_t>(5243 / fs_mult), |
733 parameters.mute_slope); | 735 parameters.mute_slope); |
734 } else if (slope > 8028) { | 736 } else if (slope > 8028) { |
735 parameters.mute_slope = 0; | 737 parameters.mute_slope = 0; |
736 } | 738 } |
737 parameters.onset = false; | 739 parameters.onset = false; |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 WebRtcSpl_CrossCorrelation( | 805 WebRtcSpl_CrossCorrelation( |
804 correlation, | 806 correlation, |
805 &downsampled_input[kDownsampledLength - kCorrelationLength], | 807 &downsampled_input[kDownsampledLength - kCorrelationLength], |
806 &downsampled_input[kDownsampledLength - kCorrelationLength | 808 &downsampled_input[kDownsampledLength - kCorrelationLength |
807 - kCorrelationStartLag], | 809 - kCorrelationStartLag], |
808 kCorrelationLength, kNumCorrelationLags, kCorrelationShift, -1); | 810 kCorrelationLength, kNumCorrelationLags, kCorrelationShift, -1); |
809 | 811 |
810 // Normalize and move data from 32-bit to 16-bit vector. | 812 // Normalize and move data from 32-bit to 16-bit vector. |
811 int32_t max_correlation = WebRtcSpl_MaxAbsValueW32(correlation, | 813 int32_t max_correlation = WebRtcSpl_MaxAbsValueW32(correlation, |
812 kNumCorrelationLags); | 814 kNumCorrelationLags); |
813 int16_t norm_shift2 = std::max(18 - WebRtcSpl_NormW32(max_correlation), 0); | 815 int16_t norm_shift2 = static_cast<int16_t>( |
| 816 std::max(18 - WebRtcSpl_NormW32(max_correlation), 0)); |
814 WebRtcSpl_VectorBitShiftW32ToW16(output, kNumCorrelationLags, correlation, | 817 WebRtcSpl_VectorBitShiftW32ToW16(output, kNumCorrelationLags, correlation, |
815 norm_shift2); | 818 norm_shift2); |
816 // Total scale factor (right shifts) of correlation value. | 819 // Total scale factor (right shifts) of correlation value. |
817 *output_scale = 2 * norm_shift + kCorrelationShift + norm_shift2; | 820 *output_scale = 2 * norm_shift + kCorrelationShift + norm_shift2; |
818 return kNumCorrelationLags; | 821 return kNumCorrelationLags; |
819 } | 822 } |
820 | 823 |
821 void Expand::UpdateLagIndex() { | 824 void Expand::UpdateLagIndex() { |
822 current_lag_index_ = current_lag_index_ + lag_index_direction_; | 825 current_lag_index_ = current_lag_index_ + lag_index_direction_; |
823 // Change direction if needed. | 826 // Change direction if needed. |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
921 } | 924 } |
922 } | 925 } |
923 // Update mute_factor in BackgroundNoise class. | 926 // Update mute_factor in BackgroundNoise class. |
924 background_noise_->SetMuteFactor(channel, bgn_mute_factor); | 927 background_noise_->SetMuteFactor(channel, bgn_mute_factor); |
925 } else { | 928 } else { |
926 // BGN parameters have not been initialized; use zero noise. | 929 // BGN parameters have not been initialized; use zero noise. |
927 memset(noise_samples, 0, sizeof(int16_t) * num_noise_samples); | 930 memset(noise_samples, 0, sizeof(int16_t) * num_noise_samples); |
928 } | 931 } |
929 } | 932 } |
930 | 933 |
931 void Expand::GenerateRandomVector(int seed_increment, | 934 void Expand::GenerateRandomVector(int16_t seed_increment, |
932 size_t length, | 935 size_t length, |
933 int16_t* random_vector) { | 936 int16_t* random_vector) { |
934 // TODO(turajs): According to hlundin The loop should not be needed. Should be | 937 // TODO(turajs): According to hlundin The loop should not be needed. Should be |
935 // just as good to generate all of the vector in one call. | 938 // just as good to generate all of the vector in one call. |
936 size_t samples_generated = 0; | 939 size_t samples_generated = 0; |
937 const size_t kMaxRandSamples = RandomVector::kRandomTableSize; | 940 const size_t kMaxRandSamples = RandomVector::kRandomTableSize; |
938 while (samples_generated < length) { | 941 while (samples_generated < length) { |
939 size_t rand_length = std::min(length - samples_generated, kMaxRandSamples); | 942 size_t rand_length = std::min(length - samples_generated, kMaxRandSamples); |
940 random_vector_->IncreaseSeedIncrement(seed_increment); | 943 random_vector_->IncreaseSeedIncrement(seed_increment); |
941 random_vector_->Generate(rand_length, &random_vector[samples_generated]); | 944 random_vector_->Generate(rand_length, &random_vector[samples_generated]); |
942 samples_generated += rand_length; | 945 samples_generated += rand_length; |
943 } | 946 } |
944 } | 947 } |
945 | 948 |
946 } // namespace webrtc | 949 } // namespace webrtc |
OLD | NEW |