45 #define SIN_TAB_LEN 120 48 static const int8_t SIN_TAB[] = {
49 0,6,13,20,26,33,39,45,52,58,63,69,75,80,
50 85,90,95,99,103,107,110,114,116,119,121,
51 123,125,126,127,127,127,127,127,126,125,
52 123,121,119,116,114,110,107,103,99,95,90,
53 85,80,75,69,63,58,52,45,39,33,26,20,13,6,
54 0,-6,-13,-20,-26,-33,-39,-45,-52,-58,-63,
55 -69,-75,-80,-85,-90,-95,-99,-103,-107,-110,
56 -114,-116,-119,-121,-123,-125,-126,-127,-127,
57 -127,-127,-127,-126,-125,-123,-121,-119,-116,
58 -114,-110,-107,-103,-99,-95,-90,-85,-80,-75,
59 -69,-63,-58,-52,-45,-39,-33,-26,-20,-13,-6
63 static uint16_t bitrev(uint16_t j, uint16_t nu)
67 for (; nu > 0; nu--) {
68 k = (k << 1) + (j & 1);
76 static int16_t sinI(uint16_t angleMilli)
79 pos = (uint16_t) ((SIN_TAB_LEN * (uint32_t) angleMilli) / 1000);
80 return SIN_TAB[pos % SIN_TAB_LEN];
83 static int16_t cosI(uint16_t angleMilli)
85 return sinI(angleMilli + 250);
88 static uint16_t ilog2(uint16_t val)
115 ifft(int16_t xre[], int16_t xim[], uint16_t n)
121 int32_t c, s, tr, ti;
127 for (i = 0; i < n; i++)
130 for (l = 1; l <= nu; l++) {
131 for (k = 0; k < n; k += n2) {
132 for (i = 1; i <= n2; i++) {
133 p = bitrev(k >> nu1, nu);
134 c = cosI((1000 * p) / n);
135 s = sinI((1000 * p) / n);
137 tr = ((xre[k + n2] * c + xim[k + n2] * s) >> RESOLUTION);
138 ti = ((xim[k + n2] * c - xre[k + n2] * s) >> RESOLUTION);
140 xre[k + n2] = xre[k] - tr;
141 xim[k + n2] = xim[k] - ti;
151 for (k = 0; k < n; k++) {
166 for (i = 0, n2 = n / 2; i < n2; i++) {
167 xre[i] = (ABS(xre[i]) + ABS(xim[i]));