GY-63_MS5611/libraries/FastTrig/examples/fastTrig_optimize/fastTrig_optimize.ino
2021-01-29 12:31:58 +01:00

129 lines
2.6 KiB
C++

//
// FILE: fastTrig_optimize.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.2
// PURPOSE: sketch to optimize the table for interpolation
// DATE: 2020-09-06
// WARNING TAKES A LOT OF TIME ON 16 MHz
// TODO make a python script for this ?
#include "FastTrig.h"
float getError(int i)
{
float error = 0;
for (float f = i - 1; f < i + 1; f += 0.0001) // get error due to interpolation around point i .
{
error += abs(sin(f / 180 * PI) - isin(f)); // sum up the error (all errors are traded equal
}
return error;
}
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println();
// print the table
for (int i = 0; i <= 90; i++)
{
Serial.print(isinTable16[i]);
Serial.print(", ");
if (i % 10 == 0) Serial.println();
}
Serial.println();
Serial.println();
test_isin_error_1(false);
Serial.println();
while(optimize()); // prints a new table as long as it is better.
Serial.println("\n\ndone...");
}
int optimize()
{
int rv = 0;
for (int i = 1; i < 90; i++) // for every angle
{
int t = isinTable16[i];
int idx = 0;
float minError = getError(i); // what is the current error
bool flag = false;
for (int j = -2; j <= 2; j++) // try if adjacent numbers in table give less error.
{
if (j == 0) continue;
isinTable16[i] = t + j;
float e = getError(i);
if (e < minError) // if less than we can update the table.
{
idx = j;
minError = e;
rv++;
flag = true;
}
}
// if (flag) Serial.print('*'); // uncomment this as you want to spot the changes.
isinTable16[i] = t + idx;
Serial.print(isinTable16[i]);
Serial.print(", ");
if (i % 10 == 0) Serial.println();
}
Serial.println();
Serial.println();
test_isin_error_1(false);
return rv;
}
void test_isin_error_1(bool show)
{
Serial.println(__FUNCTION__);
Serial.println("ISIN 0-3600 calls: \t");
Serial.flush();
float mx = 0;
float z = 0;
for (int i = 0; i < 3600; i++)
{
float a = sin(i * 0.1 * PI / 180);
float b = isin(i * 0.1);
float y = abs(a - b);
z += y;
if (mx < y)
{
mx = y;
if (show)
{
Serial.print(i);
Serial.print("\t");
Serial.print(a, 6);
Serial.print("\t");
Serial.print(b, 6);
Serial.print("\t");
Serial.println(a - b, 6);
}
}
}
Serial.print("max error: ");
Serial.println(mx, 8);
Serial.print("avg error: ");
Serial.println(z / 3600, 8);
Serial.println();
Serial.flush();
}
void loop()
{
}
// -- END OF FILE --