123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
-
- #include "sbr.h"
- #include "assembly.h"
- #define Q28_2 0x20000000
- #define Q28_15 0x30000000
- #define NUM_ITER_IRN 5
- int InvRNormalized(int r)
- {
- int i, xn, t;
-
- xn = Q28_15;
-
- for (i = NUM_ITER_IRN; i != 0; i--) {
- t = MULSHIFT32(r, xn);
- t = Q28_2 - t;
- xn = MULSHIFT32(xn, t) << 4;
- }
- return xn;
- }
- #define NUM_TERMS_RPI 5
- #define LOG2_EXP_INV 0x58b90bfc
- static const int invTab[NUM_TERMS_RPI] PROGMEM = {0x40000000, 0x20000000, 0x15555555, 0x10000000, 0x0ccccccd};
- int RatioPowInv(int a, int b, int c)
- {
- int lna, lnb, i, p, t, y;
- if (a < 1 || b < 1 || c < 1 || a > 64 || b > 64 || c > 64 || a < b)
- return 0;
- lna = MULSHIFT32(log2Tab[a], LOG2_EXP_INV) << 1;
- lnb = MULSHIFT32(log2Tab[b], LOG2_EXP_INV) << 1;
- p = (lna - lnb) / c;
-
- y = (1 << 24);
- t = p >> 4;
- y += t;
- for (i = 2; i <= NUM_TERMS_RPI; i++) {
- t = MULSHIFT32(invTab[i-1], t) << 2;
- t = MULSHIFT32(p, t) << 4;
- y += t;
- }
- return y;
- }
- int SqrtFix(int q, int fBitsIn, int *fBitsOut)
- {
- int z, lo, hi, mid;
- if (q <= 0) {
- *fBitsOut = fBitsIn;
- return 0;
- }
-
- z = fBitsIn & 0x01;
- q >>= z;
- fBitsIn -= z;
-
- z = (CLZ(q) - 1);
- z >>= 1;
- q <<= (2*z);
-
- lo = 1;
- if (q >= 0x10000000)
- lo = 16384;
- hi = 46340;
-
- do {
- mid = (lo + hi) >> 1;
- if (mid*mid > q)
- hi = mid - 1;
- else
- lo = mid + 1;
- } while (hi >= lo);
- lo--;
- *fBitsOut = ((fBitsIn + 2*z) >> 1);
- return lo;
- }
|