| control *= octavemult; // octavemult range: 0 to 28671 (12 frac bits) | control *= octavemult; // octavemult range: 0 to 28671 (12 frac bits) | ||||
| n = control & 0x7FFFFFF; // 27 fractional control bits | n = control & 0x7FFFFFF; // 27 fractional control bits | ||||
| #ifdef IMPROVE_EXPONENTIAL_ACCURACY | #ifdef IMPROVE_EXPONENTIAL_ACCURACY | ||||
| // exp2 polynomial suggested by Stefan Stenzel on "music-dsp" | |||||
| // mail list, Wed, 3 Sep 2014 10:08:55 +0200 | |||||
| int32_t x = n << 3; | int32_t x = n << 3; | ||||
| n = multiply_accumulate_32x32_rshift32_rounded(536870912, x, 1494202713); | n = multiply_accumulate_32x32_rshift32_rounded(536870912, x, 1494202713); | ||||
| int32_t sq = multiply_32x32_rshift32_rounded(x, x); | int32_t sq = multiply_32x32_rshift32_rounded(x, x); | ||||
| multiply_32x32_rshift32_rounded(x, 1358044250)) << 1); | multiply_32x32_rshift32_rounded(x, 1358044250)) << 1); | ||||
| n = n << 1; | n = n << 1; | ||||
| #else | #else | ||||
| // exp2 algorithm by Laurent de Soras | |||||
| // http://www.musicdsp.org/showone.php?id=106 | |||||
| n = (n + 134217728) << 3; | n = (n + 134217728) << 3; | ||||
| n = multiply_32x32_rshift32_rounded(n, n); | n = multiply_32x32_rshift32_rounded(n, n); | ||||
| n = multiply_32x32_rshift32_rounded(n, 715827883) << 3; | n = multiply_32x32_rshift32_rounded(n, 715827883) << 3; | ||||
| // high frequencies, but the filter's corner frequency response | // high frequencies, but the filter's corner frequency response | ||||
| // can end up about 6% higher than requested. | // can end up about 6% higher than requested. | ||||
| #ifdef IMPROVE_HIGH_FREQUENCY_ACCURACY | #ifdef IMPROVE_HIGH_FREQUENCY_ACCURACY | ||||
| // From "Fast Polynomial Approximations to Sine and Cosine" | |||||
| // Charles K Garrett, http://krisgarrett.net/ | |||||
| fmult = (multiply_32x32_rshift32_rounded(fmult, 2145892402) + | fmult = (multiply_32x32_rshift32_rounded(fmult, 2145892402) + | ||||
| multiply_32x32_rshift32_rounded( | multiply_32x32_rshift32_rounded( | ||||
| multiply_32x32_rshift32_rounded(fmult, fmult), | multiply_32x32_rshift32_rounded(fmult, fmult), |