Deluge Firmware 1.3.0
Build date: 2025.04.16
Loading...
Searching...
No Matches
math_lut.h
1
2#pragma once
3
4#include "engine.h"
5
6// Use twice as much RAM for the LUT but avoid a little computation
7#define SIN_DELTA
8
9void dx_init_lut_data();
10
11class Exp2 {
12public:
13 // Q24 in, Q24 out
14 static int32_t lookup(int32_t x);
15};
16
17inline int32_t Exp2::lookup(int32_t x) {
18 const int SHIFT = 24 - EXP2_LG_N_SAMPLES;
19 int lowbits = x & ((1 << SHIFT) - 1);
20 int x_int = (x >> (SHIFT - 1)) & ((EXP2_N_SAMPLES - 1) << 1);
21 int dy = dxEngine->exp2tab[x_int];
22 int y0 = dxEngine->exp2tab[x_int + 1];
23
24 int y = y0 + (((int64_t)dy * (int64_t)lowbits) >> SHIFT);
25 return y >> (6 - (x >> 24));
26}
27
28class Tanh {
29public:
30 // Q24 in, Q24 out
31 static int32_t lookup(int32_t x);
32};
33
34inline int32_t Tanh::lookup(int32_t x) {
35 int32_t signum = x >> 31;
36 x ^= signum;
37 if (x >= (4 << 24)) {
38 if (x >= (17 << 23)) {
39 return signum ^ (1 << 24);
40 }
41 int32_t sx = ((int64_t)-48408812 * (int64_t)x) >> 24;
42 return signum ^ ((1 << 24) - 2 * Exp2::lookup(sx));
43 }
44 else {
45 const int SHIFT = 26 - TANH_LG_N_SAMPLES;
46 int lowbits = x & ((1 << SHIFT) - 1);
47 int x_int = (x >> (SHIFT - 1)) & ((TANH_N_SAMPLES - 1) << 1);
48 int dy = dxEngine->tanhtab[x_int];
49 int y0 = dxEngine->tanhtab[x_int + 1];
50 int y = y0 + (((int64_t)dy * (int64_t)lowbits) >> SHIFT);
51 return y ^ signum;
52 }
53}
54
55class Sin {
56public:
57 static int32_t lookup(int32_t phase);
58};
59
60inline int32_t Sin::lookup(int32_t phase) {
61 const int SHIFT = 24 - SIN_LG_N_SAMPLES;
62 int lowbits = phase & ((1 << SHIFT) - 1);
63#ifdef SIN_DELTA
64 int phase_int = (phase >> (SHIFT - 1)) & ((SIN_N_SAMPLES - 1) << 1);
65 int dy = dxEngine->sintab[phase_int];
66 int y0 = dxEngine->sintab[phase_int + 1];
67
68 return y0 + (((int64_t)dy * (int64_t)lowbits) >> SHIFT);
69#else
70 int phase_int = (phase >> SHIFT) & (SIN_N_SAMPLES - 1);
71 int y0 = dxEngine->sintab[phase_int];
72 int y1 = dxEngine->sintab[phase_int + 1];
73
74 return y0 + (((int64_t)(y1 - y0) * (int64_t)lowbits) >> SHIFT);
75#endif
76}
77
78class Freqlut {
79public:
80 static int32_t lookup(int32_t logfreq);
81};
Definition math_lut.h:11
Definition math_lut.h:78
Definition math_lut.h:55
Definition math_lut.h:28