Fixed text relocation code related to ARM assembly code.
Refer to WebRTC issue 1300. Review URL: https://webrtc-codereview.appspot.com/1055004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3409 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
		| @@ -15,14 +15,21 @@ | |||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "webrtc/modules/audio_coding/codecs/isac/fix/source/transform.h" |  | ||||||
|  |  | ||||||
| #include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h" | #include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h" | ||||||
| #include "webrtc/modules/audio_coding/codecs/isac/fix/source/fft.h" | #include "webrtc/modules/audio_coding/codecs/isac/fix/source/fft.h" | ||||||
| #include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h" | #include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h" | ||||||
|  |  | ||||||
|  | #if (defined WEBRTC_DETECT_ARM_NEON || defined WEBRTC_ARCH_ARM_NEON) | ||||||
|  | /* Tables are defined in ARM assembly files. */ | ||||||
| /* Cosine table 1 in Q14 */ | /* Cosine table 1 in Q14 */ | ||||||
| const WebRtc_Word16 kCosTab1[FRAMESAMPLES/2] = { | extern const WebRtc_Word16 WebRtcIsacfix_kCosTab1[FRAMESAMPLES/2]; | ||||||
|  | /* Sine table 1 in Q14 */ | ||||||
|  | extern const WebRtc_Word16 WebRtcIsacfix_kSinTab1[FRAMESAMPLES/2]; | ||||||
|  | /* Sine table 2 in Q14 */ | ||||||
|  | extern const WebRtc_Word16 WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4]; | ||||||
|  | #else | ||||||
|  | /* Cosine table 1 in Q14 */ | ||||||
|  | static const WebRtc_Word16 WebRtcIsacfix_kCosTab1[FRAMESAMPLES/2] = { | ||||||
|   16384,  16383,  16378,  16371,  16362,  16349,  16333,  16315,  16294,  16270, |   16384,  16383,  16378,  16371,  16362,  16349,  16333,  16315,  16294,  16270, | ||||||
|   16244,  16214,  16182,  16147,  16110,  16069,  16026,  15980,  15931,  15880, |   16244,  16214,  16182,  16147,  16110,  16069,  16026,  15980,  15931,  15880, | ||||||
|   15826,  15769,  15709,  15647,  15582,  15515,  15444,  15371,  15296,  15218, |   15826,  15769,  15709,  15647,  15582,  15515,  15444,  15371,  15296,  15218, | ||||||
| @@ -41,17 +48,17 @@ const WebRtc_Word16 kCosTab1[FRAMESAMPLES/2] = { | |||||||
|   -6270,  -6467,  -6664,  -6859,  -7053,  -7246,  -7438,  -7629,  -7818,  -8006, |   -6270,  -6467,  -6664,  -6859,  -7053,  -7246,  -7438,  -7629,  -7818,  -8006, | ||||||
|   -8192,  -8377,  -8561,  -8743,  -8923,  -9102,  -9280,  -9456,  -9630,  -9803, |   -8192,  -8377,  -8561,  -8743,  -8923,  -9102,  -9280,  -9456,  -9630,  -9803, | ||||||
|   -9974, -10143, -10311, -10477, -10641, -10803, -10963, -11121, -11278, -11433, |   -9974, -10143, -10311, -10477, -10641, -10803, -10963, -11121, -11278, -11433, | ||||||
|   -11585, -11736, -11885, -12031, -12176, -12318, -12458, -12597, -12733, -12867, |   -11585, -11736, -11885, -12031, -12176, -12318, -12458, -12597, -12733, | ||||||
|   -12998, -13128, -13255, -13380, -13502, -13623, -13741, -13856, -13970, -14081, |   -12867, -12998, -13128, -13255, -13380, -13502, -13623, -13741, -13856, | ||||||
|   -14189, -14295, -14399, -14500, -14598, -14694, -14788, -14879, -14968, -15053, |   -13970, -14081, -14189, -14295, -14399, -14500, -14598, -14694, -14788, | ||||||
|   -15137, -15218, -15296, -15371, -15444, -15515, -15582, -15647, -15709, -15769, |   -14879, -14968, -15053, -15137, -15218, -15296, -15371, -15444, -15515, | ||||||
|   -15826, -15880, -15931, -15980, -16026, -16069, -16110, -16147, -16182, -16214, |   -15582, -15647, -15709, -15769, -15826, -15880, -15931, -15980, -16026, | ||||||
|   -16244, -16270, -16294, -16315, -16333, -16349, -16362, -16371, -16378, -16383 |   -16069, -16110, -16147, -16182, -16214, -16244, -16270, -16294, -16315, | ||||||
|  |   -16333, -16349, -16362, -16371, -16378, -16383 | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Sine table 1 in Q14 */ | /* Sine table 1 in Q14 */ | ||||||
| const WebRtc_Word16 kSinTab1[FRAMESAMPLES/2] = { | static const WebRtc_Word16 WebRtcIsacfix_kSinTab1[FRAMESAMPLES/2] = { | ||||||
|   0,   214,   429,   643,   857,  1072,  1285,  1499,  1713,  1926, |   0,   214,   429,   643,   857,  1072,  1285,  1499,  1713,  1926, | ||||||
|   2139,  2351,  2563,  2775,  2986,  3196,  3406,  3616,  3825,  4033, |   2139,  2351,  2563,  2775,  2986,  3196,  3406,  3616,  3825,  4033, | ||||||
|   4240,  4447,  4653,  4859,  5063,  5266,  5469,  5671,  5872,  6071, |   4240,  4447,  4653,  4859,  5063,  5266,  5469,  5671,  5872,  6071, | ||||||
| @@ -80,7 +87,7 @@ const WebRtc_Word16 kSinTab1[FRAMESAMPLES/2] = { | |||||||
|  |  | ||||||
|  |  | ||||||
| /* Sine table 2 in Q14 */ | /* Sine table 2 in Q14 */ | ||||||
| const WebRtc_Word16 kSinTab2[FRAMESAMPLES/4] = { | static const WebRtc_Word16 WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4] = { | ||||||
|   16384, -16381, 16375, -16367, 16356, -16342, 16325, -16305, 16283, -16257, |   16384, -16381, 16375, -16367, 16356, -16342, 16325, -16305, 16283, -16257, | ||||||
|   16229, -16199, 16165, -16129, 16090, -16048, 16003, -15956, 15906, -15853, |   16229, -16199, 16165, -16129, 16090, -16048, 16003, -15956, 15906, -15853, | ||||||
|   15798, -15739, 15679, -15615, 15549, -15480, 15408, -15334, 15257, -15178, |   15798, -15739, 15679, -15615, 15549, -15480, 15408, -15334, 15257, -15178, | ||||||
| @@ -94,6 +101,7 @@ const WebRtc_Word16 kSinTab2[FRAMESAMPLES/4] = { | |||||||
|   4137,  -3929,  3720,  -3511,  3301,  -3091,  2880,  -2669,  2457,  -2245, |   4137,  -3929,  3720,  -3511,  3301,  -3091,  2880,  -2669,  2457,  -2245, | ||||||
|   2032,  -1819,  1606,  -1392,  1179,   -965,   750,   -536,   322,   -107 |   2032,  -1819,  1606,  -1392,  1179,   -965,   750,   -536,   322,   -107 | ||||||
| }; | }; | ||||||
|  | #endif  // WEBRTC_DETECT_ARM_NEON || WEBRTC_ARCH_ARM_NEON | ||||||
|  |  | ||||||
| // Declare function pointers. | // Declare function pointers. | ||||||
| Spec2Time WebRtcIsacfix_Spec2Time; | Spec2Time WebRtcIsacfix_Spec2Time; | ||||||
| @@ -115,8 +123,8 @@ void WebRtcIsacfix_Time2SpecC(WebRtc_Word16 *inre1Q9, | |||||||
|   /* Multiply with complex exponentials and combine into one complex vector */ |   /* Multiply with complex exponentials and combine into one complex vector */ | ||||||
|   factQ19 = 16921; // 0.5/sqrt(240) in Q19 is round(.5/sqrt(240)*(2^19)) = 16921 |   factQ19 = 16921; // 0.5/sqrt(240) in Q19 is round(.5/sqrt(240)*(2^19)) = 16921 | ||||||
|   for (k = 0; k < FRAMESAMPLES/2; k++) { |   for (k = 0; k < FRAMESAMPLES/2; k++) { | ||||||
|     tmp1rQ14 = kCosTab1[k]; |     tmp1rQ14 = WebRtcIsacfix_kCosTab1[k]; | ||||||
|     tmp1iQ14 = kSinTab1[k]; |     tmp1iQ14 = WebRtcIsacfix_kSinTab1[k]; | ||||||
|     xrQ16 = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_16_16(tmp1rQ14, inre1Q9[k]) + WEBRTC_SPL_MUL_16_16(tmp1iQ14, inre2Q9[k]), 7); |     xrQ16 = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_16_16(tmp1rQ14, inre1Q9[k]) + WEBRTC_SPL_MUL_16_16(tmp1iQ14, inre2Q9[k]), 7); | ||||||
|     xiQ16 = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_16_16(tmp1rQ14, inre2Q9[k]) - WEBRTC_SPL_MUL_16_16(tmp1iQ14, inre1Q9[k]), 7); |     xiQ16 = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_16_16(tmp1rQ14, inre2Q9[k]) - WEBRTC_SPL_MUL_16_16(tmp1iQ14, inre1Q9[k]), 7); | ||||||
|     tmpreQ16[k] = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_16_32_RSFT16(factQ19, xrQ16)+4, 3); // (Q16*Q19>>16)>>3 = Q16 |     tmpreQ16[k] = WEBRTC_SPL_RSHIFT_W32(WEBRTC_SPL_MUL_16_32_RSFT16(factQ19, xrQ16)+4, 3); // (Q16*Q19>>16)>>3 = Q16 | ||||||
| @@ -171,8 +179,8 @@ void WebRtcIsacfix_Time2SpecC(WebRtc_Word16 *inre1Q9, | |||||||
|     yiQ16 = -tmpreQ16[k] + tmpreQ16[FRAMESAMPLES/2 - 1 - k]; |     yiQ16 = -tmpreQ16[k] + tmpreQ16[FRAMESAMPLES/2 - 1 - k]; | ||||||
|     xiQ16 = tmpimQ16[k] - tmpimQ16[FRAMESAMPLES/2 - 1 - k]; |     xiQ16 = tmpimQ16[k] - tmpimQ16[FRAMESAMPLES/2 - 1 - k]; | ||||||
|     yrQ16 = tmpimQ16[k] + tmpimQ16[FRAMESAMPLES/2 - 1 - k]; |     yrQ16 = tmpimQ16[k] + tmpimQ16[FRAMESAMPLES/2 - 1 - k]; | ||||||
|     tmp1rQ14 = -kSinTab2[FRAMESAMPLES/4 - 1 - k]; |     tmp1rQ14 = -WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4 - 1 - k]; | ||||||
|     tmp1iQ14 = kSinTab2[k]; |     tmp1iQ14 = WebRtcIsacfix_kSinTab2[k]; | ||||||
|     v1Q16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, xrQ16) - WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, xiQ16); |     v1Q16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, xrQ16) - WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, xiQ16); | ||||||
|     v2Q16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, xrQ16) + WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, xiQ16); |     v2Q16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, xrQ16) + WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, xiQ16); | ||||||
|     outreQ7[k] = (WebRtc_Word16) WEBRTC_SPL_RSHIFT_W32(v1Q16, 9); |     outreQ7[k] = (WebRtc_Word16) WEBRTC_SPL_RSHIFT_W32(v1Q16, 9); | ||||||
| @@ -198,8 +206,8 @@ void WebRtcIsacfix_Spec2TimeC(WebRtc_Word16 *inreQ7, WebRtc_Word16 *inimQ7, WebR | |||||||
|  |  | ||||||
|   for (k = 0; k < FRAMESAMPLES/4; k++) { |   for (k = 0; k < FRAMESAMPLES/4; k++) { | ||||||
|     /* Move zero in time to beginning of frames */ |     /* Move zero in time to beginning of frames */ | ||||||
|     tmp1rQ14 = -kSinTab2[FRAMESAMPLES/4 - 1 - k]; |     tmp1rQ14 = -WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4 - 1 - k]; | ||||||
|     tmp1iQ14 = kSinTab2[k]; |     tmp1iQ14 = WebRtcIsacfix_kSinTab2[k]; | ||||||
|  |  | ||||||
|     tmpInRe = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32) inreQ7[k], 9);  // Q7 -> Q16 |     tmpInRe = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32) inreQ7[k], 9);  // Q7 -> Q16 | ||||||
|     tmpInIm = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32) inimQ7[k], 9);  // Q7 -> Q16 |     tmpInIm = WEBRTC_SPL_LSHIFT_W32((WebRtc_Word32) inimQ7[k], 9);  // Q7 -> Q16 | ||||||
| @@ -270,8 +278,8 @@ void WebRtcIsacfix_Spec2TimeC(WebRtc_Word16 *inreQ7, WebRtc_Word16 *inimQ7, WebR | |||||||
|   /* Demodulate and separate */ |   /* Demodulate and separate */ | ||||||
|   factQ11 = 31727; // sqrt(240) in Q11 is round(15.49193338482967*2048) = 31727 |   factQ11 = 31727; // sqrt(240) in Q11 is round(15.49193338482967*2048) = 31727 | ||||||
|   for (k = 0; k < FRAMESAMPLES/2; k++) { |   for (k = 0; k < FRAMESAMPLES/2; k++) { | ||||||
|     tmp1rQ14 = kCosTab1[k]; |     tmp1rQ14 = WebRtcIsacfix_kCosTab1[k]; | ||||||
|     tmp1iQ14 = kSinTab1[k]; |     tmp1iQ14 = WebRtcIsacfix_kSinTab1[k]; | ||||||
|     xrQ16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, outre1Q16[k]) - WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, outre2Q16[k]); |     xrQ16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, outre1Q16[k]) - WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, outre2Q16[k]); | ||||||
|     xiQ16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, outre2Q16[k]) + WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, outre1Q16[k]); |     xiQ16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, outre2Q16[k]) + WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, outre1Q16[k]); | ||||||
|     xrQ16 = WEBRTC_SPL_MUL_16_32_RSFT11(factQ11, xrQ16); |     xrQ16 = WEBRTC_SPL_MUL_16_32_RSFT11(factQ11, xrQ16); | ||||||
|   | |||||||
| @@ -16,6 +16,9 @@ | |||||||
|  |  | ||||||
| GLOBAL_FUNCTION WebRtcIsacfix_Spec2TimeNeon | GLOBAL_FUNCTION WebRtcIsacfix_Spec2TimeNeon | ||||||
| GLOBAL_FUNCTION WebRtcIsacfix_Time2SpecNeon | GLOBAL_FUNCTION WebRtcIsacfix_Time2SpecNeon | ||||||
|  | GLOBAL_LABEL WebRtcIsacfix_kSinTab1 | ||||||
|  | GLOBAL_LABEL WebRtcIsacfix_kCosTab1 | ||||||
|  | GLOBAL_LABEL WebRtcIsacfix_kSinTab2 | ||||||
|  |  | ||||||
| @ void WebRtcIsacfix_Time2SpecNeon(WebRtc_Word16* inre1Q9, | @ void WebRtcIsacfix_Time2SpecNeon(WebRtc_Word16* inre1Q9, | ||||||
| @                                  WebRtc_Word16* inre2Q9, | @                                  WebRtc_Word16* inre2Q9, | ||||||
| @@ -39,9 +42,9 @@ DEFINE_FUNCTION WebRtcIsacfix_Time2SpecNeon | |||||||
|   add r4, sp, #16             @ tmpreQ16; |   add r4, sp, #16             @ tmpreQ16; | ||||||
|   add r5, sp, #(16 + FRAMESAMPLES * 2)  @ tmpimQ16; |   add r5, sp, #(16 + FRAMESAMPLES * 2)  @ tmpimQ16; | ||||||
|  |  | ||||||
|   adr r9, kCosTab1 |   adr r9, WebRtcIsacfix_kCosTab1 | ||||||
|   mov r6, #(kSinTab1 - kCosTab1) |   mov r6, #(WebRtcIsacfix_kSinTab1 - WebRtcIsacfix_kCosTab1) | ||||||
|   add r10, r9, r6             @ kSinTab1 |   add r10, r9, r6             @ WebRtcIsacfix_kSinTab1 | ||||||
|  |  | ||||||
|   vmov.u32 q6, #0             @ Initialize the maximum values for tmpInIm. |   vmov.u32 q6, #0             @ Initialize the maximum values for tmpInIm. | ||||||
|   vmov.u32 q7, #0             @ Initialize the maximum values for tmpInRe. |   vmov.u32 q7, #0             @ Initialize the maximum values for tmpInRe. | ||||||
| @@ -55,18 +58,18 @@ Time2Spec_TransformAndFindMax: | |||||||
|  |  | ||||||
|   subs r8, #8 |   subs r8, #8 | ||||||
|  |  | ||||||
|   vld1.16 {q0}, [r9:64]!      @ kCosTab1[] |   vld1.16 {q0}, [r9, :64]!    @ WebRtcIsacfix_kCosTab1[] | ||||||
|   vld1.16 {q2}, [r0]!         @ inre1Q9[] |   vld1.16 {q2}, [r0]!         @ inre1Q9[] | ||||||
|   vmull.s16 q8, d0, d4        @ kCosTab1[k] * inre1Q9[k] |   vmull.s16 q8, d0, d4        @ WebRtcIsacfix_kCosTab1[k] * inre1Q9[k] | ||||||
|   vld1.16 {q1}, [r10:64]!     @ kSinTab1[] |   vld1.16 {q1}, [r10, :64]!   @ WebRtcIsacfix_kSinTab1[] | ||||||
|   vmull.s16 q9, d1, d5        @ kCosTab1[k] * inre1Q9[k] |   vmull.s16 q9, d1, d5        @ WebRtcIsacfix_kCosTab1[k] * inre1Q9[k] | ||||||
|   vld1.16 {q3}, [r1]!         @ inre2Q9[] |   vld1.16 {q3}, [r1]!         @ inre2Q9[] | ||||||
|   vmlal.s16 q8, d2, d6        @ kSinTab1[k] * inre2Q9[k] |   vmlal.s16 q8, d2, d6        @ WebRtcIsacfix_kSinTab1[k] * inre2Q9[k] | ||||||
|   vmlal.s16 q9, d3, d7        @ kSinTab1[k] * inre2Q9[k] |   vmlal.s16 q9, d3, d7        @ WebRtcIsacfix_kSinTab1[k] * inre2Q9[k] | ||||||
|   vmull.s16 q12, d0, d6       @ kCosTab1[k] * inre2Q9[k] |   vmull.s16 q12, d0, d6       @ WebRtcIsacfix_kCosTab1[k] * inre2Q9[k] | ||||||
|   vmull.s16 q13, d1, d7       @ kCosTab1[k] * inre2Q9[k] |   vmull.s16 q13, d1, d7       @ WebRtcIsacfix_kCosTab1[k] * inre2Q9[k] | ||||||
|   vmlsl.s16 q12, d2, d4       @ kSinTab1[k] * inre1Q9[k] |   vmlsl.s16 q12, d2, d4       @ WebRtcIsacfix_kSinTab1[k] * inre1Q9[k] | ||||||
|   vmlsl.s16 q13, d3, d5       @ kSinTab1[k] * inre1Q9[k] |   vmlsl.s16 q13, d3, d5       @ WebRtcIsacfix_kSinTab1[k] * inre1Q9[k] | ||||||
|  |  | ||||||
|   vqdmulh.s32 q0, q8, q4      @ xrQ16 * factQ19 |   vqdmulh.s32 q0, q8, q4      @ xrQ16 * factQ19 | ||||||
|   vqdmulh.s32 q1, q9, q4      @ xrQ16 * factQ19 |   vqdmulh.s32 q1, q9, q4      @ xrQ16 * factQ19 | ||||||
| @@ -153,9 +156,9 @@ Time2Spec_PreFftShift: | |||||||
|   ldr r7, [sp, #4]            @ inre2Q9 |   ldr r7, [sp, #4]            @ inre2Q9 | ||||||
|   add r4, r6, r8              @ &inre1Q9[FRAMESAMPLES / 2 - 4] |   add r4, r6, r8              @ &inre1Q9[FRAMESAMPLES / 2 - 4] | ||||||
|   add r5, r7, r8              @ &inre2Q9[FRAMESAMPLES / 2 - 4] |   add r5, r7, r8              @ &inre2Q9[FRAMESAMPLES / 2 - 4] | ||||||
|   adr r10, kSinTab2 |   adr r10, WebRtcIsacfix_kSinTab2 | ||||||
|  |  | ||||||
|   add r9, r10, #(120*2 - 8)   @ &kSinTab2[119 - 4] |   add r9, r10, #(120*2 - 8)   @ &WebRtcIsacfix_kSinTab2[119 - 4] | ||||||
|  |  | ||||||
|  |  | ||||||
|   mov r8, #(FRAMESAMPLES / 4) @ loop counter |   mov r8, #(FRAMESAMPLES / 4) @ loop counter | ||||||
| @@ -170,9 +173,9 @@ Time2Spec_PostFftTransform: | |||||||
| @ By vshl, we effectively did "<< (-sh - 23)", instead of "<< (-sh)", | @ By vshl, we effectively did "<< (-sh - 23)", instead of "<< (-sh)", | ||||||
| @ ">> 14" and then ">> 9" as in the C code. | @ ">> 14" and then ">> 9" as in the C code. | ||||||
|  |  | ||||||
|   vld1.16 {d6}, [r9:64]       @ kCosTab2[] |   vld1.16 {d6}, [r9, :64]     @ kCosTab2[] | ||||||
|   vneg.s16 d6, d6 |   vneg.s16 d6, d6 | ||||||
|   vld1.16 {d7}, [r10:64]!     @ kSinTab2[] |   vld1.16 {d7}, [r10, :64]!   @ WebRtcIsacfix_kSinTab2[] | ||||||
|   vrev64.16 q1, q1            @ Reverse samples in 2nd half of xrQ16[]. |   vrev64.16 q1, q1            @ Reverse samples in 2nd half of xrQ16[]. | ||||||
|   vqadd.s16 d4, d0, d2        @ xrQ16 |   vqadd.s16 d4, d0, d2        @ xrQ16 | ||||||
|   vqsub.s16 d5, d1, d3        @ xiQ16 |   vqsub.s16 d5, d1, d3        @ xiQ16 | ||||||
| @@ -187,12 +190,12 @@ Time2Spec_PostFftTransform: | |||||||
|   vqsub.s16 d0, d2, d0        @ yiQ16 |   vqsub.s16 d0, d2, d0        @ yiQ16 | ||||||
|  |  | ||||||
|   vmull.s16 q12, d6, d4       @ kCosTab2[k] * xrQ16 |   vmull.s16 q12, d6, d4       @ kCosTab2[k] * xrQ16 | ||||||
|   vmlsl.s16 q12, d7, d5       @ kSinTab2[k] * xiQ16 |   vmlsl.s16 q12, d7, d5       @ WebRtcIsacfix_kSinTab2[k] * xiQ16 | ||||||
|   vmull.s16 q13, d7, d4       @ kSinTab2[k] * xrQ16 |   vmull.s16 q13, d7, d4       @ WebRtcIsacfix_kSinTab2[k] * xrQ16 | ||||||
|   vmlal.s16 q13, d6, d5       @ kCosTab2[k] * xiQ16 |   vmlal.s16 q13, d6, d5       @ kCosTab2[k] * xiQ16 | ||||||
|   vmull.s16 q6, d7, d1        @ kSinTab2[k] * yrQ16 |   vmull.s16 q6, d7, d1        @ WebRtcIsacfix_kSinTab2[k] * yrQ16 | ||||||
|   vmlal.s16 q6, d6, d0        @ kCosTab2[k] * yiQ16 |   vmlal.s16 q6, d6, d0        @ kCosTab2[k] * yiQ16 | ||||||
|   vmull.s16 q7, d7, d0        @ kSinTab2[k] * yiQ16 |   vmull.s16 q7, d7, d0        @ WebRtcIsacfix_kSinTab2[k] * yiQ16 | ||||||
|   vmlsl.s16 q7, d6, d1        @ kCosTab2[k] * yrQ16 |   vmlsl.s16 q7, d6, d1        @ kCosTab2[k] * yrQ16 | ||||||
|  |  | ||||||
|   vshl.s32 q12, q12, q15 |   vshl.s32 q12, q12, q15 | ||||||
| @@ -225,7 +228,7 @@ Time2Spec_PostFftTransform: | |||||||
|  |  | ||||||
| .align  8 | .align  8 | ||||||
| @ Cosine table 1 in Q14 | @ Cosine table 1 in Q14 | ||||||
| kCosTab1: | WebRtcIsacfix_kCosTab1: | ||||||
|   .short 16384, 16383, 16378, 16371, 16362, 16349, 16333, 16315 |   .short 16384, 16383, 16378, 16371, 16362, 16349, 16333, 16315 | ||||||
|   .short 16294, 16270, 16244, 16214, 16182, 16147, 16110, 16069 |   .short 16294, 16270, 16244, 16214, 16182, 16147, 16110, 16069 | ||||||
|   .short 16026, 15980, 15931, 15880, 15826, 15769, 15709, 15647 |   .short 16026, 15980, 15931, 15880, 15826, 15769, 15709, 15647 | ||||||
| @@ -259,7 +262,7 @@ kCosTab1: | |||||||
|  |  | ||||||
| .align  8 | .align  8 | ||||||
| @ Sine table 2 in Q14 | @ Sine table 2 in Q14 | ||||||
| kSinTab2: | WebRtcIsacfix_kSinTab2: | ||||||
|   .short 16384, -16381, 16375, -16367, 16356, -16342, 16325, -16305 |   .short 16384, -16381, 16375, -16367, 16356, -16342, 16325, -16305 | ||||||
|   .short 16283, -16257, 16229, -16199, 16165, -16129, 16090, -16048 |   .short 16283, -16257, 16229, -16199, 16165, -16129, 16090, -16048 | ||||||
|   .short 16003, -15956, 15906, -15853, 15798, -15739, 15679, -15615 |   .short 16003, -15956, 15906, -15853, 15798, -15739, 15679, -15615 | ||||||
| @@ -280,7 +283,7 @@ kSinTab2: | |||||||
|  |  | ||||||
| .align  8 | .align  8 | ||||||
| @ Sine table 1 in Q14 | @ Sine table 1 in Q14 | ||||||
| kSinTab1: | WebRtcIsacfix_kSinTab1: | ||||||
|   .short 0, 214, 429, 643, 857, 1072, 1285, 1499 |   .short 0, 214, 429, 643, 857, 1072, 1285, 1499 | ||||||
|   .short 1713, 1926, 2139, 2351, 2563, 2775, 2986, 3196 |   .short 1713, 1926, 2139, 2351, 2563, 2775, 2986, 3196 | ||||||
|   .short 3406, 3616, 3825, 4033, 4240, 4447, 4653, 4859 |   .short 3406, 3616, 3825, 4033, 4240, 4447, 4653, 4859 | ||||||
| @@ -334,8 +337,8 @@ DEFINE_FUNCTION WebRtcIsacfix_Spec2TimeNeon | |||||||
|   add r6, r3, r8, lsl #1      @ &outRe2Q16[FRAMESAMPLES / 2 - 8] |   add r6, r3, r8, lsl #1      @ &outRe2Q16[FRAMESAMPLES / 2 - 8] | ||||||
|  |  | ||||||
|   mov r8, #(FRAMESAMPLES / 2) @ loop counter |   mov r8, #(FRAMESAMPLES / 2) @ loop counter | ||||||
|   adr r10, kSinTab2 |   adr r10, WebRtcIsacfix_kSinTab2 | ||||||
|   add r9, r10, #(120*2 - 16)  @ &kSinTab2[119 - 8] |   add r9, r10, #(120*2 - 16)  @ &WebRtcIsacfix_kSinTab2[119 - 8] | ||||||
|  |  | ||||||
|  |  | ||||||
|   mov r5, #-32 |   mov r5, #-32 | ||||||
| @@ -349,24 +352,24 @@ TransformAndFindMax: | |||||||
|  |  | ||||||
|   subs r8, #16 |   subs r8, #16 | ||||||
|  |  | ||||||
|   vld1.16 {q0}, [r9:64]       @ kCosTab2[] |   vld1.16 {q0}, [r9, :64]     @ kCosTab2[] | ||||||
|   sub r9, #16 |   sub r9, #16 | ||||||
|   vld1.16 {q2}, [r0]!         @ inreQ7[] |   vld1.16 {q2}, [r0]!         @ inreQ7[] | ||||||
|   vneg.s16 q0, q0 |   vneg.s16 q0, q0 | ||||||
|   vld1.16 {q3}, [r1]!         @ inimQ7[] |   vld1.16 {q3}, [r1]!         @ inimQ7[] | ||||||
|   vrev64.16 d0, d0 |   vrev64.16 d0, d0 | ||||||
|   vrev64.16 d1, d1 |   vrev64.16 d1, d1 | ||||||
|   vld1.16 {q1}, [r10:64]!     @ kSinTab2[] |   vld1.16 {q1}, [r10, :64]!   @ WebRtcIsacfix_kSinTab2[] | ||||||
|   vswp d0, d1 |   vswp d0, d1 | ||||||
|  |  | ||||||
|   vmull.s16 q8, d2, d6        @ kSinTab2[k] * inimQ7[k] |   vmull.s16 q8, d2, d6        @ WebRtcIsacfix_kSinTab2[k] * inimQ7[k] | ||||||
|   vmull.s16 q9, d3, d7        @ kSinTab2[k] * inimQ7[k] |   vmull.s16 q9, d3, d7        @ WebRtcIsacfix_kSinTab2[k] * inimQ7[k] | ||||||
|   vmlal.s16 q8, d0, d4        @ kCosTab2[k] * inreQ7[k] |   vmlal.s16 q8, d0, d4        @ kCosTab2[k] * inreQ7[k] | ||||||
|   vmlal.s16 q9, d1, d5        @ kCosTab2[k] * inreQ7[k] |   vmlal.s16 q9, d1, d5        @ kCosTab2[k] * inreQ7[k] | ||||||
|   vmull.s16 q12, d0, d6       @ kCosTab2[k] * inimQ7[k] |   vmull.s16 q12, d0, d6       @ kCosTab2[k] * inimQ7[k] | ||||||
|   vmull.s16 q13, d1, d7       @ kCosTab2[k] * inimQ7[k] |   vmull.s16 q13, d1, d7       @ kCosTab2[k] * inimQ7[k] | ||||||
|   vmlsl.s16 q12, d2, d4       @ kSinTab2[k] * inreQ7[k] |   vmlsl.s16 q12, d2, d4       @ WebRtcIsacfix_kSinTab2[k] * inreQ7[k] | ||||||
|   vmlsl.s16 q13, d3, d5       @ kSinTab2[k] * inreQ7[k] |   vmlsl.s16 q13, d3, d5       @ WebRtcIsacfix_kSinTab2[k] * inreQ7[k] | ||||||
|  |  | ||||||
|   vld1.16 {q2}, [r11], r7     @ inimQ7[FRAMESAMPLES / 2 - 8 + i] |   vld1.16 {q2}, [r11], r7     @ inimQ7[FRAMESAMPLES / 2 - 8 + i] | ||||||
|   vld1.16 {q3}, [r12], r7     @ inreQ7[FRAMESAMPLES / 2 - 8 + i] |   vld1.16 {q3}, [r12], r7     @ inreQ7[FRAMESAMPLES / 2 - 8 + i] | ||||||
| @@ -374,15 +377,15 @@ TransformAndFindMax: | |||||||
|   vrev64.16 q2, q2            @ Reverse the order of the samples |   vrev64.16 q2, q2            @ Reverse the order of the samples | ||||||
|   vrev64.16 q3, q3            @ Reverse the order of the samples |   vrev64.16 q3, q3            @ Reverse the order of the samples | ||||||
|  |  | ||||||
|   vmull.s16 q14, d2, d5       @ kSinTab2[k] * inimQ7[k] |   vmull.s16 q14, d2, d5       @ WebRtcIsacfix_kSinTab2[k] * inimQ7[k] | ||||||
|   vmull.s16 q15, d3, d4       @ kSinTab2[k] * inimQ7[k] |   vmull.s16 q15, d3, d4       @ WebRtcIsacfix_kSinTab2[k] * inimQ7[k] | ||||||
|   vmlsl.s16 q14, d0, d7       @ kSinTab2[k] * inimQ7[k] - kCosTab2[k] *inreQ7[k] |   vmlsl.s16 q14, d0, d7       @ q14 -= kCosTab2[k] * inreQ7[k] | ||||||
|   vmlsl.s16 q15, d1, d6       @ kSinTab2[k] * inimQ7[k] - kCosTab2[k] *inreQ7[k] |   vmlsl.s16 q15, d1, d6       @ q15 -= kCosTab2[k] * inreQ7[k] | ||||||
|  |  | ||||||
|   vmull.s16 q10, d0, d5       @ kCosTab2[k] * inimQ7[] |   vmull.s16 q10, d0, d5       @ kCosTab2[k] * inimQ7[] | ||||||
|   vmull.s16 q11, d1, d4       @ kCosTab2[k] * inimQ7[] |   vmull.s16 q11, d1, d4       @ kCosTab2[k] * inimQ7[] | ||||||
|   vmlal.s16 q10, d2, d7       @ kCosTab2[k] * inimQ7[] + kSinTab2[k] * inreQ7[] |   vmlal.s16 q10, d2, d7       @ q10 += WebRtcIsacfix_kSinTab2[k] * inreQ7[] | ||||||
|   vmlal.s16 q11, d3, d6       @ kCosTab2[k] * inimQ7[] + kSinTab2[k] * inreQ7[] |   vmlal.s16 q11, d3, d6       @ q11 += WebRtcIsacfix_kSinTab2[k] * inreQ7[] | ||||||
|  |  | ||||||
|   vshr.s32 q8, q8, #5         @ xrQ16 |   vshr.s32 q8, q8, #5         @ xrQ16 | ||||||
|   vshr.s32 q9, q9, #5         @ xrQ16 |   vshr.s32 q9, q9, #5         @ xrQ16 | ||||||
| @@ -448,9 +451,9 @@ TransformAndFindMax: | |||||||
|  |  | ||||||
|   bgt TransformAndFindMax |   bgt TransformAndFindMax | ||||||
|  |  | ||||||
|   adr r10, kSinTab1 |   adr r10, WebRtcIsacfix_kSinTab1 | ||||||
|   mov r2, #(kSinTab1 - kCosTab1) |   mov r2, #(WebRtcIsacfix_kSinTab1 - WebRtcIsacfix_kCosTab1) | ||||||
|   sub r9, r10, r2             @ kCosTab1 |   sub r9, r10, r2             @ WebRtcIsacfix_kCosTab1 | ||||||
|  |  | ||||||
|   @ Find the maximum value in the Neon registers |   @ Find the maximum value in the Neon registers | ||||||
|   vmax.u32 d12, d13 |   vmax.u32 d12, d13 | ||||||
| @@ -565,39 +568,39 @@ PostFftShiftDivide: | |||||||
| DemodulateAndSeparate: | DemodulateAndSeparate: | ||||||
|   subs r8, #8 |   subs r8, #8 | ||||||
|  |  | ||||||
|   vld1.16 {q0}, [r9:64]!      @ kCosTab1[] |   vld1.16 {q0}, [r9, :64]!    @ WebRtcIsacfix_kCosTab1[] | ||||||
|   vmovl.s16 q6, d0            @ kCosTab1[] |   vmovl.s16 q6, d0            @ WebRtcIsacfix_kCosTab1[] | ||||||
|   vld1.16 {q1}, [r10:64]!     @ kSinTab1[] |   vld1.16 {q1}, [r10, :64]!   @ WebRtcIsacfix_kSinTab1[] | ||||||
|   vmovl.s16 q7, d1            @ kCosTab1[] |   vmovl.s16 q7, d1            @ WebRtcIsacfix_kCosTab1[] | ||||||
|   vld1.32 {q2, q3}, [r2]      @ outre1Q16 |   vld1.32 {q2, q3}, [r2]      @ outre1Q16 | ||||||
|   vmovl.s16 q8, d2            @ kSinTab1[] |   vmovl.s16 q8, d2            @ WebRtcIsacfix_kSinTab1[] | ||||||
|   vld1.32 {q4, q5}, [r3]      @ outre2Q16 |   vld1.32 {q4, q5}, [r3]      @ outre2Q16 | ||||||
|   vmovl.s16 q9, d3            @ kSinTab1[] |   vmovl.s16 q9, d3            @ WebRtcIsacfix_kSinTab1[] | ||||||
|  |  | ||||||
|   vmull.s32 q10, d12, d4      @ kCosTab1[k] * outre1Q16[k] |   vmull.s32 q10, d12, d4      @ WebRtcIsacfix_kCosTab1[k] * outre1Q16[k] | ||||||
|   vmull.s32 q11, d13, d5      @ kCosTab1[k] * outre1Q16[k] |   vmull.s32 q11, d13, d5      @ WebRtcIsacfix_kCosTab1[k] * outre1Q16[k] | ||||||
|   vmull.s32 q12, d14, d6      @ kCosTab1[k] * outre1Q16[k] |   vmull.s32 q12, d14, d6      @ WebRtcIsacfix_kCosTab1[k] * outre1Q16[k] | ||||||
|   vmull.s32 q13, d15, d7      @ kCosTab1[k] * outre1Q16[k] |   vmull.s32 q13, d15, d7      @ WebRtcIsacfix_kCosTab1[k] * outre1Q16[k] | ||||||
|  |  | ||||||
|   vmlsl.s32 q10, d16, d8      @ += kSinTab1[k] * outre2Q16[k] |   vmlsl.s32 q10, d16, d8      @ += WebRtcIsacfix_kSinTab1[k] * outre2Q16[k] | ||||||
|   vmlsl.s32 q11, d17, d9      @ += kSinTab1[k] * outre2Q16[k] |   vmlsl.s32 q11, d17, d9      @ += WebRtcIsacfix_kSinTab1[k] * outre2Q16[k] | ||||||
|   vmlsl.s32 q12, d18, d10     @ += kSinTab1[k] * outre2Q16[k] |   vmlsl.s32 q12, d18, d10     @ += WebRtcIsacfix_kSinTab1[k] * outre2Q16[k] | ||||||
|   vmlsl.s32 q13, d19, d11     @ += kSinTab1[k] * outre2Q16[k] |   vmlsl.s32 q13, d19, d11     @ += WebRtcIsacfix_kSinTab1[k] * outre2Q16[k] | ||||||
|  |  | ||||||
|   vrshrn.s64 d20, q10, #10    @ xrQ16 |   vrshrn.s64 d20, q10, #10    @ xrQ16 | ||||||
|   vrshrn.s64 d21, q11, #10    @ xrQ16 |   vrshrn.s64 d21, q11, #10    @ xrQ16 | ||||||
|   vrshrn.s64 d22, q12, #10    @ xrQ16 |   vrshrn.s64 d22, q12, #10    @ xrQ16 | ||||||
|   vrshrn.s64 d23, q13, #10    @ xrQ16 |   vrshrn.s64 d23, q13, #10    @ xrQ16 | ||||||
|  |  | ||||||
|   vmull.s32 q12, d12, d8      @ kCosTab1[k] * outre2Q16[k] |   vmull.s32 q12, d12, d8      @ WebRtcIsacfix_kCosTab1[k] * outre2Q16[k] | ||||||
|   vmull.s32 q13, d13, d9      @ kCosTab1[k] * outre2Q16[k] |   vmull.s32 q13, d13, d9      @ WebRtcIsacfix_kCosTab1[k] * outre2Q16[k] | ||||||
|   vmull.s32 q14, d14, d10     @ kCosTab1[k] * outre2Q16[k] |   vmull.s32 q14, d14, d10     @ WebRtcIsacfix_kCosTab1[k] * outre2Q16[k] | ||||||
|   vmull.s32 q15, d15, d11     @ kCosTab1[k] * outre2Q16[k] |   vmull.s32 q15, d15, d11     @ WebRtcIsacfix_kCosTab1[k] * outre2Q16[k] | ||||||
|  |  | ||||||
|   vmlal.s32 q12, d16, d4      @ += kSinTab1[k] * outre1Q16[k] |   vmlal.s32 q12, d16, d4      @ += WebRtcIsacfix_kSinTab1[k] * outre1Q16[k] | ||||||
|   vmlal.s32 q13, d17, d5      @ += kSinTab1[k] * outre1Q16[k] |   vmlal.s32 q13, d17, d5      @ += WebRtcIsacfix_kSinTab1[k] * outre1Q16[k] | ||||||
|   vmlal.s32 q14, d18, d6      @ += kSinTab1[k] * outre1Q16[k] |   vmlal.s32 q14, d18, d6      @ += WebRtcIsacfix_kSinTab1[k] * outre1Q16[k] | ||||||
|   vmlal.s32 q15, d19, d7      @ += kSinTab1[k] * outre1Q16[k] |   vmlal.s32 q15, d19, d7      @ += WebRtcIsacfix_kSinTab1[k] * outre1Q16[k] | ||||||
|  |  | ||||||
|   vdup.s32 q4, r0             @ generic -> Neon doesn't cost extra cycles. |   vdup.s32 q4, r0             @ generic -> Neon doesn't cost extra cycles. | ||||||
|  |  | ||||||
| @@ -622,4 +625,3 @@ DemodulateAndSeparate: | |||||||
|   add sp, sp, #16 |   add sp, sp, #16 | ||||||
|   vpop {q4-q7} |   vpop {q4-q7} | ||||||
|   pop {r4-r11,pc} |   pop {r4-r11,pc} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -27,31 +27,21 @@ FILE *dfile; | |||||||
| FILE *testfile; | FILE *testfile; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef AECM_SHORT | // Square root of Hanning window in Q14. | ||||||
|  | #if defined(WEBRTC_DETECT_ARM_NEON) || defined(WEBRTC_ARCH_ARM_NEON) | ||||||
| // Square root of Hanning window in Q14 | // Table is defined in an ARM assembly file. | ||||||
| const WebRtc_Word16 WebRtcAecm_kSqrtHanning[] = | extern const ALIGN8_BEG WebRtc_Word16 WebRtcAecm_kSqrtHanning[] ALIGN8_END; | ||||||
| { |  | ||||||
|     0, 804, 1606, 2404, 3196, 3981, 4756, 5520, |  | ||||||
|     6270, 7005, 7723, 8423, 9102, 9760, 10394, 11003, |  | ||||||
|     11585, 12140, 12665, 13160, 13623, 14053, 14449, 14811, |  | ||||||
|     15137, 15426, 15679, 15893, 16069, 16207, 16305, 16364, |  | ||||||
|     16384 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #else | #else | ||||||
|  | static const ALIGN8_BEG WebRtc_Word16 WebRtcAecm_kSqrtHanning[] ALIGN8_END = { | ||||||
| // Square root of Hanning window in Q14 |   0, 399, 798, 1196, 1594, 1990, 2386, 2780, 3172, | ||||||
| const ALIGN8_BEG WebRtc_Word16 WebRtcAecm_kSqrtHanning[] ALIGN8_END = |   3562, 3951, 4337, 4720, 5101, 5478, 5853, 6224, | ||||||
| { |   6591, 6954, 7313, 7668, 8019, 8364, 8705, 9040, | ||||||
|     0, 399, 798, 1196, 1594, 1990, 2386, 2780, 3172, |   9370, 9695, 10013, 10326, 10633, 10933, 11227, 11514, | ||||||
|     3562, 3951, 4337, 4720, 5101, 5478, 5853, 6224, 6591, 6954, 7313, 7668, 8019, 8364, |   11795, 12068, 12335, 12594, 12845, 13089, 13325, 13553, | ||||||
|     8705, 9040, 9370, 9695, 10013, 10326, 10633, 10933, 11227, 11514, 11795, 12068, 12335, |   13773, 13985, 14189, 14384, 14571, 14749, 14918, 15079, | ||||||
|     12594, 12845, 13089, 13325, 13553, 13773, 13985, 14189, 14384, 14571, 14749, 14918, |   15231, 15373, 15506, 15631, 15746, 15851, 15947, 16034, | ||||||
|     15079, 15231, 15373, 15506, 15631, 15746, 15851, 15947, 16034, 16111, 16179, 16237, |   16111, 16179, 16237, 16286, 16325, 16354, 16373, 16384 | ||||||
|     16286, 16325, 16354, 16373, 16384 |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| //Q15 alpha = 0.99439986968132  const Factor for magnitude approximation | //Q15 alpha = 0.99439986968132  const Factor for magnitude approximation | ||||||
|   | |||||||
| @@ -25,8 +25,6 @@ | |||||||
| #define ALIGN8_END __attribute__((aligned(8))) | #define ALIGN8_END __attribute__((aligned(8))) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| extern const WebRtc_Word16 WebRtcAecm_kSqrtHanning[] ALIGN8_END; |  | ||||||
|  |  | ||||||
| typedef struct { | typedef struct { | ||||||
|     WebRtc_Word16 real; |     WebRtc_Word16 real; | ||||||
|     WebRtc_Word16 imag; |     WebRtc_Word16 imag; | ||||||
|   | |||||||
| @@ -16,8 +16,7 @@ | |||||||
| #include "aecm_core_neon_offsets.h" | #include "aecm_core_neon_offsets.h" | ||||||
| #include "webrtc/system_wrappers/interface/asm_defines.h" | #include "webrtc/system_wrappers/interface/asm_defines.h" | ||||||
|  |  | ||||||
| .extern WebRtcAecm_kSqrtHanning | GLOBAL_LABEL WebRtcAecm_kSqrtHanning | ||||||
|  |  | ||||||
| GLOBAL_FUNCTION WebRtcAecm_WindowAndFFTNeon | GLOBAL_FUNCTION WebRtcAecm_WindowAndFFTNeon | ||||||
| GLOBAL_FUNCTION WebRtcAecm_InverseFFTAndWindowNeon | GLOBAL_FUNCTION WebRtcAecm_InverseFFTAndWindowNeon | ||||||
| GLOBAL_FUNCTION WebRtcAecm_CalcLinearEnergiesNeon | GLOBAL_FUNCTION WebRtcAecm_CalcLinearEnergiesNeon | ||||||
| @@ -38,7 +37,7 @@ DEFINE_FUNCTION WebRtcAecm_WindowAndFFTNeon | |||||||
|  |  | ||||||
|   vmov.i16 d21, #0                           @ For imaginary parts of |fft|. |   vmov.i16 d21, #0                           @ For imaginary parts of |fft|. | ||||||
|   vmov.i16 d27, #0                           @ For imaginary parts of |fft|. |   vmov.i16 d27, #0                           @ For imaginary parts of |fft|. | ||||||
|   ldr r5, =WebRtcAecm_kSqrtHanning |   adr r5, WebRtcAecm_kSqrtHanning | ||||||
|   adr lr, kSqrtHanningReversed |   adr lr, kSqrtHanningReversed | ||||||
|   add r4, r1, #(PART_LEN2 * 2)               @ &fft[PART_LEN2] |   add r4, r1, #(PART_LEN2 * 2)               @ &fft[PART_LEN2] | ||||||
|   add r12, r2, #(PART_LEN * 2)               @ time_signal[PART_LEN] |   add r12, r2, #(PART_LEN * 2)               @ time_signal[PART_LEN] | ||||||
| @@ -133,7 +132,7 @@ LOOP_PRE_IFFT: | |||||||
|   ldrsh r2, [r5, r12]                        @ &aecm->dfaCleanQDomain[0] |   ldrsh r2, [r5, r12]                        @ &aecm->dfaCleanQDomain[0] | ||||||
|  |  | ||||||
|   adr r12, kSqrtHanningReversed |   adr r12, kSqrtHanningReversed | ||||||
|   ldr r6, =WebRtcAecm_kSqrtHanning |   adr r6, WebRtcAecm_kSqrtHanning | ||||||
|   rsb r0, r2, r0                             @ outCFFT - aecm->dfaCleanQDomain |   rsb r0, r2, r0                             @ outCFFT - aecm->dfaCleanQDomain | ||||||
|   vdup.32 q9, r0 |   vdup.32 q9, r0 | ||||||
|   add r0, r4, #(PART_LEN * 4)                @ &efw[PART_LEN] |   add r0, r4, #(PART_LEN * 4)                @ &efw[PART_LEN] | ||||||
| @@ -321,8 +320,21 @@ LOOP_RESET_ADAPTIVE_CHANNEL: | |||||||
|  |  | ||||||
|   bx  lr |   bx  lr | ||||||
|  |  | ||||||
|   @ Square root of Hanning window in Q14. Compared to WebRtcAecm_kSqrtHanning, | @ Square root of Hanning window in Q14. | ||||||
|   @ the order was reversed and one useless element (0) was removed. | .align 3 | ||||||
|  | WebRtcAecm_kSqrtHanning: | ||||||
|  |   .short 0 | ||||||
|  |   .short 399, 798, 1196, 1594, 1990, 2386, 2780, 3172 | ||||||
|  |   .short 3562, 3951, 4337, 4720, 5101, 5478, 5853, 6224 | ||||||
|  |   .short 6591, 6954, 7313, 7668, 8019, 8364, 8705, 9040 | ||||||
|  |   .short 9370, 9695, 10013, 10326, 10633, 10933, 11227, 11514 | ||||||
|  |   .short 11795, 12068, 12335, 12594, 12845, 13089, 13325, 13553 | ||||||
|  |   .short 13773, 13985, 14189, 14384, 14571, 14749, 14918, 15079 | ||||||
|  |   .short 15231, 15373, 15506, 15631, 15746, 15851, 15947, 16034 | ||||||
|  |   .short 16111, 16179, 16237, 16286, 16325, 16354, 16373, 16384 | ||||||
|  |  | ||||||
|  | @ Square root of Hanning window in Q14. Compared to WebRtcAecm_kSqrtHanning, | ||||||
|  | @ the order was reversed and one element (0) was removed. | ||||||
| .align  3 | .align  3 | ||||||
| kSqrtHanningReversed: | kSqrtHanningReversed: | ||||||
|   .short 16384, 16373, 16354, 16325, 16286, 16237, 16179, 16111, 16034, 15947 |   .short 16384, 16373, 16354, 16325, 16286, 16237, 16179, 16111, 16034, 15947 | ||||||
|   | |||||||
| @@ -19,23 +19,28 @@ | |||||||
| // generating script and makefile, to replace these C functions. | // generating script and makefile, to replace these C functions. | ||||||
|  |  | ||||||
| // Square root of Hanning window in Q14. | // Square root of Hanning window in Q14. | ||||||
| static const WebRtc_Word16 kSqrtHanningReversed[] ALIGN8_END = { | const ALIGN8_BEG WebRtc_Word16 WebRtcAecm_kSqrtHanning[] ALIGN8_END = { | ||||||
|   16384, 16373, 16354, 16325, |   0, | ||||||
|   16286, 16237, 16179, 16111, |   399, 798, 1196, 1594, 1990, 2386, 2780, 3172, | ||||||
|   16034, 15947, 15851, 15746, |   3562, 3951, 4337, 4720, 5101, 5478, 5853, 6224, | ||||||
|   15631, 15506, 15373, 15231, |   6591, 6954, 7313, 7668, 8019, 8364, 8705, 9040, | ||||||
|   15079, 14918, 14749, 14571, |   9370, 9695, 10013, 10326, 10633, 10933, 11227, 11514, | ||||||
|   14384, 14189, 13985, 13773, |   11795, 12068, 12335, 12594, 12845, 13089, 13325, 13553, | ||||||
|   13553, 13325, 13089, 12845, |   13773, 13985, 14189, 14384, 14571, 14749, 14918, 15079, | ||||||
|   12594, 12335, 12068, 11795, |   15231, 15373, 15506, 15631, 15746, 15851, 15947, 16034, | ||||||
|   11514, 11227, 10933, 10633, |   16111, 16179, 16237, 16286, 16325, 16354, 16373, 16384 | ||||||
|   10326, 10013, 9695,  9370, | }; | ||||||
|   9040,  8705,  8364,  8019, |  | ||||||
|   7668,  7313,  6954,  6591, | // Square root of Hanning window in Q14, in reversed order. | ||||||
|   6224,  5853,  5478,  5101, | static const ALIGN8_BEG WebRtc_Word16 kSqrtHanningReversed[] ALIGN8_END = { | ||||||
|   4720,  4337,  3951,  3562, |   16384, 16373, 16354, 16325, 16286, 16237, 16179, 16111, | ||||||
|   3172,  2780,  2386,  1990, |   16034, 15947, 15851, 15746, 15631, 15506, 15373, 15231, | ||||||
|   1594,  1196,  798,   399 |   15079, 14918, 14749, 14571, 14384, 14189, 13985, 13773, | ||||||
|  |   13553, 13325, 13089, 12845, 12594, 12335, 12068, 11795, | ||||||
|  |   11514, 11227, 10933, 10633, 10326, 10013, 9695,  9370, | ||||||
|  |   9040,  8705,  8364,  8019, 7668,  7313,  6954,  6591, | ||||||
|  |   6224,  5853,  5478,  5101, 4720,  4337,  3951,  3562, | ||||||
|  |   3172,  2780,  2386,  1990, 1594,  1196,  798,   399 | ||||||
| }; | }; | ||||||
|  |  | ||||||
| void WebRtcAecm_WindowAndFFTNeon(AecmCore_t* aecm, | void WebRtcAecm_WindowAndFFTNeon(AecmCore_t* aecm, | ||||||
|   | |||||||
| @@ -13,18 +13,11 @@ | |||||||
|  |  | ||||||
| #define AECM_DYNAMIC_Q                 /* Turn on/off dynamic Q-domain. */ | #define AECM_DYNAMIC_Q                 /* Turn on/off dynamic Q-domain. */ | ||||||
|  |  | ||||||
| /* #define AECM_SHORT                   For 32 sample partition length. */ |  | ||||||
|  |  | ||||||
| /* Algorithm parameters */ | /* Algorithm parameters */ | ||||||
| #define FRAME_LEN       80             /* Total frame length, 10 ms. */ | #define FRAME_LEN       80             /* Total frame length, 10 ms. */ | ||||||
|  |  | ||||||
| #ifdef AECM_SHORT |  | ||||||
| #define PART_LEN        32             /* Length of partition. */ |  | ||||||
| #define PART_LEN_SHIFT  6              /* Length of (PART_LEN * 2) in base 2. */ |  | ||||||
| #else |  | ||||||
| #define PART_LEN        64             /* Length of partition. */ | #define PART_LEN        64             /* Length of partition. */ | ||||||
| #define PART_LEN_SHIFT  7              /* Length of (PART_LEN * 2) in base 2. */ | #define PART_LEN_SHIFT  7              /* Length of (PART_LEN * 2) in base 2. */ | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #define PART_LEN1       (PART_LEN + 1)  /* Unique fft coefficients. */ | #define PART_LEN1       (PART_LEN + 1)  /* Unique fft coefficients. */ | ||||||
| #define PART_LEN2       (PART_LEN << 1) /* Length of partition * 2. */ | #define PART_LEN2       (PART_LEN << 1) /* Length of partition * 2. */ | ||||||
| @@ -33,11 +26,7 @@ | |||||||
| #define MAX_DELAY       100 | #define MAX_DELAY       100 | ||||||
|  |  | ||||||
| /* Counter parameters */ | /* Counter parameters */ | ||||||
| #ifdef AECM_SHORT |  | ||||||
| #define CONV_LEN        1024         /* Convergence length used at startup. */ |  | ||||||
| #else |  | ||||||
| #define CONV_LEN        512          /* Convergence length used at startup. */ | #define CONV_LEN        512          /* Convergence length used at startup. */ | ||||||
| #endif |  | ||||||
| #define CONV_LEN2       (CONV_LEN << 1) /* Used at startup. */ | #define CONV_LEN2       (CONV_LEN << 1) /* Used at startup. */ | ||||||
|  |  | ||||||
| /* Energy parameters */ | /* Energy parameters */ | ||||||
|   | |||||||
| @@ -20,48 +20,56 @@ | |||||||
| #include "cpu_features_wrapper.h" | #include "cpu_features_wrapper.h" | ||||||
| #include "nsx_core.h" | #include "nsx_core.h" | ||||||
|  |  | ||||||
| // Skip first frequency bins during estimation. (0 <= value < 64) | #if (defined WEBRTC_DETECT_ARM_NEON || defined WEBRTC_ARCH_ARM_NEON) | ||||||
| static const int kStartBand = 5; | /* Tables are defined in ARM assembly files. */ | ||||||
|  | extern const WebRtc_Word16 WebRtcNsx_kLogTable[9]; | ||||||
| // Constants to compensate for shifting signal log(2^shifts). | extern const WebRtc_Word16 WebRtcNsx_kCounterDiv[201]; | ||||||
| const WebRtc_Word16 WebRtcNsx_kLogTable[9] = { | extern const WebRtc_Word16 WebRtcNsx_kLogTableFrac[256]; | ||||||
|  | #else | ||||||
|  | static const WebRtc_Word16 WebRtcNsx_kLogTable[9] = { | ||||||
|   0, 177, 355, 532, 710, 887, 1065, 1242, 1420 |   0, 177, 355, 532, 710, 887, 1065, 1242, 1420 | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const WebRtc_Word16 WebRtcNsx_kCounterDiv[201] = { | static const WebRtc_Word16 WebRtcNsx_kCounterDiv[201] = { | ||||||
|   32767, 16384, 10923, 8192, 6554, 5461, 4681, |   32767, 16384, 10923, 8192, 6554, 5461, 4681, 4096, 3641, 3277, 2979, 2731, | ||||||
|   4096, 3641, 3277, 2979, 2731, 2521, 2341, 2185, 2048, 1928, 1820, 1725, 1638, 1560, |   2521, 2341, 2185, 2048, 1928, 1820, 1725, 1638, 1560, 1489, 1425, 1365, 1311, | ||||||
|   1489, 1425, 1365, 1311, 1260, 1214, 1170, 1130, 1092, 1057, 1024, 993, 964, 936, 910, |   1260, 1214, 1170, 1130, 1092, 1057, 1024, 993, 964, 936, 910, 886, 862, 840, | ||||||
|   886, 862, 840, 819, 799, 780, 762, 745, 728, 712, 697, 683, 669, 655, 643, 630, 618, |   819, 799, 780, 762, 745, 728, 712, 697, 683, 669, 655, 643, 630, 618, 607, | ||||||
|   607, 596, 585, 575, 565, 555, 546, 537, 529, 520, 512, 504, 496, 489, 482, 475, 468, |   596, 585, 575, 565, 555, 546, 537, 529, 520, 512, 504, 496, 489, 482, 475, | ||||||
|   462, 455, 449, 443, 437, 431, 426, 420, 415, 410, 405, 400, 395, 390, 386, 381, 377, |   468, 462, 455, 449, 443, 437, 431, 426, 420, 415, 410, 405, 400, 395, 390, | ||||||
|   372, 368, 364, 360, 356, 352, 349, 345, 341, 338, 334, 331, 328, 324, 321, 318, 315, |   386, 381, 377, 372, 368, 364, 360, 356, 352, 349, 345, 341, 338, 334, 331, | ||||||
|   312, 309, 306, 303, 301, 298, 295, 293, 290, 287, 285, 282, 280, 278, 275, 273, 271, |   328, 324, 321, 318, 315, 312, 309, 306, 303, 301, 298, 295, 293, 290, 287, | ||||||
|   269, 266, 264, 262, 260, 258, 256, 254, 252, 250, 248, 246, 245, 243, 241, 239, 237, |   285, 282, 280, 278, 275, 273, 271, 269, 266, 264, 262, 260, 258, 256, 254, | ||||||
|   236, 234, 232, 231, 229, 228, 226, 224, 223, 221, 220, 218, 217, 216, 214, 213, 211, |   252, 250, 248, 246, 245, 243, 241, 239, 237, 236, 234, 232, 231, 229, 228, | ||||||
|   210, 209, 207, 206, 205, 204, 202, 201, 200, 199, 197, 196, 195, 194, 193, 192, 191, |   226, 224, 223, 221, 220, 218, 217, 216, 214, 213, 211, 210, 209, 207, 206, | ||||||
|   189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, |   205, 204, 202, 201, 200, 199, 197, 196, 195, 194, 193, 192, 191, 189, 188, | ||||||
|  |   187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, | ||||||
|   172, 172, 171, 170, 169, 168, 167, 166, 165, 165, 164, 163 |   172, 172, 171, 170, 169, 168, 167, 166, 165, 165, 164, 163 | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const WebRtc_Word16 WebRtcNsx_kLogTableFrac[256] = { | static const WebRtc_Word16 WebRtcNsx_kLogTableFrac[256] = { | ||||||
|   0,   1,   3,   4,   6,   7,   9,  10,  11,  13,  14,  16,  17,  18,  20,  21, |   0,   1,   3,   4,   6,   7,   9,  10,  11,  13,  14,  16,  17,  18,  20,  21, | ||||||
|   22,  24,  25,  26,  28,  29,  30,  32,  33,  34,  36,  37,  38,  40,  41,  42, |   22,  24,  25,  26,  28,  29,  30,  32,  33,  34,  36,  37,  38,  40,  41,  42, | ||||||
|   44,  45,  46,  47,  49,  50,  51,  52,  54,  55,  56,  57,  59,  60,  61,  62, |   44,  45,  46,  47,  49,  50,  51,  52,  54,  55,  56,  57,  59,  60,  61,  62, | ||||||
|   63,  65,  66,  67,  68,  69,  71,  72,  73,  74,  75,  77,  78,  79,  80,  81, |   63,  65,  66,  67,  68,  69,  71,  72,  73,  74,  75,  77,  78,  79,  80,  81, | ||||||
|   82,  84,  85,  86,  87,  88,  89,  90,  92,  93,  94,  95,  96,  97,  98,  99, |   82,  84,  85,  86,  87,  88,  89,  90,  92,  93,  94,  95,  96,  97,  98,  99, | ||||||
|   100, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 116, 117, |   100, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 116, | ||||||
|   118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, |   117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, | ||||||
|   134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, |   132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, | ||||||
|   150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, |   147, 148, 149, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, | ||||||
|   165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 178, |   161, 162, 163, 164, 165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174, | ||||||
|   179, 180, 181, 182, 183, 184, 185, 185, 186, 187, 188, 189, 190, 191, 192, 192, |   175, 176, 177, 178, 178, 179, 180, 181, 182, 183, 184, 185, 185, 186, 187, | ||||||
|   193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, |   188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, | ||||||
|   207, 208, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 216, 217, 218, 219, |   201, 202, 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 212, | ||||||
|   220, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 228, 229, 230, 231, 231, |   213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224, | ||||||
|   232, 233, 234, 234, 235, 236, 237, 238, 238, 239, 240, 241, 241, 242, 243, 244, |   225, 226, 227, 228, 228, 229, 230, 231, 231, 232, 233, 234, 234, 235, 236, | ||||||
|   244, 245, 246, 247, 247, 248, 249, 249, 250, 251, 252, 252, 253, 254, 255, 255 |   237, 238, 238, 239, 240, 241, 241, 242, 243, 244, 244, 245, 246, 247, 247, | ||||||
|  |   248, 249, 249, 250, 251, 252, 252, 253, 254, 255, 255 | ||||||
| }; | }; | ||||||
|  | #endif  // WEBRTC_DETECT_ARM_NEON || WEBRTC_ARCH_ARM_NEON | ||||||
|  |  | ||||||
|  | // Skip first frequency bins during estimation. (0 <= value < 64) | ||||||
|  | static const int kStartBand = 5; | ||||||
|  |  | ||||||
| static const WebRtc_Word16 kPowTableFrac[1024] = { | static const WebRtc_Word16 kPowTableFrac[1024] = { | ||||||
|   0,    1,    1,    2,    3,    3,    4,    5, |   0,    1,    1,    2,    3,    3,    4,    5, | ||||||
|   | |||||||
| @@ -227,10 +227,6 @@ void WebRtcNsx_DenormalizeNeon(NsxInst_t* inst, int16_t* in, int factor); | |||||||
| void WebRtcNsx_PrepareSpectrumNeon(NsxInst_t* inst, int16_t* freq_buff); | void WebRtcNsx_PrepareSpectrumNeon(NsxInst_t* inst, int16_t* freq_buff); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| extern const WebRtc_Word16 WebRtcNsx_kLogTable[9]; |  | ||||||
| extern const WebRtc_Word16 WebRtcNsx_kLogTableFrac[256]; |  | ||||||
| extern const WebRtc_Word16 WebRtcNsx_kCounterDiv[201]; |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -22,6 +22,48 @@ GLOBAL_FUNCTION WebRtcNsx_SynthesisUpdateNeon | |||||||
| GLOBAL_FUNCTION WebRtcNsx_AnalysisUpdateNeon | GLOBAL_FUNCTION WebRtcNsx_AnalysisUpdateNeon | ||||||
| GLOBAL_FUNCTION WebRtcNsx_DenormalizeNeon | GLOBAL_FUNCTION WebRtcNsx_DenormalizeNeon | ||||||
| GLOBAL_FUNCTION WebRtcNsx_CreateComplexBufferNeon | GLOBAL_FUNCTION WebRtcNsx_CreateComplexBufferNeon | ||||||
|  | GLOBAL_LABEL WebRtcNsx_kLogTable | ||||||
|  | GLOBAL_LABEL WebRtcNsx_kCounterDiv | ||||||
|  | GLOBAL_LABEL WebRtcNsx_kLogTableFrac | ||||||
|  |  | ||||||
|  | WebRtcNsx_kLogTableFrac: | ||||||
|  | .short 0, 1, 3, 4, 6, 7, 9, 10, 11, 13, 14, 16, 17, 18, 20, 21, 22, 24, 25, 26 | ||||||
|  | .short 28, 29, 30, 32, 33, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 50 | ||||||
|  | .short 51, 52, 54, 55, 56, 57, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, 71, 72 | ||||||
|  | .short 73, 74, 75, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90, 92, 93 | ||||||
|  | .short 94, 95, 96, 97, 98, 99, 100, 102, 103, 104, 105, 106, 107, 108, 109, 110 | ||||||
|  | .short 111, 112, 113, 114, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126 | ||||||
|  | .short 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141 | ||||||
|  | .short 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 155 | ||||||
|  | .short 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 169 | ||||||
|  | .short 170, 171, 172, 173, 174, 175, 176, 177, 178, 178, 179, 180, 181, 182, 183 | ||||||
|  | .short 184, 185, 185, 186, 187, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196 | ||||||
|  | .short 197, 198, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 208, 208 | ||||||
|  | .short 209, 210, 211, 212, 212, 213, 214, 215, 216, 216, 217, 218, 219, 220, 220 | ||||||
|  | .short 221, 222, 223, 224, 224, 225, 226, 227, 228, 228, 229, 230, 231, 231, 232 | ||||||
|  | .short 233, 234, 234, 235, 236, 237, 238, 238, 239, 240, 241, 241, 242, 243, 244 | ||||||
|  | .short 244, 245, 246, 247, 247, 248, 249, 249, 250, 251, 252, 252, 253, 254, 255 | ||||||
|  | .short 255 | ||||||
|  |  | ||||||
|  | WebRtcNsx_kCounterDiv: | ||||||
|  | .short 32767, 16384, 10923, 8192, 6554, 5461, 4681, 4096, 3641, 3277, 2979 | ||||||
|  | .short 2731, 2521, 2341, 2185, 2048, 1928, 1820, 1725, 1638, 1560, 1489 | ||||||
|  | .short 1425, 1365, 1311, 1260, 1214, 1170, 1130, 1092, 1057, 1024, 993, 964 | ||||||
|  | .short 936, 910, 886, 862, 840, 819, 799, 780, 762, 745, 728, 712, 697, 683 | ||||||
|  | .short 669, 655, 643, 630, 618, 607, 596, 585, 575, 565, 555, 546, 537, 529 | ||||||
|  | .short 520, 512, 504, 496, 489, 482, 475, 468, 462, 455, 449, 443, 437, 431 | ||||||
|  | .short 426, 420, 415, 410, 405, 400, 395, 390, 386, 381, 377, 372, 368, 364 | ||||||
|  | .short 360, 356, 352, 349, 345, 341, 338, 334, 331, 328, 324, 321, 318, 315 | ||||||
|  | .short 312, 309, 306, 303, 301, 298, 295, 293, 290, 287, 285, 282, 280, 278 | ||||||
|  | .short 275, 273, 271, 269, 266, 264, 262, 260, 258, 256, 254, 252, 250, 248 | ||||||
|  | .short 246, 245, 243, 241, 239, 237, 236, 234, 232, 231, 229, 228, 226, 224 | ||||||
|  | .short 223, 221, 220, 218, 217, 216, 214, 213, 211, 210, 209, 207, 206, 205 | ||||||
|  | .short 204, 202, 201, 200, 199, 197, 196, 195, 194, 193, 192, 191, 189, 188 | ||||||
|  | .short 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174 | ||||||
|  | .short 173, 172, 172, 171, 170, 169, 168, 167, 166, 165, 165, 164, 163 | ||||||
|  |  | ||||||
|  | WebRtcNsx_kLogTable: | ||||||
|  | .short  0, 177, 355, 532, 710, 887, 1065, 1242, 1420 | ||||||
|  |  | ||||||
| @ void NoiseEstimationNeon(NsxInst_t* inst, | @ void NoiseEstimationNeon(NsxInst_t* inst, | ||||||
| @                          uint16_t* magn, | @                          uint16_t* magn, | ||||||
| @@ -56,7 +98,7 @@ DEFINE_FUNCTION WebRtcNsx_NoiseEstimationNeon | |||||||
|   movw r4, #offset_nsx_normData |   movw r4, #offset_nsx_normData | ||||||
|   ldr r2, [r0, #offset_nsx_stages]            @ inst->stages |   ldr r2, [r0, #offset_nsx_stages]            @ inst->stages | ||||||
|   ldr r4, [r0, r4]            @ inst->normData |   ldr r4, [r0, r4]            @ inst->normData | ||||||
|   ldr r12, =WebRtcNsx_kLogTable |   adr r12, WebRtcNsx_kLogTable | ||||||
|   subs r3, r2, r4             @ tabind = inst->stages - inst->normData; |   subs r3, r2, r4             @ tabind = inst->stages - inst->normData; | ||||||
|   ldr r5, [r0, #offset_nsx_magnLen]            @ magnLen |   ldr r5, [r0, #offset_nsx_magnLen]            @ magnLen | ||||||
|   rsblt r3, #0 |   rsblt r3, #0 | ||||||
| @@ -67,7 +109,7 @@ DEFINE_FUNCTION WebRtcNsx_NoiseEstimationNeon | |||||||
|   str r3, [sp] |   str r3, [sp] | ||||||
|   vdup.16 q15, r3 |   vdup.16 q15, r3 | ||||||
|  |  | ||||||
|   ldr r9, =WebRtcNsx_kLogTableFrac |   adr r9, WebRtcNsx_kLogTableFrac | ||||||
|  |  | ||||||
| LOOP_SET_LMAGN: | LOOP_SET_LMAGN: | ||||||
|   ldrh r2, [r1], #2           @ magn[i] |   ldrh r2, [r1], #2           @ magn[i] | ||||||
| @@ -114,7 +156,7 @@ CHECK_LMAGN_COUNTER: | |||||||
|  |  | ||||||
| LOOP_SIMULT: | LOOP_SIMULT: | ||||||
|   ldrsh r1, [r10]             @ inst->noiseEstCounter[s] |   ldrsh r1, [r10]             @ inst->noiseEstCounter[s] | ||||||
|   ldr r3, =WebRtcNsx_kCounterDiv |   adr r3, WebRtcNsx_kCounterDiv | ||||||
|   mov r11, r1, lsl #1         @ counter |   mov r11, r1, lsl #1         @ counter | ||||||
|   ldrh r11, [r3, r11]         @ countDiv = WebRtcNsx_kCounterDiv[counter]; |   ldrh r11, [r3, r11]         @ countDiv = WebRtcNsx_kCounterDiv[counter]; | ||||||
|   sub r12, r6, #1             @ Loop counter. |   sub r12, r6, #1             @ Loop counter. | ||||||
|   | |||||||
| @@ -13,6 +13,48 @@ | |||||||
| #include <arm_neon.h> | #include <arm_neon.h> | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
|  |  | ||||||
|  | // Constants to compensate for shifting signal log(2^shifts). | ||||||
|  | const WebRtc_Word16 WebRtcNsx_kLogTable[9] = { | ||||||
|  |   0, 177, 355, 532, 710, 887, 1065, 1242, 1420 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | const WebRtc_Word16 WebRtcNsx_kCounterDiv[201] = { | ||||||
|  |   32767, 16384, 10923, 8192, 6554, 5461, 4681, 4096, 3641, 3277, 2979, 2731, | ||||||
|  |   2521, 2341, 2185, 2048, 1928, 1820, 1725, 1638, 1560, 1489, 1425, 1365, 1311, | ||||||
|  |   1260, 1214, 1170, 1130, 1092, 1057, 1024, 993, 964, 936, 910, 886, 862, 840, | ||||||
|  |   819, 799, 780, 762, 745, 728, 712, 697, 683, 669, 655, 643, 630, 618, 607, | ||||||
|  |   596, 585, 575, 565, 555, 546, 537, 529, 520, 512, 504, 496, 489, 482, 475, | ||||||
|  |   468, 462, 455, 449, 443, 437, 431, 426, 420, 415, 410, 405, 400, 395, 390, | ||||||
|  |   386, 381, 377, 372, 368, 364, 360, 356, 352, 349, 345, 341, 338, 334, 331, | ||||||
|  |   328, 324, 321, 318, 315, 312, 309, 306, 303, 301, 298, 295, 293, 290, 287, | ||||||
|  |   285, 282, 280, 278, 275, 273, 271, 269, 266, 264, 262, 260, 258, 256, 254, | ||||||
|  |   252, 250, 248, 246, 245, 243, 241, 239, 237, 236, 234, 232, 231, 229, 228, | ||||||
|  |   226, 224, 223, 221, 220, 218, 217, 216, 214, 213, 211, 210, 209, 207, 206, | ||||||
|  |   205, 204, 202, 201, 200, 199, 197, 196, 195, 194, 193, 192, 191, 189, 188, | ||||||
|  |   187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, | ||||||
|  |   172, 172, 171, 170, 169, 168, 167, 166, 165, 165, 164, 163 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | const WebRtc_Word16 WebRtcNsx_kLogTableFrac[256] = { | ||||||
|  |   0, 1, 3, 4, 6, 7, 9, 10, 11, 13, 14, 16, 17, 18, 20, 21, | ||||||
|  |   22, 24, 25, 26, 28, 29, 30, 32, 33, 34, 36, 37, 38, 40, 41, 42, | ||||||
|  |   44, 45, 46, 47, 49, 50, 51, 52, 54, 55, 56, 57, 59, 60, 61, 62, | ||||||
|  |   63, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, | ||||||
|  |   82, 84, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 97, 98, 99, | ||||||
|  |   100, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 116, | ||||||
|  |   117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, | ||||||
|  |   132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, | ||||||
|  |   147, 148, 149, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, | ||||||
|  |   161, 162, 163, 164, 165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174, | ||||||
|  |   175, 176, 177, 178, 178, 179, 180, 181, 182, 183, 184, 185, 185, 186, 187, | ||||||
|  |   188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, | ||||||
|  |   201, 202, 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 212, | ||||||
|  |   213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224, | ||||||
|  |   225, 226, 227, 228, 228, 229, 230, 231, 231, 232, 233, 234, 234, 235, 236, | ||||||
|  |   237, 238, 238, 239, 240, 241, 241, 242, 243, 244, 244, 245, 246, 247, 247, | ||||||
|  |   248, 249, 249, 250, 251, 252, 252, 253, 254, 255, 255 | ||||||
|  | }; | ||||||
|  |  | ||||||
| // Update the noise estimation information. | // Update the noise estimation information. | ||||||
| static void UpdateNoiseEstimateNeon(NsxInst_t* inst, int offset) { | static void UpdateNoiseEstimateNeon(NsxInst_t* inst, int offset) { | ||||||
|   const int16_t kExp2Const = 11819; // Q13 |   const int16_t kExp2Const = 11819; // Q13 | ||||||
|   | |||||||
| @@ -27,6 +27,9 @@ _\name: | |||||||
| .macro CALL_FUNCTION name | .macro CALL_FUNCTION name | ||||||
| bl _\name | bl _\name | ||||||
| .endm | .endm | ||||||
|  | .macro GLOBAL_LABEL name | ||||||
|  | .global _\name | ||||||
|  | .endm | ||||||
| #else | #else | ||||||
| .macro GLOBAL_FUNCTION name | .macro GLOBAL_FUNCTION name | ||||||
| .global \name | .global \name | ||||||
| @@ -37,6 +40,9 @@ bl _\name | |||||||
| .macro CALL_FUNCTION name | .macro CALL_FUNCTION name | ||||||
| bl \name | bl \name | ||||||
| .endm | .endm | ||||||
|  | .macro GLOBAL_LABEL name | ||||||
|  | .global \name | ||||||
|  | .endm | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| .text | .text | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 kma@webrtc.org
					kma@webrtc.org