ains3.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "include.h"
  2. #include "api_ains3.h"
  3. #if (AINS3_EN)
  4. #define PART_LEN (AINS3_PART_LEN << 1)
  5. #define PART_LEN2 (PART_LEN << 1)
  6. #define PART_HALF_LEN (PART_LEN / 2)
  7. #define HANN_SHIFT (16)
  8. static ains3_cb_t ains3_cb;
  9. typedef struct {
  10. // s16 input[PART_LEN];
  11. // s16 fft_output[PART_LEN];
  12. // s16 output[PART_LEN];
  13. s16 input[128];
  14. s16 fft_output[128];
  15. s16 output[128];
  16. u8 iptr;
  17. u8 optr;
  18. } ains3_rdft_t;
  19. static ains3_rdft_t ains3_rdft AT(.ains3_buf.rdft);
  20. static struct nr_buf_t {
  21. // int fft[PART_LEN2];
  22. // s16 xbuf[PART_LEN2];
  23. // int outBuf[PART_LEN];
  24. int fft[256];
  25. s16 xbuf[256];
  26. int outBuf[128];
  27. } nr_buf AT(.fft_buf.buf);
  28. typedef struct {
  29. u8 sysclk;
  30. bool init;
  31. } ains3_var_t;
  32. static ains3_var_t ains3_var;
  33. #if (PART_LEN == 120)
  34. //120
  35. AT(.fft_rodata)
  36. static const unsigned short sqrt_Hanning[121] = {
  37. 854, 1708, 2562, 3416, 4268, 5121, 5972, 6822, 7671, 8519, 9365, 10210, 11053, 11894, 12733,
  38. 13570, 14405, 15237, 16066, 16893, 17717, 18538, 19356, 20170, 20982, 21789, 22593, 23393,
  39. 24189, 24981, 25769, 26552, 27331, 28105, 28874, 29638, 30398, 31152, 31901, 32645, 33383,
  40. 34115, 34841, 35562, 36277, 36985, 37687, 38383, 39072, 39754, 40430, 41099, 41761, 42416,
  41. 43064, 43704, 44337, 44962, 45580, 46190, 46792, 47386, 47972, 48550, 49120, 49681, 50234,
  42. 50778, 51314, 51841, 52359, 52869, 53369, 53860, 54342, 54815, 55279, 55733, 56178, 56613,
  43. 57038, 57454, 57860, 58257, 58643, 59019, 59386, 59742, 60088, 60424, 60750, 61065, 61370,
  44. 61664, 61948, 62222, 62485, 62737, 62979, 63210, 63430, 63639, 63838, 64026, 64203, 64369,
  45. 64524, 64668, 64801, 64923, 65034, 65134, 65223, 65301, 65368, 65423, 65468, 65501, 65523,
  46. 65535, 65535,
  47. };
  48. #else
  49. //128
  50. AT(.fft_rodata)
  51. static const unsigned short sqrt_Hanning[129] = {
  52. 0x0000,0x0321,0x0642,0x0963,0x0C83,0x0FA3,0x12C2,0x15E1,
  53. 0x18FF,0x1C1C,0x1F37,0x2252,0x256B,0x2883,0x2B99,0x2EAE,
  54. 0x31C0,0x34D1,0x37E0,0x3AED,0x3DF7,0x40FF,0x4405,0x4708,
  55. 0x4A08,0x4D06,0x5000,0x52F8,0x55EC,0x58DD,0x5BCA,0x5EB5,
  56. 0x619B,0x647E,0x675D,0x6A38,0x6D0E,0x6FE1,0x72AF,0x7579,
  57. 0x783F,0x7B00,0x7DBC,0x8074,0x8326,0x85D4,0x887C,0x8B1F,
  58. 0x8DBD,0x9055,0x92E8,0x9575,0x97FD,0x9A7F,0x9CFA,0x9F70,
  59. 0xA1E0,0xA44A,0xA6AD,0xA90A,0xAB60,0xADB0,0xAFF9,0xB23B,
  60. 0xB477,0xB6AC,0xB8DA,0xBB00,0xBD20,0xBF38,0xC149,0xC353,
  61. 0xC555,0xC74F,0xC942,0xCB2E,0xCD11,0xCEED,0xD0C0,0xD28C,
  62. 0xD450,0xD60B,0xD7BF,0xD96A,0xDB0D,0xDCA7,0xDE39,0xDFC2,
  63. 0xE143,0xE2BC,0xE42B,0xE592,0xE6F0,0xE845,0xE992,0xEAD5,
  64. 0xEC10,0xED41,0xEE6A,0xEF89,0xF09F,0xF1AC,0xF2AF,0xF3AA,
  65. 0xF49B,0xF582,0xF661,0xF736,0xF801,0xF8C3,0xF97B,0xFA2A,
  66. 0xFACF,0xFB6B,0xFBFD,0xFC86,0xFD04,0xFD7A,0xFDE5,0xFE47,
  67. 0xFE9F,0xFEED,0xFF31,0xFF6C,0xFF9D,0xFFC4,0xFFE1,0xFFF5,
  68. 0xFFFF
  69. };
  70. #endif
  71. //extern u32 __code_start_alg, __code_end_alg;
  72. void fft_256(s32 *buf);
  73. void ifft_256(s32* buf);
  74. typedef signed long long __int64;
  75. __int64 lo;
  76. #define MZR() do {(lo) = 0;} while(0)
  77. #define ML0(x, y) ((lo) = (__int64)(x) * (__int64)(y))
  78. #define MS0(x, y) ((lo) = -(__int64)(x) * (__int64)(y))
  79. #define MLA(x, y) ((lo) += (__int64)(x) * (__int64)(y))
  80. #define MSB(x, y) ((lo) -= (__int64)(x) * (__int64)(y))
  81. #define MLZ(n) (int)(((lo) + (1<<(n-1)))>>(n))
  82. #define round(x,n) ((int) ((x+(1<<(n-1)))>>n))
  83. #define MAC_LO() ((int *)(void *)&lo)[0]
  84. #define MAC_HI() ((int *)(void *)&lo)[1]
  85. #define MAC_SET_LO(x) do {((int *)(void *)&lo)[0] = x;} while(0)
  86. #define MAC_SET_HI(x) do {((int *)(void *)&lo)[1] = x;} while(0)
  87. #define AEC_SPL_SAT(A, B, C) (B > A ? A : B < C ? C : B)
  88. #define AEC_SPL_WORD16_MAX (32767)
  89. #define AEC_SPL_WORD16_MIN (-32768)
  90. ALWAYS_INLINE int aec_spl_sat(int x0)
  91. {
  92. int y0;
  93. __asm__ volatile("p.clip %0, %1, %2" : "=r"(y0) : "r"(x0), "i"(15));
  94. return y0;
  95. }
  96. AT(.ains3_text.alg)
  97. static void asr_kws_process(void)
  98. {
  99. int i;
  100. struct nr_buf_t *p = &nr_buf;
  101. for(i = 0; i < PART_LEN; i++) {
  102. p->xbuf[i + PART_LEN] = ains3_rdft.input[i];
  103. }
  104. for(i = 0; i < PART_LEN; i++) {
  105. ML0(p->xbuf[i], sqrt_Hanning[i]);
  106. p->fft[i] = MLZ(HANN_SHIFT);
  107. ML0(p->xbuf[PART_LEN + i], sqrt_Hanning[PART_LEN - i]);
  108. p->fft[PART_LEN + i] = MLZ(HANN_SHIFT);
  109. }
  110. fft_256((s32*)p->fft);
  111. ains3_mono_process((s32*)p->fft);
  112. ifft_256((s32*)p->fft);
  113. for(i = 0; i < PART_LEN; i++) {
  114. // Do we need saturation ?
  115. p->fft[i] = AEC_SPL_SAT(AEC_SPL_WORD16_MAX, p->fft[i], AEC_SPL_WORD16_MIN);
  116. ML0(p->fft[i], sqrt_Hanning[i]);
  117. p->fft[i] = MLZ(HANN_SHIFT)+p->outBuf[i];
  118. ains3_rdft.fft_output[i] = (short)AEC_SPL_SAT(AEC_SPL_WORD16_MAX, p->fft[i], AEC_SPL_WORD16_MIN);
  119. ML0(p->fft[PART_LEN + i], sqrt_Hanning[PART_LEN - i]);
  120. p->outBuf[i] = MLZ(HANN_SHIFT);
  121. }
  122. memcpy(p->xbuf, p->xbuf + PART_LEN, 2 * PART_LEN);
  123. }
  124. AT(.ains3_text.ains3)
  125. void ains3_process(s16 *buf)
  126. {
  127. for (int i = 0; i < PART_HALF_LEN; i++) {
  128. ains3_rdft.input[ains3_rdft.iptr * PART_HALF_LEN + i] = buf[i];
  129. }
  130. ains3_rdft.iptr++;
  131. if (ains3_rdft.iptr >= 2) {
  132. ains3_rdft.iptr = 0;
  133. memcpy(ains3_rdft.output, ains3_rdft.fft_output, PART_LEN * 2);
  134. asr_kws_process();
  135. ains3_rdft.optr = 0;
  136. }
  137. memcpy(buf, &ains3_rdft.output[ains3_rdft.optr * PART_HALF_LEN], PART_HALF_LEN * 2);
  138. ains3_rdft.optr++;
  139. if (ains3_rdft.optr >= 2) {
  140. ains3_rdft.optr = 0;
  141. }
  142. }
  143. void ains3_init(void)
  144. {
  145. if (ains3_var.init == 0) {
  146. memset(&ains3_rdft, 0, sizeof(ains3_rdft_t));
  147. memset(&nr_buf, 0, sizeof(struct nr_buf_t));
  148. ains3_cb.nt = AINS3_NT;
  149. ains3_cb.prior_opt_idx = AINS3_PRIOR_OPT_IDX;
  150. ains3_var.sysclk = sys_clk_get_cur();
  151. printf("ains3_var.sysclk:%d\n",ains3_var.sysclk);
  152. if (ains3_var.sysclk < SYS_120M) {
  153. sys_clk_set(SYS_120M);
  154. }
  155. ains3_rdft.optr = 1;
  156. //lock_code_alg((u32)&__code_start_alg, (u32)&__code_end_alg);
  157. ains3_mono_init(&ains3_cb);
  158. ains3_var.init = 1;
  159. }
  160. }
  161. void ains3_exit(void)
  162. {
  163. if (ains3_var.init) {
  164. ains3_var.init = 0;
  165. //unlock_code_alg();
  166. sys_clk_set(ains3_var.sysclk);
  167. }
  168. }
  169. #endif //(AINS3_EN)