| 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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, | 61 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, |
| 62 201, 202, 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 212, | 62 201, 202, 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 212, |
| 63 213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224, | 63 213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224, |
| 64 225, 226, 227, 228, 228, 229, 230, 231, 231, 232, 233, 234, 234, 235, 236, | 64 225, 226, 227, 228, 228, 229, 230, 231, 231, 232, 233, 234, 234, 235, 236, |
| 65 237, 238, 238, 239, 240, 241, 241, 242, 243, 244, 244, 245, 246, 247, 247, | 65 237, 238, 238, 239, 240, 241, 241, 242, 243, 244, 244, 245, 246, 247, 247, |
| 66 248, 249, 249, 250, 251, 252, 252, 253, 254, 255, 255 | 66 248, 249, 249, 250, 251, 252, 252, 253, 254, 255, 255 |
| 67 }; | 67 }; |
| 68 #endif // WEBRTC_DETECT_NEON || WEBRTC_HAS_NEON | 68 #endif // WEBRTC_DETECT_NEON || WEBRTC_HAS_NEON |
| 69 | 69 |
| 70 // Skip first frequency bins during estimation. (0 <= value < 64) | 70 // Skip first frequency bins during estimation. (0 <= value < 64) |
| 71 static const int kStartBand = 5; | 71 static const size_t kStartBand = 5; |
| 72 | 72 |
| 73 // hybrib Hanning & flat window | 73 // hybrib Hanning & flat window |
| 74 static const int16_t kBlocks80w128x[128] = { | 74 static const int16_t kBlocks80w128x[128] = { |
| 75 0, 536, 1072, 1606, 2139, 2669, 3196, 3720, 4240, 4756, 5
266, | 75 0, 536, 1072, 1606, 2139, 2669, 3196, 3720, 4240, 4756, 5
266, |
| 76 5771, 6270, 6762, 7246, 7723, 8192, 8652, 9102, 9543, 9974,
10394, | 76 5771, 6270, 6762, 7246, 7723, 8192, 8652, 9102, 9543, 9974,
10394, |
| 77 10803, 11200, 11585, 11958, 12318, 12665, 12998, 13318, 13623, 13913,
14189, | 77 10803, 11200, 11585, 11958, 12318, 12665, 12998, 13318, 13623, 13913,
14189, |
| 78 14449, 14694, 14924, 15137, 15334, 15515, 15679, 15826, 15956, 16069,
16165, | 78 14449, 14694, 14924, 15137, 15334, 15515, 15679, 15826, 15956, 16069,
16165, |
| 79 16244, 16305, 16349, 16375, 16384, 16384, 16384, 16384, 16384, 16384,
16384, | 79 16244, 16305, 16349, 16375, 16384, 16384, 16384, 16384, 16384, 16384,
16384, |
| 80 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
16384, | 80 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
16384, |
| 81 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
16384, | 81 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
16384, |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 355, 330 | 299 355, 330 |
| 300 }; | 300 }; |
| 301 | 301 |
| 302 // Update the noise estimation information. | 302 // Update the noise estimation information. |
| 303 static void UpdateNoiseEstimate(NoiseSuppressionFixedC* inst, int offset) { | 303 static void UpdateNoiseEstimate(NoiseSuppressionFixedC* inst, int offset) { |
| 304 int32_t tmp32no1 = 0; | 304 int32_t tmp32no1 = 0; |
| 305 int32_t tmp32no2 = 0; | 305 int32_t tmp32no2 = 0; |
| 306 int16_t tmp16 = 0; | 306 int16_t tmp16 = 0; |
| 307 const int16_t kExp2Const = 11819; // Q13 | 307 const int16_t kExp2Const = 11819; // Q13 |
| 308 | 308 |
| 309 int i = 0; | 309 size_t i = 0; |
| 310 | 310 |
| 311 tmp16 = WebRtcSpl_MaxValueW16(inst->noiseEstLogQuantile + offset, | 311 tmp16 = WebRtcSpl_MaxValueW16(inst->noiseEstLogQuantile + offset, |
| 312 inst->magnLen); | 312 inst->magnLen); |
| 313 // Guarantee a Q-domain as high as possible and still fit in int16 | 313 // Guarantee a Q-domain as high as possible and still fit in int16 |
| 314 inst->qNoise = 14 - (int) WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND( | 314 inst->qNoise = 14 - (int) WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND( |
| 315 kExp2Const, tmp16, 21); | 315 kExp2Const, tmp16, 21); |
| 316 for (i = 0; i < inst->magnLen; i++) { | 316 for (i = 0; i < inst->magnLen; i++) { |
| 317 // inst->quantile[i]=exp(inst->lquantile[offset+i]); | 317 // inst->quantile[i]=exp(inst->lquantile[offset+i]); |
| 318 // in Q21 | 318 // in Q21 |
| 319 tmp32no2 = kExp2Const * inst->noiseEstLogQuantile[offset + i]; | 319 tmp32no2 = kExp2Const * inst->noiseEstLogQuantile[offset + i]; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 334 static void NoiseEstimationC(NoiseSuppressionFixedC* inst, | 334 static void NoiseEstimationC(NoiseSuppressionFixedC* inst, |
| 335 uint16_t* magn, | 335 uint16_t* magn, |
| 336 uint32_t* noise, | 336 uint32_t* noise, |
| 337 int16_t* q_noise) { | 337 int16_t* q_noise) { |
| 338 int16_t lmagn[HALF_ANAL_BLOCKL], counter, countDiv; | 338 int16_t lmagn[HALF_ANAL_BLOCKL], counter, countDiv; |
| 339 int16_t countProd, delta, zeros, frac; | 339 int16_t countProd, delta, zeros, frac; |
| 340 int16_t log2, tabind, logval, tmp16, tmp16no1, tmp16no2; | 340 int16_t log2, tabind, logval, tmp16, tmp16no1, tmp16no2; |
| 341 const int16_t log2_const = 22713; // Q15 | 341 const int16_t log2_const = 22713; // Q15 |
| 342 const int16_t width_factor = 21845; | 342 const int16_t width_factor = 21845; |
| 343 | 343 |
| 344 int i, s, offset; | 344 size_t i, s, offset; |
| 345 | 345 |
| 346 tabind = inst->stages - inst->normData; | 346 tabind = inst->stages - inst->normData; |
| 347 assert(tabind < 9); | 347 assert(tabind < 9); |
| 348 assert(tabind > -9); | 348 assert(tabind > -9); |
| 349 if (tabind < 0) { | 349 if (tabind < 0) { |
| 350 logval = -WebRtcNsx_kLogTable[-tabind]; | 350 logval = -WebRtcNsx_kLogTable[-tabind]; |
| 351 } else { | 351 } else { |
| 352 logval = WebRtcNsx_kLogTable[tabind]; | 352 logval = WebRtcNsx_kLogTable[tabind]; |
| 353 } | 353 } |
| 354 | 354 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 } | 447 } |
| 448 | 448 |
| 449 for (i = 0; i < inst->magnLen; i++) { | 449 for (i = 0; i < inst->magnLen; i++) { |
| 450 noise[i] = (uint32_t)(inst->noiseEstQuantile[i]); // Q(qNoise) | 450 noise[i] = (uint32_t)(inst->noiseEstQuantile[i]); // Q(qNoise) |
| 451 } | 451 } |
| 452 (*q_noise) = (int16_t)inst->qNoise; | 452 (*q_noise) = (int16_t)inst->qNoise; |
| 453 } | 453 } |
| 454 | 454 |
| 455 // Filter the data in the frequency domain, and create spectrum. | 455 // Filter the data in the frequency domain, and create spectrum. |
| 456 static void PrepareSpectrumC(NoiseSuppressionFixedC* inst, int16_t* freq_buf) { | 456 static void PrepareSpectrumC(NoiseSuppressionFixedC* inst, int16_t* freq_buf) { |
| 457 int i = 0, j = 0; | 457 size_t i = 0, j = 0; |
| 458 | 458 |
| 459 for (i = 0; i < inst->magnLen; i++) { | 459 for (i = 0; i < inst->magnLen; i++) { |
| 460 inst->real[i] = (int16_t)((inst->real[i] * | 460 inst->real[i] = (int16_t)((inst->real[i] * |
| 461 (int16_t)(inst->noiseSupFilter[i])) >> 14); // Q(normData-stages) | 461 (int16_t)(inst->noiseSupFilter[i])) >> 14); // Q(normData-stages) |
| 462 inst->imag[i] = (int16_t)((inst->imag[i] * | 462 inst->imag[i] = (int16_t)((inst->imag[i] * |
| 463 (int16_t)(inst->noiseSupFilter[i])) >> 14); // Q(normData-stages) | 463 (int16_t)(inst->noiseSupFilter[i])) >> 14); // Q(normData-stages) |
| 464 } | 464 } |
| 465 | 465 |
| 466 freq_buf[0] = inst->real[0]; | 466 freq_buf[0] = inst->real[0]; |
| 467 freq_buf[1] = -inst->imag[0]; | 467 freq_buf[1] = -inst->imag[0]; |
| 468 for (i = 1, j = 2; i < inst->anaLen2; i += 1, j += 2) { | 468 for (i = 1, j = 2; i < inst->anaLen2; i += 1, j += 2) { |
| 469 freq_buf[j] = inst->real[i]; | 469 freq_buf[j] = inst->real[i]; |
| 470 freq_buf[j + 1] = -inst->imag[i]; | 470 freq_buf[j + 1] = -inst->imag[i]; |
| 471 } | 471 } |
| 472 freq_buf[inst->anaLen] = inst->real[inst->anaLen2]; | 472 freq_buf[inst->anaLen] = inst->real[inst->anaLen2]; |
| 473 freq_buf[inst->anaLen + 1] = -inst->imag[inst->anaLen2]; | 473 freq_buf[inst->anaLen + 1] = -inst->imag[inst->anaLen2]; |
| 474 } | 474 } |
| 475 | 475 |
| 476 // Denormalize the real-valued signal |in|, the output from inverse FFT. | 476 // Denormalize the real-valued signal |in|, the output from inverse FFT. |
| 477 static void DenormalizeC(NoiseSuppressionFixedC* inst, | 477 static void DenormalizeC(NoiseSuppressionFixedC* inst, |
| 478 int16_t* in, | 478 int16_t* in, |
| 479 int factor) { | 479 int factor) { |
| 480 int i = 0; | 480 size_t i = 0; |
| 481 int32_t tmp32 = 0; | 481 int32_t tmp32 = 0; |
| 482 for (i = 0; i < inst->anaLen; i += 1) { | 482 for (i = 0; i < inst->anaLen; i += 1) { |
| 483 tmp32 = WEBRTC_SPL_SHIFT_W32((int32_t)in[i], | 483 tmp32 = WEBRTC_SPL_SHIFT_W32((int32_t)in[i], |
| 484 factor - inst->normData); | 484 factor - inst->normData); |
| 485 inst->real[i] = WebRtcSpl_SatW32ToW16(tmp32); // Q0 | 485 inst->real[i] = WebRtcSpl_SatW32ToW16(tmp32); // Q0 |
| 486 } | 486 } |
| 487 } | 487 } |
| 488 | 488 |
| 489 // For the noise supression process, synthesis, read out fully processed | 489 // For the noise supression process, synthesis, read out fully processed |
| 490 // segment, and update synthesis buffer. | 490 // segment, and update synthesis buffer. |
| 491 static void SynthesisUpdateC(NoiseSuppressionFixedC* inst, | 491 static void SynthesisUpdateC(NoiseSuppressionFixedC* inst, |
| 492 int16_t* out_frame, | 492 int16_t* out_frame, |
| 493 int16_t gain_factor) { | 493 int16_t gain_factor) { |
| 494 int i = 0; | 494 size_t i = 0; |
| 495 int16_t tmp16a = 0; | 495 int16_t tmp16a = 0; |
| 496 int16_t tmp16b = 0; | 496 int16_t tmp16b = 0; |
| 497 int32_t tmp32 = 0; | 497 int32_t tmp32 = 0; |
| 498 | 498 |
| 499 // synthesis | 499 // synthesis |
| 500 for (i = 0; i < inst->anaLen; i++) { | 500 for (i = 0; i < inst->anaLen; i++) { |
| 501 tmp16a = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND( | 501 tmp16a = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND( |
| 502 inst->window[i], inst->real[i], 14); // Q0, window in Q14 | 502 inst->window[i], inst->real[i], 14); // Q0, window in Q14 |
| 503 tmp32 = WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(tmp16a, gain_factor, 13); // Q0 | 503 tmp32 = WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(tmp16a, gain_factor, 13); // Q0 |
| 504 // Down shift with rounding | 504 // Down shift with rounding |
| (...skipping 11 matching lines...) Expand all Loading... |
| 516 memcpy(inst->synthesisBuffer, inst->synthesisBuffer + inst->blockLen10ms, | 516 memcpy(inst->synthesisBuffer, inst->synthesisBuffer + inst->blockLen10ms, |
| 517 (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->synthesisBuffer)); | 517 (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->synthesisBuffer)); |
| 518 WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer | 518 WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer |
| 519 + inst->anaLen - inst->blockLen10ms, inst->blockLen10ms); | 519 + inst->anaLen - inst->blockLen10ms, inst->blockLen10ms); |
| 520 } | 520 } |
| 521 | 521 |
| 522 // Update analysis buffer for lower band, and window data before FFT. | 522 // Update analysis buffer for lower band, and window data before FFT. |
| 523 static void AnalysisUpdateC(NoiseSuppressionFixedC* inst, | 523 static void AnalysisUpdateC(NoiseSuppressionFixedC* inst, |
| 524 int16_t* out, | 524 int16_t* out, |
| 525 int16_t* new_speech) { | 525 int16_t* new_speech) { |
| 526 int i = 0; | 526 size_t i = 0; |
| 527 | 527 |
| 528 // For lower band update analysis buffer. | 528 // For lower band update analysis buffer. |
| 529 memcpy(inst->analysisBuffer, inst->analysisBuffer + inst->blockLen10ms, | 529 memcpy(inst->analysisBuffer, inst->analysisBuffer + inst->blockLen10ms, |
| 530 (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->analysisBuffer)); | 530 (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->analysisBuffer)); |
| 531 memcpy(inst->analysisBuffer + inst->anaLen - inst->blockLen10ms, new_speech, | 531 memcpy(inst->analysisBuffer + inst->anaLen - inst->blockLen10ms, new_speech, |
| 532 inst->blockLen10ms * sizeof(*inst->analysisBuffer)); | 532 inst->blockLen10ms * sizeof(*inst->analysisBuffer)); |
| 533 | 533 |
| 534 // Window data before FFT. | 534 // Window data before FFT. |
| 535 for (i = 0; i < inst->anaLen; i++) { | 535 for (i = 0; i < inst->anaLen; i++) { |
| 536 out[i] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND( | 536 out[i] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND( |
| 537 inst->window[i], inst->analysisBuffer[i], 14); // Q0 | 537 inst->window[i], inst->analysisBuffer[i], 14); // Q0 |
| 538 } | 538 } |
| 539 } | 539 } |
| 540 | 540 |
| 541 // Normalize the real-valued signal |in|, the input to forward FFT. | 541 // Normalize the real-valued signal |in|, the input to forward FFT. |
| 542 static void NormalizeRealBufferC(NoiseSuppressionFixedC* inst, | 542 static void NormalizeRealBufferC(NoiseSuppressionFixedC* inst, |
| 543 const int16_t* in, | 543 const int16_t* in, |
| 544 int16_t* out) { | 544 int16_t* out) { |
| 545 int i = 0; | 545 size_t i = 0; |
| 546 assert(inst->normData >= 0); | 546 assert(inst->normData >= 0); |
| 547 for (i = 0; i < inst->anaLen; ++i) { | 547 for (i = 0; i < inst->anaLen; ++i) { |
| 548 out[i] = in[i] << inst->normData; // Q(normData) | 548 out[i] = in[i] << inst->normData; // Q(normData) |
| 549 } | 549 } |
| 550 } | 550 } |
| 551 | 551 |
| 552 // Declare function pointers. | 552 // Declare function pointers. |
| 553 NoiseEstimation WebRtcNsx_NoiseEstimation; | 553 NoiseEstimation WebRtcNsx_NoiseEstimation; |
| 554 PrepareSpectrum WebRtcNsx_PrepareSpectrum; | 554 PrepareSpectrum WebRtcNsx_PrepareSpectrum; |
| 555 SynthesisUpdate WebRtcNsx_SynthesisUpdate; | 555 SynthesisUpdate WebRtcNsx_SynthesisUpdate; |
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1019 void WebRtcNsx_ComputeSpectralFlatness(NoiseSuppressionFixedC* inst, | 1019 void WebRtcNsx_ComputeSpectralFlatness(NoiseSuppressionFixedC* inst, |
| 1020 uint16_t* magn) { | 1020 uint16_t* magn) { |
| 1021 uint32_t tmpU32; | 1021 uint32_t tmpU32; |
| 1022 uint32_t avgSpectralFlatnessNum, avgSpectralFlatnessDen; | 1022 uint32_t avgSpectralFlatnessNum, avgSpectralFlatnessDen; |
| 1023 | 1023 |
| 1024 int32_t tmp32; | 1024 int32_t tmp32; |
| 1025 int32_t currentSpectralFlatness, logCurSpectralFlatness; | 1025 int32_t currentSpectralFlatness, logCurSpectralFlatness; |
| 1026 | 1026 |
| 1027 int16_t zeros, frac, intPart; | 1027 int16_t zeros, frac, intPart; |
| 1028 | 1028 |
| 1029 int i; | 1029 size_t i; |
| 1030 | 1030 |
| 1031 // for flatness | 1031 // for flatness |
| 1032 avgSpectralFlatnessNum = 0; | 1032 avgSpectralFlatnessNum = 0; |
| 1033 avgSpectralFlatnessDen = inst->sumMagn - (uint32_t)magn[0]; // Q(normData-stag
es) | 1033 avgSpectralFlatnessDen = inst->sumMagn - (uint32_t)magn[0]; // Q(normData-stag
es) |
| 1034 | 1034 |
| 1035 // compute log of ratio of the geometric to arithmetic mean: check for log(0)
case | 1035 // compute log of ratio of the geometric to arithmetic mean: check for log(0)
case |
| 1036 // flatness = exp( sum(log(magn[i]))/N - log(sum(magn[i])/N) ) | 1036 // flatness = exp( sum(log(magn[i]))/N - log(sum(magn[i])/N) ) |
| 1037 // = exp( sum(log(magn[i]))/N ) * N / sum(magn[i]) | 1037 // = exp( sum(log(magn[i]))/N ) * N / sum(magn[i]) |
| 1038 // = 2^( sum(log2(magn[i]))/N - (log2(sum(magn[i])) - log2(N)) ) [Thi
s is used] | 1038 // = 2^( sum(log2(magn[i]))/N - (log2(sum(magn[i])) - log2(N)) ) [Thi
s is used] |
| 1039 for (i = 1; i < inst->magnLen; i++) { | 1039 for (i = 1; i < inst->magnLen; i++) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1092 | 1092 |
| 1093 uint32_t tmpU32no1, tmpU32no2; | 1093 uint32_t tmpU32no1, tmpU32no2; |
| 1094 uint32_t varMagnUFX, varPauseUFX, avgDiffNormMagnUFX; | 1094 uint32_t varMagnUFX, varPauseUFX, avgDiffNormMagnUFX; |
| 1095 | 1095 |
| 1096 int32_t tmp32no1, tmp32no2; | 1096 int32_t tmp32no1, tmp32no2; |
| 1097 int32_t avgPauseFX, avgMagnFX, covMagnPauseFX; | 1097 int32_t avgPauseFX, avgMagnFX, covMagnPauseFX; |
| 1098 int32_t maxPause, minPause; | 1098 int32_t maxPause, minPause; |
| 1099 | 1099 |
| 1100 int16_t tmp16no1; | 1100 int16_t tmp16no1; |
| 1101 | 1101 |
| 1102 int i, norm32, nShifts; | 1102 size_t i; |
| 1103 int norm32, nShifts; |
| 1103 | 1104 |
| 1104 avgPauseFX = 0; | 1105 avgPauseFX = 0; |
| 1105 maxPause = 0; | 1106 maxPause = 0; |
| 1106 minPause = inst->avgMagnPause[0]; // Q(prevQMagn) | 1107 minPause = inst->avgMagnPause[0]; // Q(prevQMagn) |
| 1107 // compute average quantities | 1108 // compute average quantities |
| 1108 for (i = 0; i < inst->magnLen; i++) { | 1109 for (i = 0; i < inst->magnLen; i++) { |
| 1109 // Compute mean of magn_pause | 1110 // Compute mean of magn_pause |
| 1110 avgPauseFX += inst->avgMagnPause[i]; // in Q(prevQMagn) | 1111 avgPauseFX += inst->avgMagnPause[i]; // in Q(prevQMagn) |
| 1111 maxPause = WEBRTC_SPL_MAX(maxPause, inst->avgMagnPause[i]); | 1112 maxPause = WEBRTC_SPL_MAX(maxPause, inst->avgMagnPause[i]); |
| 1112 minPause = WEBRTC_SPL_MIN(minPause, inst->avgMagnPause[i]); | 1113 minPause = WEBRTC_SPL_MIN(minPause, inst->avgMagnPause[i]); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1191 uint16_t sum_log_magn_u16 = 0; | 1192 uint16_t sum_log_magn_u16 = 0; |
| 1192 uint16_t tmp_u16 = 0; | 1193 uint16_t tmp_u16 = 0; |
| 1193 | 1194 |
| 1194 int16_t sum_log_i = 0; | 1195 int16_t sum_log_i = 0; |
| 1195 int16_t sum_log_i_square = 0; | 1196 int16_t sum_log_i_square = 0; |
| 1196 int16_t frac = 0; | 1197 int16_t frac = 0; |
| 1197 int16_t log2 = 0; | 1198 int16_t log2 = 0; |
| 1198 int16_t matrix_determinant = 0; | 1199 int16_t matrix_determinant = 0; |
| 1199 int16_t maxWinData; | 1200 int16_t maxWinData; |
| 1200 | 1201 |
| 1201 int i, j; | 1202 size_t i, j; |
| 1202 int zeros; | 1203 int zeros; |
| 1203 int net_norm = 0; | 1204 int net_norm = 0; |
| 1204 int right_shifts_in_magnU16 = 0; | 1205 int right_shifts_in_magnU16 = 0; |
| 1205 int right_shifts_in_initMagnEst = 0; | 1206 int right_shifts_in_initMagnEst = 0; |
| 1206 | 1207 |
| 1207 int16_t winData_buff[ANAL_BLOCKL_MAX * 2 + 16]; | 1208 int16_t winData_buff[ANAL_BLOCKL_MAX * 2 + 16]; |
| 1208 int16_t realImag_buff[ANAL_BLOCKL_MAX * 2 + 16]; | 1209 int16_t realImag_buff[ANAL_BLOCKL_MAX * 2 + 16]; |
| 1209 | 1210 |
| 1210 // Align the structures to 32-byte boundary for the FFT function. | 1211 // Align the structures to 32-byte boundary for the FFT function. |
| 1211 int16_t* winData = (int16_t*) (((uintptr_t)winData_buff + 31) & ~31); | 1212 int16_t* winData = (int16_t*) (((uintptr_t)winData_buff + 31) & ~31); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1423 int16_t rfft_out_buff[ANAL_BLOCKL_MAX * 2 + 16]; | 1424 int16_t rfft_out_buff[ANAL_BLOCKL_MAX * 2 + 16]; |
| 1424 | 1425 |
| 1425 // Align the structures to 32-byte boundary for the FFT function. | 1426 // Align the structures to 32-byte boundary for the FFT function. |
| 1426 int16_t* realImag = (int16_t*) (((uintptr_t)realImag_buff + 31) & ~31); | 1427 int16_t* realImag = (int16_t*) (((uintptr_t)realImag_buff + 31) & ~31); |
| 1427 int16_t* rfft_out = (int16_t*) (((uintptr_t) rfft_out_buff + 31) & ~31); | 1428 int16_t* rfft_out = (int16_t*) (((uintptr_t) rfft_out_buff + 31) & ~31); |
| 1428 | 1429 |
| 1429 int16_t tmp16no1, tmp16no2; | 1430 int16_t tmp16no1, tmp16no2; |
| 1430 int16_t energyRatio; | 1431 int16_t energyRatio; |
| 1431 int16_t gainFactor, gainFactor1, gainFactor2; | 1432 int16_t gainFactor, gainFactor1, gainFactor2; |
| 1432 | 1433 |
| 1433 int i; | 1434 size_t i; |
| 1434 int outCIFFT; | 1435 int outCIFFT; |
| 1435 int scaleEnergyOut = 0; | 1436 int scaleEnergyOut = 0; |
| 1436 | 1437 |
| 1437 if (inst->zeroInputSignal) { | 1438 if (inst->zeroInputSignal) { |
| 1438 // synthesize the special case of zero input | 1439 // synthesize the special case of zero input |
| 1439 // read out fully processed segment | 1440 // read out fully processed segment |
| 1440 for (i = 0; i < inst->blockLen10ms; i++) { | 1441 for (i = 0; i < inst->blockLen10ms; i++) { |
| 1441 outFrame[i] = inst->synthesisBuffer[i]; // Q0 | 1442 outFrame[i] = inst->synthesisBuffer[i]; // Q0 |
| 1442 } | 1443 } |
| 1443 // update synthesis buffer | 1444 // update synthesis buffer |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1524 uint16_t magnU16[HALF_ANAL_BLOCKL]; | 1525 uint16_t magnU16[HALF_ANAL_BLOCKL]; |
| 1525 uint16_t prevNoiseU16[HALF_ANAL_BLOCKL]; | 1526 uint16_t prevNoiseU16[HALF_ANAL_BLOCKL]; |
| 1526 uint16_t nonSpeechProbFinal[HALF_ANAL_BLOCKL]; | 1527 uint16_t nonSpeechProbFinal[HALF_ANAL_BLOCKL]; |
| 1527 uint16_t gammaNoise, prevGammaNoise; | 1528 uint16_t gammaNoise, prevGammaNoise; |
| 1528 uint16_t noiseSupFilterTmp[HALF_ANAL_BLOCKL]; | 1529 uint16_t noiseSupFilterTmp[HALF_ANAL_BLOCKL]; |
| 1529 | 1530 |
| 1530 int16_t qMagn, qNoise; | 1531 int16_t qMagn, qNoise; |
| 1531 int16_t avgProbSpeechHB, gainModHB, avgFilterGainHB, gainTimeDomainHB; | 1532 int16_t avgProbSpeechHB, gainModHB, avgFilterGainHB, gainTimeDomainHB; |
| 1532 int16_t pink_noise_exp_avg = 0; | 1533 int16_t pink_noise_exp_avg = 0; |
| 1533 | 1534 |
| 1534 int i, j; | 1535 size_t i, j; |
| 1535 int nShifts, postShifts; | 1536 int nShifts, postShifts; |
| 1536 int norm32no1, norm32no2; | 1537 int norm32no1, norm32no2; |
| 1537 int flag, sign; | 1538 int flag, sign; |
| 1538 int q_domain_to_use = 0; | 1539 int q_domain_to_use = 0; |
| 1539 | 1540 |
| 1540 // Code for ARMv7-Neon platform assumes the following: | 1541 // Code for ARMv7-Neon platform assumes the following: |
| 1541 assert(inst->anaLen > 0); | 1542 assert(inst->anaLen > 0); |
| 1542 assert(inst->anaLen2 > 0); | 1543 assert(inst->anaLen2 > 0); |
| 1543 assert(inst->anaLen % 16 == 0); | 1544 assert(inst->anaLen % 16 == 0); |
| 1544 assert(inst->anaLen2 % 8 == 0); | 1545 assert(inst->anaLen2 % 8 == 0); |
| 1545 assert(inst->blockLen10ms > 0); | 1546 assert(inst->blockLen10ms > 0); |
| 1546 assert(inst->blockLen10ms % 16 == 0); | 1547 assert(inst->blockLen10ms % 16 == 0); |
| 1547 assert(inst->magnLen == inst->anaLen2 + 1); | 1548 assert(inst->magnLen == inst->anaLen2 + 1); |
| 1548 | 1549 |
| 1549 #ifdef NS_FILEDEBUG | 1550 #ifdef NS_FILEDEBUG |
| 1550 if (fwrite(spframe, sizeof(short), | 1551 if (fwrite(spframe, sizeof(short), |
| 1551 inst->blockLen10ms, inst->infile) != inst->blockLen10ms) { | 1552 inst->blockLen10ms, inst->infile) != inst->blockLen10ms) { |
| 1552 assert(false); | 1553 assert(false); |
| 1553 } | 1554 } |
| 1554 #endif | 1555 #endif |
| 1555 | 1556 |
| 1556 // Check that initialization has been done | 1557 // Check that initialization has been done |
| 1557 assert(inst->initFlag == 1); | 1558 assert(inst->initFlag == 1); |
| 1558 assert((num_bands - 1) <= NUM_HIGH_BANDS_MAX); | 1559 assert((num_bands - 1) <= NUM_HIGH_BANDS_MAX); |
| 1559 | 1560 |
| 1560 const short* const* speechFrameHB = NULL; | 1561 const short* const* speechFrameHB = NULL; |
| 1561 short* const* outFrameHB = NULL; | 1562 short* const* outFrameHB = NULL; |
| 1562 int num_high_bands = 0; | 1563 size_t num_high_bands = 0; |
| 1563 if (num_bands > 1) { | 1564 if (num_bands > 1) { |
| 1564 speechFrameHB = &speechFrame[1]; | 1565 speechFrameHB = &speechFrame[1]; |
| 1565 outFrameHB = &outFrame[1]; | 1566 outFrameHB = &outFrame[1]; |
| 1566 num_high_bands = num_bands - 1; | 1567 num_high_bands = (size_t)(num_bands - 1); |
| 1567 } | 1568 } |
| 1568 | 1569 |
| 1569 // Store speechFrame and transform to frequency domain | 1570 // Store speechFrame and transform to frequency domain |
| 1570 WebRtcNsx_DataAnalysis(inst, (short*)speechFrame[0], magnU16); | 1571 WebRtcNsx_DataAnalysis(inst, (short*)speechFrame[0], magnU16); |
| 1571 | 1572 |
| 1572 if (inst->zeroInputSignal) { | 1573 if (inst->zeroInputSignal) { |
| 1573 WebRtcNsx_DataSynthesis(inst, outFrame[0]); | 1574 WebRtcNsx_DataSynthesis(inst, outFrame[0]); |
| 1574 | 1575 |
| 1575 if (num_bands > 1) { | 1576 if (num_bands > 1) { |
| 1576 // update analysis buffer for H band | 1577 // update analysis buffer for H band |
| (...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2102 | 2103 |
| 2103 //apply gain | 2104 //apply gain |
| 2104 for (i = 0; i < num_high_bands; ++i) { | 2105 for (i = 0; i < num_high_bands; ++i) { |
| 2105 for (j = 0; j < inst->blockLen10ms; j++) { | 2106 for (j = 0; j < inst->blockLen10ms; j++) { |
| 2106 outFrameHB[i][j] = (int16_t)((gainTimeDomainHB * | 2107 outFrameHB[i][j] = (int16_t)((gainTimeDomainHB * |
| 2107 inst->dataBufHBFX[i][j]) >> 14); // Q0 | 2108 inst->dataBufHBFX[i][j]) >> 14); // Q0 |
| 2108 } | 2109 } |
| 2109 } | 2110 } |
| 2110 } // end of H band gain computation | 2111 } // end of H band gain computation |
| 2111 } | 2112 } |
| OLD | NEW |