From b9541b9eab0f4892ebb82450f25fa3249b8ea397 Mon Sep 17 00:00:00 2001
From: Brick <[EMAIL REDACTED]>
Date: Sat, 19 Aug 2023 20:12:40 +0100
Subject: [PATCH] Improved ResampleAudio * filterindex2 was off-by-one *
Generate ResamplerFilter using doubles * Transpose ResamplerFilter to improve
access patterns
---
build-scripts/gen_audio_resampler_filter.c | 55 +-
src/audio/SDL_audio_resampler_filter.h | 2057 ++++++++++----------
src/audio/SDL_audiocvt.c | 12 +-
test/testautomation_audio.c | 7 +-
4 files changed, 1065 insertions(+), 1066 deletions(-)
diff --git a/build-scripts/gen_audio_resampler_filter.c b/build-scripts/gen_audio_resampler_filter.c
index fe4e5388ca3f..3aab606ddcc6 100644
--- a/build-scripts/gen_audio_resampler_filter.c
+++ b/build-scripts/gen_audio_resampler_filter.c
@@ -41,23 +41,27 @@ gcc -o genfilter build-scripts/gen_audio_resampler_filter.c -lm && ./genfilter >
#include <stdio.h>
#include <math.h>
+#ifndef M_PI
+ #define M_PI 3.14159265358979323846
+#endif
+
#define RESAMPLER_ZERO_CROSSINGS 5
#define RESAMPLER_BITS_PER_SAMPLE 16
#define RESAMPLER_SAMPLES_PER_ZERO_CROSSING (1 << ((RESAMPLER_BITS_PER_SAMPLE / 2) + 1))
-#define RESAMPLER_FILTER_SIZE ((RESAMPLER_SAMPLES_PER_ZERO_CROSSING * RESAMPLER_ZERO_CROSSINGS) + 1)
+#define RESAMPLER_FILTER_SIZE (RESAMPLER_SAMPLES_PER_ZERO_CROSSING * RESAMPLER_ZERO_CROSSINGS)
/* This is a "modified" bessel function, so you can't use POSIX j0() */
static double
bessel(const double x)
{
const double xdiv2 = x / 2.0;
- double i0 = 1.0f;
- double f = 1.0f;
+ double i0 = 1.0;
+ double f = 1.0;
int i = 1;
while (1) {
const double diff = pow(xdiv2, i * 2) / pow(f, 2);
- if (diff < 1.0e-21f) {
+ if (diff < 1.0e-21) {
break;
}
i0 += diff;
@@ -70,30 +74,25 @@ bessel(const double x)
/* build kaiser table with cardinal sine applied to it, and array of differences between elements. */
static void
-kaiser_and_sinc(float *table, float *diffs, const int tablelen, const double beta)
+kaiser_and_sinc(double *table, double *diffs, const int tablelen, const double beta)
{
- const int lenm1 = tablelen - 1;
- const int lenm1div2 = lenm1 / 2;
const double bessel_beta = bessel(beta);
int i;
- table[0] = 1.0f;
- for (i = 1; i < tablelen; i++) {
- const double kaiser = bessel(beta * sqrt(1.0 - pow(((i - lenm1) / 2.0) / lenm1div2, 2.0))) / bessel_beta;
- table[tablelen - i] = (float) kaiser;
- }
+ table[0] = 1.0;
+ diffs[tablelen - 1] = 0.0;
for (i = 1; i < tablelen; i++) {
- const float x = (((float) i) / ((float) RESAMPLER_SAMPLES_PER_ZERO_CROSSING)) * ((float) M_PI);
- table[i] *= sinf(x) / x;
+ const double kaiser = bessel(beta * sqrt(1.0 - pow((double)i / (double)(tablelen - 1), 2.0))) / bessel_beta;
+ const double x = (((double) i) / ((double) RESAMPLER_SAMPLES_PER_ZERO_CROSSING)) * M_PI;
+ table[i] = kaiser * (sin(x) / x);
diffs[i - 1] = table[i] - table[i - 1];
}
- diffs[lenm1] = 0.0f;
}
-static float ResamplerFilter[RESAMPLER_FILTER_SIZE];
-static float ResamplerFilterDifference[RESAMPLER_FILTER_SIZE];
+static double ResamplerFilter[RESAMPLER_FILTER_SIZE + 1];
+static double ResamplerFilterDifference[RESAMPLER_FILTER_SIZE + 1];
static void
PrepareResampleFilter(void)
@@ -101,12 +100,12 @@ PrepareResampleFilter(void)
/* if dB > 50, beta=(0.1102 * (dB - 8.7)), according to Matlab. */
const double dB = 80.0;
const double beta = 0.1102 * (dB - 8.7);
- kaiser_and_sinc(ResamplerFilter, ResamplerFilterDifference, RESAMPLER_FILTER_SIZE, beta);
+ kaiser_and_sinc(ResamplerFilter, ResamplerFilterDifference, RESAMPLER_FILTER_SIZE + 1, beta);
}
int main(void)
{
- int i;
+ int i, j;
PrepareResampleFilter();
@@ -137,21 +136,21 @@ int main(void)
"#define RESAMPLER_ZERO_CROSSINGS %d\n"
"#define RESAMPLER_BITS_PER_SAMPLE %d\n"
"#define RESAMPLER_SAMPLES_PER_ZERO_CROSSING (1 << ((RESAMPLER_BITS_PER_SAMPLE / 2) + 1))\n"
- "#define RESAMPLER_FILTER_SIZE ((RESAMPLER_SAMPLES_PER_ZERO_CROSSING * RESAMPLER_ZERO_CROSSINGS) + 1)\n"
+ "#define RESAMPLER_FILTER_SIZE (RESAMPLER_SAMPLES_PER_ZERO_CROSSING * RESAMPLER_ZERO_CROSSINGS)\n"
"\n", RESAMPLER_ZERO_CROSSINGS, RESAMPLER_BITS_PER_SAMPLE
);
- printf("static const float ResamplerFilter[RESAMPLER_FILTER_SIZE] = {\n");
- printf(" %.9ff", ResamplerFilter[0]);
- for (i = 0; i < RESAMPLER_FILTER_SIZE-1; i++) {
- printf("%s%.9ff", ((i % 5) == 4) ? ",\n " : ", ", ResamplerFilter[i+1]);
+ printf("static const float ResamplerFilter[RESAMPLER_FILTER_SIZE] = {");
+ for (i = 0; i < RESAMPLER_FILTER_SIZE; i++) {
+ j = (i % RESAMPLER_ZERO_CROSSINGS) * RESAMPLER_SAMPLES_PER_ZERO_CROSSING + (i / RESAMPLER_ZERO_CROSSINGS);
+ printf("%s%12.9ff,", (i % RESAMPLER_ZERO_CROSSINGS) ? "" : "\n ", ResamplerFilter[j]);
}
printf("\n};\n\n");
- printf("static const float ResamplerFilterDifference[RESAMPLER_FILTER_SIZE] = {\n");
- printf(" %.9ff", ResamplerFilterDifference[0]);
- for (i = 0; i < RESAMPLER_FILTER_SIZE-1; i++) {
- printf("%s%.9ff", ((i % 5) == 4) ? ",\n " : ", ", ResamplerFilterDifference[i+1]);
+ printf("static const float ResamplerFilterDifference[RESAMPLER_FILTER_SIZE] = {");
+ for (i = 0; i < RESAMPLER_FILTER_SIZE; i++) {
+ j = (i % RESAMPLER_ZERO_CROSSINGS) * RESAMPLER_SAMPLES_PER_ZERO_CROSSING + (i / RESAMPLER_ZERO_CROSSINGS);
+ printf("%s%12.9ff,", (i % RESAMPLER_ZERO_CROSSINGS) ? "" : "\n ", ResamplerFilterDifference[j]);
}
printf("\n};\n\n");
diff --git a/src/audio/SDL_audio_resampler_filter.h b/src/audio/SDL_audio_resampler_filter.h
index 8e6c8871bf34..94e98e346102 100644
--- a/src/audio/SDL_audio_resampler_filter.h
+++ b/src/audio/SDL_audio_resampler_filter.h
@@ -21,1039 +21,1038 @@
/* DO NOT EDIT, THIS FILE WAS GENERATED BY build-scripts/gen_audio_resampler_filter.c */
-#define RESAMPLER_ZERO_CROSSINGS 5
-#define RESAMPLER_BITS_PER_SAMPLE 16
+#define RESAMPLER_ZERO_CROSSINGS 5
+#define RESAMPLER_BITS_PER_SAMPLE 16
#define RESAMPLER_SAMPLES_PER_ZERO_CROSSING (1 << ((RESAMPLER_BITS_PER_SAMPLE / 2) + 1))
-#define RESAMPLER_FILTER_SIZE ((RESAMPLER_SAMPLES_PER_ZERO_CROSSING * RESAMPLER_ZERO_CROSSINGS) + 1)
+#define RESAMPLER_FILTER_SIZE (RESAMPLER_SAMPLES_PER_ZERO_CROSSING * RESAMPLER_ZERO_CROSSINGS)
static const float ResamplerFilter[RESAMPLER_FILTER_SIZE] = {
- 1.000000000f, 0.999993682f, 0.999974370f, 0.999941289f, 0.999894559f,
- 0.999834180f, 0.999760151f, 0.999672413f, 0.999571025f, 0.999455988f,
- 0.999327302f, 0.999184966f, 0.999028981f, 0.998859286f, 0.998676121f,
- 0.998479128f, 0.998268604f, 0.998044431f, 0.997806668f, 0.997555375f,
- 0.997290313f, 0.997011721f, 0.996719599f, 0.996413827f, 0.996094406f,
- 0.995761573f, 0.995415151f, 0.995055199f, 0.994681656f, 0.994294584f,
- 0.993894041f, 0.993480027f, 0.993052363f, 0.992611289f, 0.992156804f,
- 0.991688788f, 0.991207361f, 0.990712583f, 0.990204275f, 0.989682615f,
- 0.989147604f, 0.988599122f, 0.988037288f, 0.987462223f, 0.986873686f,
- 0.986271918f, 0.985656738f, 0.985028386f, 0.984386861f, 0.983731806f,
- 0.983063757f, 0.982382476f, 0.981687963f, 0.980980217f, 0.980259418f,
- 0.979525447f, 0.978778243f, 0.978018105f, 0.977244914f, 0.976458490f,
- 0.975659251f, 0.974846840f, 0.974021494f, 0.973183155f, 0.972331941f,
- 0.971467674f, 0.970590651f, 0.969700634f, 0.968797863f, 0.967882276f,
- 0.966953754f, 0.966012537f, 0.965058565f, 0.964091897f, 0.963112533f,
- 0.962120414f, 0.961115718f, 0.960098326f, 0.959068418f, 0.958025992f,
- 0.956970990f, 0.955903471f, 0.954823375f, 0.953730941f, 0.952626109f,
- 0.951508820f, 0.950379193f, 0.949237227f, 0.948082924f, 0.946916521f,
- 0.945737660f, 0.944546640f, 0.943343520f, 0.942128360f, 0.940900803f,
- 0.939661384f, 0.938409984f, 0.937146366f, 0.935870886f, 0.934583426f,
- 0.933284163f, 0.931972861f, 0.930649877f, 0.929314911f, 0.927968264f,
- 0.926609993f, 0.925239921f, 0.923858225f, 0.922464967f, 0.921060085f,
- 0.919643581f, 0.918215632f, 0.916776240f, 0.915325403f, 0.913863063f,
- 0.912389517f, 0.910904646f, 0.909408391f, 0.907901049f, 0.906382322f,
- 0.904852629f, 0.903311789f, 0.901759744f, 0.900196850f, 0.898622811f,
- 0.897037864f, 0.895442069f, 0.893835366f, 0.892217875f, 0.890589595f,
- 0.888950586f, 0.887300909f, 0.885640502f, 0.883969545f, 0.882288039f,
- 0.880595982f, 0.878893554f, 0.877180517f, 0.875457227f, 0.873723626f,
- 0.871979713f, 0.870225549f, 0.868461132f, 0.866686642f, 0.864902079f,
- 0.863107383f, 0.861302733f, 0.859488070f, 0.857663572f, 0.855829120f,
- 0.853984952f, 0.852130949f, 0.850267172f, 0.848393857f, 0.846510828f,
- 0.844618261f, 0.842716157f, 0.840804636f, 0.838883698f, 0.836953342f,
- 0.835013688f, 0.833064795f, 0.831106603f, 0.829139292f, 0.827162862f,
- 0.825177312f, 0.823182821f, 0.821179330f, 0.819167018f, 0.817145705f,
- 0.815115690f, 0.813076973f, 0.811029494f, 0.808973312f, 0.806908667f,
- 0.804835379f, 0.802753687f, 0.800663531f, 0.798565030f, 0.796458125f,
- 0.794343054f, 0.792219698f, 0.790088236f, 0.787948668f, 0.785801113f,
- 0.783645451f, 0.781481922f, 0.779310465f, 0.777131259f, 0.774944246f,
- 0.772749543f, 0.770547271f, 0.768337309f, 0.766119778f, 0.763894856f,
- 0.761662483f, 0.759422719f, 0.757175624f, 0.754921377f, 0.752659857f,
- 0.750391185f, 0.748115480f, 0.745832801f, 0.743543088f, 0.741246462f,
- 0.738943100f, 0.736632884f, 0.734315932f, 0.731992364f, 0.729662120f,
- 0.727325320f, 0.724982083f, 0.722632408f, 0.720276356f, 0.717914045f,
- 0.715545416f, 0.713170588f, 0.710789680f, 0.708402693f, 0.706009746f,
- 0.703610778f, 0.701205969f, 0.698795319f, 0.696378946f, 0.693956852f,
- 0.691529095f, 0.689095736f, 0.686656833f, 0.684212506f, 0.681762815f,
- 0.679307759f, 0.676847458f, 0.674381971f, 0.671911240f, 0.669435501f,
- 0.666954637f, 0.664468944f, 0.661978245f, 0.659482718f, 0.656982541f,
- 0.654477477f, 0.651967824f, 0.649453580f, 0.646934807f, 0.644411504f,
- 0.641883910f, 0.639351964f, 0.636815608f, 0.634275198f, 0.631730616f,
- 0.629181862f, 0.626629114f, 0.624072373f, 0.621511757f, 0.618947387f,
- 0.616379082f, 0.613807201f, 0.611231565f, 0.608652413f, 0.606069744f,
- 0.603483617f, 0.600894034f, 0.598301172f, 0.595705032f, 0.593105674f,
- 0.590503156f, 0.587897599f, 0.585289061f, 0.582677484f, 0.580063045f,
- 0.577445805f, 0.574825764f, 0.572203040f, 0.569577694f, 0.566949785f,
- 0.564319372f, 0.561686456f, 0.559051216f, 0.556413651f, 0.553773820f,
- 0.551131785f, 0.548487663f, 0.545841396f, 0.543193221f, 0.540543079f,
- 0.537890971f, 0.535237134f, 0.532581568f, 0.529924273f, 0.527265370f,
- 0.524604917f, 0.521942914f, 0.519279540f, 0.516614795f, 0.513948679f,
- 0.511281490f, 0.508612931f, 0.505943298f, 0.503272593f, 0.500600994f,
- 0.497928351f, 0.495254934f, 0.492580622f, 0.489905566f, 0.487229884f,
- 0.484553576f, 0.481876701f, 0.479199320f, 0.476521552f, 0.473843396f,
- 0.471164882f, 0.468486160f, 0.465807229f, 0.463128209f, 0.460449100f,
- 0.457770079f, 0.455091029f, 0.452412128f, 0.449733406f, 0.447054923f,
- 0.444376737f, 0.441698909f, 0.439021617f, 0.436344713f, 0.433668375f,
- 0.430992693f, 0.428317666f, 0.425643355f, 0.422969848f, 0.420297176f,
- 0.417625397f, 0.414954633f, 0.412284881f, 0.409616232f, 0.406948745f,
- 0.404282451f, 0.401617438f, 0.398953736f, 0.396291435f, 0.393630594f,
- 0.390971363f, 0.388313591f, 0.385657459f, 0.383003026f, 0.380350292f,
- 0.377699375f, 0.375050306f, 0.372403204f, 0.369758040f, 0.367114902f,
- 0.364473879f, 0.361834973f, 0.359198302f, 0.356563985f, 0.353931844f,
- 0.351302117f, 0.348674864f, 0.346050024f, 0.343427807f, 0.340808123f,
- 0.338191152f, 0.335576862f, 0.332965344f, 0.330356658f, 0.327750862f,
- 0.325147986f, 0.322548091f, 0.319951355f, 0.317357630f, 0.314767033f,
- 0.312179655f, 0.309595555f, 0.307014734f, 0.304437339f, 0.301863313f,
- 0.299292803f, 0.296725839f, 0.294162393f, 0.291602641f, 0.289046586f,
- 0.286494225f, 0.283945769f, 0.281401068f, 0.278860301f, 0.276323408f,
- 0.273790598f, 0.271261781f, 0.268737078f, 0.266216546f, 0.263700217f,
- 0.261188149f, 0.258680373f, 0.256176978f, 0.253677934f, 0.251183391f,
- 0.248693451f, 0.246207923f, 0.243727028f, 0.241250798f, 0.238779247f,
- 0.236312449f, 0.233850464f, 0.231393293f, 0.228941023f, 0.226493701f,
- 0.224051371f, 0.221614078f, 0.219181836f, 0.216754735f, 0.214332923f,
- 0.211916193f, 0.209504753f, 0.207098618f, 0.204697832f, 0.202302471f,
- 0.199912533f, 0.197528124f, 0.195149198f, 0.192775860f, 0.190408155f,
- 0.188046113f, 0.185689807f, 0.183339253f, 0.180994540f, 0.178655609f,
- 0.176322535f, 0.173995405f, 0.171674222f, 0.169359058f, 0.167049929f,
- 0.164746925f, 0.162450001f, 0.160159275f, 0.157874763f, 0.155596510f,
- 0.153324530f, 0.151058972f, 0.148799688f, 0.146546826f, 0.144300416f,
- 0.142060474f, 0.139827073f, 0.137600228f, 0.135380000f, 0.133166388f,
- 0.130959451f, 0.128759250f, 0.126565769f, 0.124379098f, 0.122199245f,
- 0.120026320f, 0.117860198f, 0.115701027f, 0.113548823f, 0.111403592f,
- 0.109265402f, 0.107134290f, 0.105010264f, 0.102893390f, 0.100783676f,
- 0.098681159f, 0.096585885f, 0.094497882f, 0.092417173f, 0.090343870f,
- 0.088277847f, 0.086219221f, 0.084168032f, 0.082124293f, 0.080088042f,
- 0.078059308f, 0.076038122f, 0.074024513f, 0.072018512f, 0.070020139f,
- 0.068029441f, 0.066046432f, 0.064071149f, 0.062103685f, 0.060143925f,
- 0.058191977f, 0.056247860f, 0.054311592f, 0.052383222f, 0.050462760f,
- 0.048550237f, 0.046645675f, 0.044749107f, 0.042860553f, 0.040980037f,
- 0.039107583f, 0.037243221f, 0.035387039f, 0.033538923f, 0.031698968f,
- 0.029867193f, 0.028043624f, 0.026228283f, 0.024421191f, 0.022622371f,
- 0.020831848f, 0.019049639f, 0.017275762f, 0.015510243f, 0.013753103f,
- 0.012004361f, 0.010264101f, 0.008532210f, 0.006808777f, 0.005093819f,
- 0.003387353f, 0.001689399f, -0.000000024f, -0.001680900f, -0.003353210f,
- -0.005016938f, -0.006672067f, -0.008318579f, -0.009956459f, -0.011585629f,
- -0.013206195f, -0.014818084f, -0.016421281f, -0.018015765f, -0.019601526f,
- -0.021178551f, -0.022746822f, -0.024306327f, -0.025857056f, -0.027398987f,
- -0.028932119f, -0.030456433f, -0.031971917f, -0.033478502f, -0.034976289f,
- -0.036465216f, -0.037945267f, -0.039416436f, -0.040878706f, -0.042332072f,
- -0.043776520f, -0.045212042f, -0.046638630f, -0.048056271f, -0.049464963f,
- -0.050864697f, -0.052255459f, -0.053637192f, -0.055009995f, -0.056373812f,
- -0.057728622f, -0.059074435f, -0.060411237f, -0.061739020f, -0.063057788f,
- -0.064367518f, -0.065668218f, -0.066959888f, -0.068242513f, -0.069516085f,
- -0.070780613f, -0.072036028f, -0.073282443f, -0.074519798f, -0.075748093f,
- -0.076967306f, -0.078177467f, -0.079378553f, -0.080570564f, -0.081753515f,
- -0.082927369f, -0.084092163f, -0.085247882f, -0.086394526f, -0.087532081f,
- -0.088660523f, -0.089779936f, -0.090890266f, -0.091991536f, -0.093083732f,
- -0.094166860f, -0.095240898f, -0.096305899f, -0.097361818f, -0.098408684f,
- -0.099446490f, -0.100475237f, -0.101494931f, -0.102505587f, -0.103507154f,
- -0.104499720f, -0.105483264f, -0.106457770f, -0.107423261f, -0.108379729f,
- -0.109327182f, -0.110265635f, -0.111195073f, -0.112115517f, -0.113026999f,
- -0.113929473f, -0.114823014f, -0.115707509f, -0.116583094f, -0.117449738f,
- -0.118307441f, -0.119156219f, -0.119996056f, -0.120826989f, -0.121649019f,
- -0.122462146f, -0.123266406f, -0.124061778f, -0.124848284f, -0.125625938f,
- -0.126394749f, -0.127154693f, -0.127905846f, -0.128648207f, -0.129381746f,
- -0.130106509f, -0.130822510f, -0.131529734f, -0.132228225f, -0.132917970f,
- -0.133599013f, -0.134271339f, -0.134934962f, -0.135589913f, -0.136236191f,
- -0.136873797f, -0.137502789f, -0.138123170f, -0.138734937f, -0.139338136f,
- -0.139932722f, -0.140518770f, -0.141096294f, -0.141665265f, -0.142225727f,
- -0.142777696f, -0.143321201f, -0.143856242f, -0.144382849f, -0.144900993f,
- -0.145410761f, -0.145912141f, -0.146405146f, -0.146889821f, -0.147366136f,
- -0.147834152f, -0.148293883f, -0.148745313f, -0.149188504f, -0.149623469f,
- -0.150050193f, -0.150468737f, -0.150879115f, -0.151281342f, -0.151675433f,
- -0.152061403f, -0.152439296f, -0.152809098f, -0.153170869f, -0.153524607f,
- -0.153870359f, -0.154208109f, -0.154537901f, -0.154859766f, -0.155173704f,
- -0.155479759f, -0.155777946f, -0.156068295f, -0.156350806f, -0.156625539f,
- -0.156892478f, -0.157151699f, -0.157403171f, -0.157646939f, -0.157883018f,
- -0.158111468f, -0.158332288f, -0.158545509f, -0.158751160f, -0.158949256f,
- -0.159139827f, -0.159322888f, -0.159498483f, -0.159666643f, -0.159827381f,
- -0.159980699f, -0.160126686f, -0.160265297f, -0.160396621f, -0.160520658f,
- -0.160637438f, -0.160746962f, -0.160849288f, -0.160944447f, -0.161032468f,
- -0.161113337f, -0.161187142f, -0.161253884f, -0.161313564f, -0.161366254f,
- -0.161411941f, -0.161450699f, -0.161482543f, -0.161507472f, -0.161525562f,
- -0.161536828f, -0.161541268f, -0.161538944f, -0.161529869f, -0.161514089f,
- -0.161491618f, -0.161462501f, -0.161426738f, -0.161384419f, -0.161335513f,
- -0.161280081f, -0.161218151f, -0.161149755f, -0.161074907f, -0.160993651f,
- -0.160906032f, -0.160812065f, -0.160711765f, -0.160605207f, -0.160492390f,
- -0.160373345f, -0.160248131f, -0.160116762f, -0.159979254f, -0.159835666f,
- -0.159686014f, -0.159530357f, -0.159368694f, -0.159201056f, -0.159027517f,
- -0.158848062f, -0.158662766f, -0.158471599f, -0.158274680f, -0.158071980f,
- -0.157863557f, -0.157649443f, -0.157429650f, -0.157204241f, -0.156973228f,
- -0.156736642f, -0.156494558f, -0.156246960f, -0.155993909f, -0.155735433f,
- -0.155471563f, -0.155202329f, -0.154927775f, -0.154647917f, -0.154362813f,
- -0.154072478f, -0.153776988f, -0.153476328f, -0.153170541f, -0.152859688f,
- -0.152543753f, -0.152222827f, -0.151896924f, -0.151566073f, -0.151230305f,
- -0.150889665f, -0.150544196f, -0.150193915f, -0.149838865f, -0.149479061f,
- -0.149114594f, -0.148745432f, -0.148371637f, -0.147993281f, -0.147610337f,
- -0.147222877f, -0.146830946f, -0.146434546f, -0.146033719f, -0.145628527f,
- -0.145218968f, -0.144805118f, -0.144386992f, -0.143964618f, -0.143538073f,
- -0.143107325f, -0.142672464f, -0.142233476f, -0.141790435f, -0.141343385f,
- -0.140892327f, -0.140437320f, -0.139978394f, -0.139515579f, -0.139048934f,
- -0.138578460f, -0.138104215f, -0.137626216f, -0.137144551f, -0.136659175f,
- -0.136170194f, -0.135677606f, -0.135181442f, -0.134681761f, -0.134178594f,
- -0.133671984f, -0.133161947f, -0.132648528f, -0.132131740f, -0.131611660f,
- -0.131088302f, -0.130561695f, -0.130031943f, -0.129498973f, -0.128962860f,
- -0.128423676f, -0.127881393f, -0.127336115f, -0.126787826f, -0.126236603f,
- -0.125682443f, -0.125125393f, -0.124565504f, -0.124002807f, -0.123437323f,
- -0.122869089f, -0.122298159f, -0.121724561f, -0.121148311f, -0.120569460f,
- -0.119988061f, -0.119404130f, -0.118817687f, -0.118228793f, -0.117637470f,
- -0.117043748f, -0.116447672f, -0.115849286f, -0.115248613f, -0.114645667f,
- -0.114040568f, -0.113433234f, -0.112823755f, -0.112212166f, -0.111598492f,
- -0.110982776f, -0.110365056f, -0.109745361f, -0.109123722f, -0.108500175f,
- -0.107874751f, -0.107247494f, -0.106618427f, -0.105987601f, -0.105355024f,
- -0.104720749f, -0.104084812f, -0.103447236f, -0.102808066f, -0.102167316f,
- -0.101525046f, -0.100881256f, -0.100236014f, -0.099589340f, -0.098941252f,
- -0.098291807f, -0.097641021f, -0.096988983f, -0.096335620f, -0.095681041f,
- -0.095025249f, -0.094368286f, -0.093710184f, -0.093050972f, -0.092390701f,
- -0.091729380f, -0.091067046f, -0.090403758f, -0.089739501f, -0.089074343f,
- -0.088408306f, -0.087741412f, -0.087073699f, -0.086405218f, -0.085735977f,
- -0.085065998f, -0.084395349f, -0.083724037f, -0.083052084f, -0.082379535f,
- -0.081706434f, -0.081032783f, -0.080358639f, -0.079684012f, -0.079008937f,
- -0.078333504f, -0.077657640f, -0.076981425f, -0.076304883f, -0.075628042f,
- -0.074950956f, -0.074273616f, -0.073596083f, -0.072918370f, -0.072240517f,
- -0.071562558f, -0.070884496f, -0.070206381f, -0.069528244f, -0.068850100f,
- -0.068171993f, -0.067493953f, -0.066815972f, -0.066138126f, -0.065460421f,
- -0.064782880f, -0.064105548f, -0.063428439f, -0.062751584f, -0.062075011f,
- -0.061398748f, -0.060722828f, -0.060047265f, -0.059372153f, -0.058697399f,
- -0.058023106f, -0.057349272f, -0.056675948f, -0.056003150f, -0.055330887f,
- -0.054659221f, -0.053988155f, -0.053317714f, -0.052647941f, -0.051978838f,
- -0.051310450f, -0.050642796f, -0.049975898f, -0.049309790f, -0.048644483f,
- -0.047980014f, -0.047316402f, -0.046653673f, -0.045991853f, -0.045330971f,
- -0.044671040f, -0.044012092f, -0.043354150f, -0.042697236f, -0.042041373f,
- -0.041386627f, -0.040732939f, -0.040080376f, -0.039428953f, -0.038778704f,
- -0.038129643f, -0.037481792f, -0.036835186f, -0.036189832f, -0.035545766f,
- -0.034902997f, -0.034261558f, -0.033621464f, -0.032982741f, -0.032345407f,
- -0.031709481f, -0.031074993f, -0.030441960f, -0.029810399f, -0.029180335f,
- -0.028551787f, -0.027924776f, -0.027299322f, -0.026675448f, -0.026053172f,
- -0.025432510f, -0.024813488f, -0.024196124f, -0.023580479f, -0.022966485f,
- -0.022354206f, -0.021743659f, -0.021134868f, -0.020527845f, -0.019922616f,
- -0.019319192f, -0.018717598f, -0.018117845f, -0.017519956f, -0.016923945f,
- -0.016329836f, -0.015737642f, -0.015147380f, -0.014559067f, -0.013972721f,
- -0.013388360f, -0.012805998f, -0.012225654f, -0.011647343f, -0.011071082f,
- -0.010496887f, -0.009924773f, -0.009354758f, -0.008786854f, -0.008221081f,
- -0.007657450f, -0.007096022f, -0.006536725f, -0.005979617f, -0.005424712f,
- -0.004872025f, -0.004321571f, -0.003773364f, -0.003227417f, -0.002683746f,
- -0.002142363f, -0.001603282f, -0.001066516f, -0.000532080f, 0.000000015f,
- 0.000529755f, 0.001057127f, 0.001582118f, 0.002104717f, 0.002624909f,
- 0.003142685f, 0.003658031f, 0.004170935f, 0.004681387f, 0.005189373f,
- 0.005694883f, 0.006197905f, 0.006698429f, 0.007196404f, 0.007691898f,
- 0.008184860f, 0.008675281f, 0.009163151f, 0.009648458f, 0.010131192f,
- 0.010611345f, 0.011088905f, 0.011563865f, 0.012036213f, 0.012505942f,
- 0.012973041f, 0.013437501f, 0.013899315f, 0.014358475f, 0.014814967f,
- 0.015268789f, 0.015719930f, 0.016168380f, 0.016614137f, 0.017057184f,
- 0.017497523f, 0.017935142f, 0.018370032f, 0.018802188f, 0.019231608f,
- 0.019658273f, 0.020082152f, 0.020503307f, 0.020921690f, 0.021337299f,
- 0.021750130f, 0.022160176f, 0.022567427f, 0.022971880f, 0.023373535f,
- 0.023772376f, 0.024168408f, 0.024561619f, 0.024952007f, 0.025339566f,
- 0.025724288f, 0.026106175f, 0.026485221f, 0.026861422f, 0.027234772f,
- 0.027605265f, 0.027972901f, 0.028337676f, 0.028699588f, 0.029058624f,
- 0.029414795f, 0.029768089f, 0.030118505f, 0.030466037f, 0.030810660f,
- 0.031152423f, 0.031491302f, 0.031827286f, 0.032160383f, 0.032490581f,
- 0.032817882f, 0.033142287f, 0.033463787f, 0.033782389f, 0.034098089f,
- 0.034410883f, 0.034720775f, 0.035027757f, 0.035331838f, 0.035633009f,
- 0.035931274f, 0.036226626f, 0.036519073f, 0.036808614f, 0.037095241f,
- 0.037378959f, 0.037659772f, 0.037937686f, 0.038212679f, 0.038484775f,
- 0.038753960f, 0.039020218f, 0.039283592f, 0.039544068f, 0.039801639f,
- 0.040056318f, 0.040308096f, 0.040556971f, 0.040802956f, 0.041046046f,
- 0.041286245f, 0.041523557f, 0.041757982f, 0.041989524f, 0.042218179f,
- 0.042443957f, 0.042666860f, 0.042886890f, 0.043104045f, 0.043318339f,
- 0.043529764f, 0.043738328f, 0.043944035f, 0.044146888f, 0.044346895f,
- 0.044544052f, 0.044738363f, 0.044929843f, 0.045118481f, 0.045304272f,
- 0.045487255f, 0.045667417f, 0.045844764f, 0.046019293f, 0.046191018f,
- 0.046359941f, 0.046526067f, 0.046689399f, 0.046849940f, 0.047007702f,
- 0.047162689f, 0.047314901f, 0.047464348f, 0.047611035f, 0.047754966f,
- 0.047896147f, 0.048034586f, 0.048170291f, 0.048303265f, 0.048433512f,
- 0.048561048f, 0.048685864f, 0.048807982f, 0.048927400f, 0.049044125f,
- 0.049158167f, 0.049269531f, 0.049378205f, 0.049484238f, 0.049587611f,
- 0.049688339f, 0.049786422f, 0.049881872f, 0.049974691f, 0.050064899f,
- 0.050152492f, 0.050237484f, 0.050319877f, 0.050399683f, 0.050476916f,
- 0.050551571f, 0.050623666f, 0.050693203f, 0.050760195f, 0.050824653f,
- 0.050886583f, 0.050945986f, 0.051002879f, 0.051057268f, 0.051109165f,
- 0.051158577f, 0.051205512f, 0.051249981f, 0.051291991f, 0.051331542f,
- 0.051368665f, 0.051403359f, 0.051435627f, 0.051465489f, 0.051492948f,
- 0.051518012f, 0.051540703f, 0.051561009f, 0.051578961f, 0.051594563f,
- 0.051607810f, 0.051618744f, 0.051627338f, 0.051633626f, 0.051637612f,
- 0.051639307f, 0.051638719f, 0.051635865f, 0.051630747f, 0.051623378f,
- 0.051613763f, 0.051601931f, 0.051587880f, 0.051571615f, 0.051553156f,
- 0.051532514f, 0.051509693f, 0.051484708f, 0.051457576f, 0.051428299f,
- 0.051396891f, 0.051363368f, 0.051327739f, 0.051290002f, 0.051250193f,
- 0.051208302f, 0.051164351f, 0.051118344f, 0.051070303f, 0.051020239f,
- 0.050968144f, 0.050914053f, 0.050857969f, 0.050799899f, 0.050739862f,
- 0.050677869f, 0.050613929f, 0.050548054f, 0.050480254f, 0.050410546f,
- 0.050338943f, 0.050265454f, 0.050190084f, 0.050112855f, 0.050033774f,
- 0.049952857f, 0.049870111f, 0.049785554f, 0.049699202f, 0.049611051f,
- 0.049521122f, 0.049429435f, 0.049335998f, 0.049240820f, 0.049143907f,
- 0.049045283f, 0.048944961f, 0.048842940f, 0.048739251f, 0.048633892f,
- 0.048526883f, 0.048418235f, 0.048307955f, 0.048196062f, 0.048082568f,
- 0.047967490f, 0.047850832f, 0.047732603f, 0.047612831f, 0.047491513f,
- 0.047368675f, 0.047244325f, 0.047118478f, 0.046991132f, 0.046862319f,
- 0.046732042f, 0.046600312f, 0.046467155f, 0.046332560f, 0.046196572f,
- 0.046059173f, 0.045920394f, 0.045780238f, 0.045638733f, 0.045495875f,
- 0.045351684f, 0.045206167f, 0.045059349f, 0.044911236f, 0.044761848f,
- 0.044611182f, 0.044459261f, 0.044306096f, 0.044151701f, 0.043996092f,
- 0.043839272f, 0.043681268f, 0.043522079f, 0.043361723f, 0.043200217f,
- 0.043037571f, 0.042873796f, 0.042708915f, 0.042542927f, 0.042375844f,
- 0.042207699f, 0.042038482f, 0.041868217f, 0.041696910f, 0.041524585f,
- 0.041351244f, 0.041176908f, 0.041001581f, 0.040825289f, 0.040648032f,
- 0.040469825f, 0.040290687f, 0.040110629f, 0.039929654f, 0.039747790f,
- 0.039565038f, 0.039381415f, 0.039196935f, 0.039011609f, 0.038825445f,
- 0.038638465f, 0.038450673f, 0.038262092f, 0.038072724f, 0.037882581f,
- 0.037691690f, 0.037500042f, 0.037307668f, 0.037114572f, 0.036920771f,
- 0.036726266f, 0.036531083f, 0.036335230f, 0.036138717f, 0.035941560f,
- 0.035743766f, 0.035545345f, 0.035346344f, 0.035146721f, 0.034946512f,
- 0.034745730f, 0.034544386f, 0.034342494f, 0.034140065f, 0.033937111f,
- 0.033733644f, 0.033529676f, 0.033325221f, 0.033120286f, 0.032914892f,
- 0.032709036f, 0.032502741f, 0.032296017f, 0.032088876f, 0.031881329f,
- 0.031673383f, 0.031465057f, 0.031256359f, 0.031047301f, 0.030837893f,
- 0.030628148f, 0.030418083f, 0.030207697f, 0.029997014f, 0.029786035f,
- 0.029574780f, 0.029363252f, 0.029151469f, 0.028939439f, 0.028727176f,
- 0.028514685f, 0.028301982f, 0.028089074f, 0.027875982f, 0.027662706f,
- 0.027449260f, 0.027235655f, 0.027021904f, 0.026808018f, 0.026594002f,
- 0.026379872f, 0.026165638f, 0.025951311f, 0.025736896f, 0.025522409f,
- 0.025307864f, 0.025093259f, 0.024878617f, 0.024663944f, 0.024449248f,
- 0.024234539f, 0.024019832f, 0.023805158f, 0.023590479f, 0.023375830f,
- 0.023161218f, 0.022946658f, 0.022732155f, 0.022517720f, 0.022303363f,
- 0.022089096f, 0.021874927f, 0.021660868f, 0.021446921f, 0.021233102f,
- 0.021019425f, 0.020805888f, 0.020592507f, 0.020379292f, 0.020166250f,
- 0.019953389f, 0.019740723f, 0.019528257f, 0.019316001f, 0.019103965f,
- 0.018892156f, 0.018680587f, 0.018469261f, 0.018258194f, 0.018047387f,
- 0.017836852f, 0.017626595f, 0.017416634f, 0.017206967f, 0.016997607f,
- 0.016788563f, 0.016579840f, 0.016371451f, 0.016163401f, 0.015955698f,
- 0.015748354f, 0.015541371f, 0.015334761f, 0.015128531f, 0.014922690f,
- 0.014717245f, 0.014512201f, 0.014307571f, 0.014103360f, 0.013899575f,
- 0.013696224f, 0.013493315f, 0.013290856f, 0.013088853f, 0.012887316f,
- 0.012686247f, 0.012485661f, 0.012285583f, 0.012085971f, 0.011886863f,
- 0.011688258f, 0.011490168f, 0.011292599f, 0.011095556f, 0.010899050f,
- 0.010703083f, 0.010507663f, 0.010312798f, 0.010118493f, 0.009924755f,
- 0.009731592f, 0.009539006f, 0.009347008f, 0.009155600f, 0.008964794f,
- 0.008774590f, 0.008584999f, 0.008396022f, 0.008207668f, 0.008019943f,
- 0.007832851f, 0.007646400f, 0.007460595f, 0.007275441f, 0.007090943f,
- 0.006907108f, 0.006723941f, 0.006541446f, 0.006359630f, 0.006178498f,
- 0.005998055f, 0.005818305f, 0.005639255f, 0.005460909f, 0.005283272f,
- 0.005106349f, 0.004930146f, 0.004754666f, 0.004579914f, 0.004405896f,
- 0.004232615f, 0.004060077f, 0.003888285f, 0.003717245f, 0.003546960f,
- 0.003377435f, 0.003208674f, 0.003040682f, 0.002873462f, 0.002707019f,
- 0.002541356f, 0.002376478f, 0.002212389f, 0.002049116f, 0.001886615f,
- 0.001724914f, 0.001564016f, 0.001403926f, 0.001244646f, 0.001086180f,
- 0.000928532f, 0.000771705f, 0.000615702f, 0.000460527f, 0.000306183f,
- 0.000152673f, -0.000000001f, -0.000151834f, -0.000302824f, -0.000452968f,
- -0.000602263f, -0.000750707f, -0.000898296f, -0.001045028f, -0.001190900f,
- -0.001335910f, -0.001480055f, -0.001623332f, -0.001765741f, -0.001907276f,
- -0.002047938f, -0.002187723f, -0.002326628f, -0.002464653f, -0.002601795f,
- -0.002738052f, -0.002873422f, -0.003007903f, -0.003141493f, -0.003274190f,
- -0.003405993f, -0.003536900f, -0.003666909f, -0.003796018f, -0.003924227f,
- -0.004051533f, -0.004177936f, -0.004303433f, -0.004428024f, -0.004551707f,
- -0.004674482f, -0.004796346f, -0.004917298f, -0.005037338f, -0.005156465f,
- -0.005274678f, -0.005391975f, -0.005508356f, -0.005623801f, -0.005738347f,
- -0.005851975f, -0.005964684f, -0.006076474f, -0.006187343f, -0.006297291f,
- -0.006406318f, -0.006514424f, -0.006621608f, -0.006727869f, -0.006833209f,
- -0.006937624f, -0.007041118f, -0.007143687f, -0.007245334f, -0.007346058f,
- -0.007445859f, -0.007544736f, -0.007642691f, -0.007739722f, -0.007835831f,
- -0.007931018f, -0.008025283f, -0.008118626f, -0.008211047f, -0.008302549f,
- -0.008393129f, -0.008482790f, -0.008571531f, -0.008659353f, -0.008746257f,
- -0.008832245f, -0.008917316f, -0.009001471f, -0.009084711f, -0.009167036f,
- -0.009248449f, -0.009328948f, -0.009408538f, -0.009487216f, -0.009564986f,
- -0.009641849f, -0.009717803f, -0.009792852f, -0.009866998f, -0.009940239f,
- -0.010012579f, -0.010084019f, -0.010154560f, -0.010224204f, -0.010292951f,
- -0.0
(Patch may be truncated, please check the link at the top of this post.)