esp32-sk6812/include/fasttrigon.h
Thomas Kolb 25abc446b0 Increased sin LUT precision: 16-bit x 2048 entries
This massively improves glitches in functions like sin(t + sin(t)), as
used in the RgbwPsychedelicAnimation. That animation is now almost
flicker-free.
2021-08-23 23:57:19 +02:00

40 lines
993 B
C++

/*!
* \file
*
* This file contains function prototypes for very fast lookup-table based
* trigonometric functions.
*
* The functions take an argument that is dependent on the lookup-table size
* (LUT_SIZE). LUT_SIZE corresponds to 2π. Values outside the range
* [0..LUT_SIZE] are supported and interpreted normally, so just replace 2π
* with LUT_SIZE and you're done.
*/
#pragma once
#include <cstdint>
#define FASTTRIGON_8BIT(x) ((x) >> (fasttrigon::PRECISION_BITS - 8))
namespace fasttrigon {
static const uint32_t LUT_SIZE = 2048;
static const uint32_t PRECISION_BITS = 11;
static const int32_t SCALE = 1023;
static const uint32_t UNIT_SHIFT = PRECISION_BITS-1;
/*!
* \returns 127 * sin(2π * arg / LUT_SIZE)
*/
int32_t fastsin(int32_t arg);
/*!
* \returns 127 * cos(2π * arg / LUT_SIZE)
*/
int32_t fastcos(int32_t arg);
/*!
* \returns 127 * tan(2π * arg / LUT_SIZE)
*/
int32_t fasttan(int32_t arg);
}