OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 26 matching lines...) Expand all Loading... |
37 const float pi2 = 6.28318530717959f; | 37 const float pi2 = 6.28318530717959f; |
38 const float pi2t = pi2 / 32768; | 38 const float pi2t = pi2 / 32768; |
39 | 39 |
40 // Generate a uniform random array on [0 1] | 40 // Generate a uniform random array on [0 1] |
41 WebRtcSpl_RandUArray(randW16, PART_LEN, &aec->seed); | 41 WebRtcSpl_RandUArray(randW16, PART_LEN, &aec->seed); |
42 | 42 |
43 int16_t* randWptr = randW16; | 43 int16_t* randWptr = randW16; |
44 float randTemp, randTemp2, randTemp3, randTemp4; | 44 float randTemp, randTemp2, randTemp3, randTemp4; |
45 int32_t tmp1s, tmp2s, tmp3s, tmp4s; | 45 int32_t tmp1s, tmp2s, tmp3s, tmp4s; |
46 | 46 |
47 for (i = 0; i < PART_LEN; i+=4) { | 47 for (i = 0; i < PART_LEN; i += 4) { |
48 __asm __volatile ( | 48 __asm __volatile ( |
49 ".set push \n\t" | 49 ".set push \n\t" |
50 ".set noreorder \n\t" | 50 ".set noreorder \n\t" |
51 "lh %[tmp1s], 0(%[randWptr]) \n\t" | 51 "lh %[tmp1s], 0(%[randWptr]) \n\t" |
52 "lh %[tmp2s], 2(%[randWptr]) \n\t" | 52 "lh %[tmp2s], 2(%[randWptr]) \n\t" |
53 "lh %[tmp3s], 4(%[randWptr]) \n\t" | 53 "lh %[tmp3s], 4(%[randWptr]) \n\t" |
54 "lh %[tmp4s], 6(%[randWptr]) \n\t" | 54 "lh %[tmp4s], 6(%[randWptr]) \n\t" |
55 "mtc1 %[tmp1s], %[randTemp] \n\t" | 55 "mtc1 %[tmp1s], %[randTemp] \n\t" |
56 "mtc1 %[tmp2s], %[randTemp2] \n\t" | 56 "mtc1 %[tmp2s], %[randTemp2] \n\t" |
57 "mtc1 %[tmp3s], %[randTemp3] \n\t" | 57 "mtc1 %[tmp3s], %[randTemp3] \n\t" |
(...skipping 10 matching lines...) Expand all Loading... |
68 ".set pop \n\t" | 68 ".set pop \n\t" |
69 : [randWptr] "+r" (randWptr), [randTemp] "=&f" (randTemp), | 69 : [randWptr] "+r" (randWptr), [randTemp] "=&f" (randTemp), |
70 [randTemp2] "=&f" (randTemp2), [randTemp3] "=&f" (randTemp3), | 70 [randTemp2] "=&f" (randTemp2), [randTemp3] "=&f" (randTemp3), |
71 [randTemp4] "=&f" (randTemp4), [tmp1s] "=&r" (tmp1s), | 71 [randTemp4] "=&f" (randTemp4), [tmp1s] "=&r" (tmp1s), |
72 [tmp2s] "=&r" (tmp2s), [tmp3s] "=&r" (tmp3s), | 72 [tmp2s] "=&r" (tmp2s), [tmp3s] "=&r" (tmp3s), |
73 [tmp4s] "=&r" (tmp4s) | 73 [tmp4s] "=&r" (tmp4s) |
74 : [pi2t] "f" (pi2t) | 74 : [pi2t] "f" (pi2t) |
75 : "memory" | 75 : "memory" |
76 ); | 76 ); |
77 | 77 |
78 u[i+1][0] = cosf(randTemp); | 78 u[i + 1][0] = cosf(randTemp); |
79 u[i+1][1] = sinf(randTemp); | 79 u[i + 1][1] = sinf(randTemp); |
80 u[i+2][0] = cosf(randTemp2); | 80 u[i + 2][0] = cosf(randTemp2); |
81 u[i+2][1] = sinf(randTemp2); | 81 u[i + 2][1] = sinf(randTemp2); |
82 u[i+3][0] = cosf(randTemp3); | 82 u[i + 3][0] = cosf(randTemp3); |
83 u[i+3][1] = sinf(randTemp3); | 83 u[i + 3][1] = sinf(randTemp3); |
84 u[i+4][0] = cosf(randTemp4); | 84 u[i + 4][0] = cosf(randTemp4); |
85 u[i+4][1] = sinf(randTemp4); | 85 u[i + 4][1] = sinf(randTemp4); |
86 } | 86 } |
87 | 87 |
88 // Reject LF noise | 88 // Reject LF noise |
89 float* u_ptr = &u[1][0]; | 89 float* u_ptr = &u[1][0]; |
90 float noise2, noise3, noise4; | 90 float noise2, noise3, noise4; |
91 float tmp1f, tmp2f, tmp3f, tmp4f, tmp5f, tmp6f, tmp7f, tmp8f; | 91 float tmp1f, tmp2f, tmp3f, tmp4f, tmp5f, tmp6f, tmp7f, tmp8f; |
92 | 92 |
93 u[0][0] = 0; | 93 u[0][0] = 0; |
94 u[0][1] = 0; | 94 u[0][1] = 0; |
95 for (i = 1; i < PART_LEN1; i+=4) { | 95 for (i = 1; i < PART_LEN1; i += 4) { |
96 __asm __volatile ( | 96 __asm __volatile ( |
97 ".set push \n\t" | 97 ".set push \n\t" |
98 ".set noreorder \n\t" | 98 ".set noreorder \n\t" |
99 "lwc1 %[noise], 4(%[noisePow]) \n\t" | 99 "lwc1 %[noise], 4(%[noisePow]) \n\t" |
100 "lwc1 %[noise2], 8(%[noisePow]) \n\t" | 100 "lwc1 %[noise2], 8(%[noisePow]) \n\t" |
101 "lwc1 %[noise3], 12(%[noisePow]) \n\t" | 101 "lwc1 %[noise3], 12(%[noisePow]) \n\t" |
102 "lwc1 %[noise4], 16(%[noisePow]) \n\t" | 102 "lwc1 %[noise4], 16(%[noisePow]) \n\t" |
103 "sqrt.s %[noise], %[noise] \n\t" | 103 "sqrt.s %[noise], %[noise] \n\t" |
104 "sqrt.s %[noise2], %[noise2] \n\t" | 104 "sqrt.s %[noise2], %[noise2] \n\t" |
105 "sqrt.s %[noise3], %[noise3] \n\t" | 105 "sqrt.s %[noise3], %[noise3] \n\t" |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 [tmp1f] "=&f" (tmp1f), [tmp2f] "=&f" (tmp2f), [tmp3f] "=&f" (tmp3f), | 257 [tmp1f] "=&f" (tmp1f), [tmp2f] "=&f" (tmp2f), [tmp3f] "=&f" (tmp3f), |
258 [tmp4f] "=&f" (tmp4f), [tmp5f] "=&f" (tmp5f), | 258 [tmp4f] "=&f" (tmp4f), [tmp5f] "=&f" (tmp5f), |
259 [tmp6f] "=&f" (tmp6f), [tmp7f] "=&f" (tmp7f), [tmp8f] "=&f" (tmp8f), | 259 [tmp6f] "=&f" (tmp6f), [tmp7f] "=&f" (tmp7f), [tmp8f] "=&f" (tmp8f), |
260 [tmp9f] "=&f" (tmp9f), [tmp10f] "=&f" (tmp10f) | 260 [tmp9f] "=&f" (tmp9f), [tmp10f] "=&f" (tmp10f) |
261 : [tmp1c] "f" (tmp1c), [u_ptr_end] "r" (u_ptr_end) | 261 : [tmp1c] "f" (tmp1c), [u_ptr_end] "r" (u_ptr_end) |
262 : "memory" | 262 : "memory" |
263 ); | 263 ); |
264 | 264 |
265 lambda -= PART_LEN; | 265 lambda -= PART_LEN; |
266 tmp = sqrtf(WEBRTC_SPL_MAX(1 - lambda[PART_LEN] * lambda[PART_LEN], 0)); | 266 tmp = sqrtf(WEBRTC_SPL_MAX(1 - lambda[PART_LEN] * lambda[PART_LEN], 0)); |
267 //tmp = 1 - lambda[i]; | 267 // tmp = 1 - lambda[i]; |
268 efw[0][PART_LEN] += tmp * u[PART_LEN][0]; | 268 efw[0][PART_LEN] += tmp * u[PART_LEN][0]; |
269 efw[1][PART_LEN] += tmp * u[PART_LEN][1]; | 269 efw[1][PART_LEN] += tmp * u[PART_LEN][1]; |
270 | 270 |
271 // For H band comfort noise | 271 // For H band comfort noise |
272 // TODO: don't compute noise and "tmp" twice. Use the previous results. | 272 // TODO: don't compute noise and "tmp" twice. Use the previous results. |
273 noiseAvg = 0.0; | 273 noiseAvg = 0.0; |
274 tmpAvg = 0.0; | 274 tmpAvg = 0.0; |
275 num = 0; | 275 num = 0; |
276 if (aec->num_bands > 1) { | 276 if (aec->num_bands > 1) { |
277 for (i = 0; i < PART_LEN; i++) { | 277 for (i = 0; i < PART_LEN; i++) { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 int num_partitions, | 326 int num_partitions, |
327 int x_fft_buf_block_pos, | 327 int x_fft_buf_block_pos, |
328 float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1], | 328 float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1], |
329 float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1], | 329 float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1], |
330 float y_fft[2][PART_LEN1]) { | 330 float y_fft[2][PART_LEN1]) { |
331 int i; | 331 int i; |
332 for (i = 0; i < num_partitions; i++) { | 332 for (i = 0; i < num_partitions; i++) { |
333 int xPos = (i + x_fft_buf_block_pos) * PART_LEN1; | 333 int xPos = (i + x_fft_buf_block_pos) * PART_LEN1; |
334 int pos = i * PART_LEN1; | 334 int pos = i * PART_LEN1; |
335 // Check for wrap | 335 // Check for wrap |
336 if (i + x_fft_buf_block_pos >= num_partitions) { | 336 if (i + x_fft_buf_block_pos >= num_partitions) { |
337 xPos -= num_partitions * (PART_LEN1); | 337 xPos -= num_partitions * (PART_LEN1); |
338 } | 338 } |
339 float* yf0 = y_fft[0]; | 339 float* yf0 = y_fft[0]; |
340 float* yf1 = y_fft[1]; | 340 float* yf1 = y_fft[1]; |
341 float* aRe = x_fft_buf[0] + xPos; | 341 float* aRe = x_fft_buf[0] + xPos; |
342 float* aIm = x_fft_buf[1] + xPos; | 342 float* aIm = x_fft_buf[1] + xPos; |
343 float* bRe = h_fft_buf[0] + pos; | 343 float* bRe = h_fft_buf[0] + pos; |
344 float* bIm = h_fft_buf[1] + pos; | 344 float* bIm = h_fft_buf[1] + pos; |
345 float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13; | 345 float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13; |
346 int len = PART_LEN1 >> 1; | 346 int len = PART_LEN1 >> 1; |
347 | 347 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 | 441 |
442 void WebRtcAec_FilterAdaptation_mips( | 442 void WebRtcAec_FilterAdaptation_mips( |
443 int num_partitions, | 443 int num_partitions, |
444 int x_fft_buf_block_pos, | 444 int x_fft_buf_block_pos, |
445 float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1], | 445 float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1], |
446 float e_fft[2][PART_LEN1], | 446 float e_fft[2][PART_LEN1], |
447 float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]) { | 447 float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]) { |
448 float fft[PART_LEN2]; | 448 float fft[PART_LEN2]; |
449 int i; | 449 int i; |
450 for (i = 0; i < num_partitions; i++) { | 450 for (i = 0; i < num_partitions; i++) { |
451 int xPos = (i + x_fft_buf_block_pos)*(PART_LEN1); | 451 int xPos = (i + x_fft_buf_block_pos) * (PART_LEN1); |
452 int pos; | 452 int pos; |
453 // Check for wrap | 453 // Check for wrap |
454 if (i + x_fft_buf_block_pos >= num_partitions) { | 454 if (i + x_fft_buf_block_pos >= num_partitions) { |
455 xPos -= num_partitions * PART_LEN1; | 455 xPos -= num_partitions * PART_LEN1; |
456 } | 456 } |
457 | 457 |
458 pos = i * PART_LEN1; | 458 pos = i * PART_LEN1; |
459 float* aRe = x_fft_buf[0] + xPos; | 459 float* aRe = x_fft_buf[0] + xPos; |
460 float* aIm = x_fft_buf[1] + xPos; | 460 float* aIm = x_fft_buf[1] + xPos; |
461 float* bRe = e_fft[0]; | 461 float* bRe = e_fft[0]; |
462 float* bIm = e_fft[1]; | 462 float* bIm = e_fft[1]; |
463 float* fft_tmp; | 463 float* fft_tmp; |
464 | 464 |
465 float f0, f1, f2, f3, f4, f5, f6 ,f7, f8, f9, f10, f11, f12; | 465 float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12; |
466 int len = PART_LEN >> 1; | 466 int len = PART_LEN >> 1; |
467 | 467 |
468 __asm __volatile ( | 468 __asm __volatile ( |
469 ".set push \n\t" | 469 ".set push \n\t" |
470 ".set noreorder \n\t" | 470 ".set noreorder \n\t" |
471 "addiu %[fft_tmp], %[fft], 0 \n\t" | 471 "addiu %[fft_tmp], %[fft], 0 \n\t" |
472 "1: \n\t" | 472 "1: \n\t" |
473 "lwc1 %[f0], 0(%[aRe]) \n\t" | 473 "lwc1 %[f0], 0(%[aRe]) \n\t" |
474 "lwc1 %[f1], 0(%[bRe]) \n\t" | 474 "lwc1 %[f1], 0(%[bRe]) \n\t" |
475 "lwc1 %[f2], 0(%[bIm]) \n\t" | 475 "lwc1 %[f2], 0(%[bIm]) \n\t" |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 ); | 778 ); |
779 } | 779 } |
780 | 780 |
781 void WebRtcAec_InitAec_mips(void) { | 781 void WebRtcAec_InitAec_mips(void) { |
782 WebRtcAec_FilterFar = WebRtcAec_FilterFar_mips; | 782 WebRtcAec_FilterFar = WebRtcAec_FilterFar_mips; |
783 WebRtcAec_FilterAdaptation = WebRtcAec_FilterAdaptation_mips; | 783 WebRtcAec_FilterAdaptation = WebRtcAec_FilterAdaptation_mips; |
784 WebRtcAec_ScaleErrorSignal = WebRtcAec_ScaleErrorSignal_mips; | 784 WebRtcAec_ScaleErrorSignal = WebRtcAec_ScaleErrorSignal_mips; |
785 WebRtcAec_ComfortNoise = WebRtcAec_ComfortNoise_mips; | 785 WebRtcAec_ComfortNoise = WebRtcAec_ComfortNoise_mips; |
786 WebRtcAec_OverdriveAndSuppress = WebRtcAec_OverdriveAndSuppress_mips; | 786 WebRtcAec_OverdriveAndSuppress = WebRtcAec_OverdriveAndSuppress_mips; |
787 } | 787 } |
OLD | NEW |