diff --git "a/src/fftw.c" "b/src/fftw.c" new file mode 100644--- /dev/null +++ "b/src/fftw.c" @@ -0,0 +1,3601 @@ +// +// Copyright © 2025 Agora +// This file is part of TEN Framework, an open source project. +// Licensed under the Apache License, Version 2.0, with certain conditions. +// Refer to the "LICENSE" file in the root directory for more information. +// +#include +#include +#include +#include + +#include "fftw.h" + +static const int AUP_FFTW_g_ip256[] = {64, 64, 0, 16, 0, 64, 32, 96}; +static const float AUP_FFTW_g_w256[] = { + 1.000000e+00f, 7.071068e-01f, 5.006030e-01f, 5.054710e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 1.000000e+00f, 7.071068e-01f, 5.024193e-01f, 5.224986e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 1.000000e+00f, 7.071068e-01f, 5.097956e-01f, 6.013449e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 1.000000e+00f, 7.071068e-01f, 9.238795e-01f, 3.826834e-01f, + 1.000000e+00f, 7.071068e-01f, 0.000000e+00f, 0.000000e+00f, + 7.071068e-01f, 4.998494e-01f, 4.993977e-01f, 4.986452e-01f, + 4.975924e-01f, 4.962398e-01f, 4.945883e-01f, 4.926388e-01f, + 4.903926e-01f, 4.878511e-01f, 4.850156e-01f, 4.818880e-01f, + 4.784702e-01f, 4.747641e-01f, 4.707720e-01f, 4.664964e-01f, + 4.619398e-01f, 4.571049e-01f, 4.519946e-01f, 4.466122e-01f, + 4.409606e-01f, 4.350435e-01f, 4.288643e-01f, 4.224268e-01f, + 4.157348e-01f, 4.087924e-01f, 4.016038e-01f, 3.941732e-01f, + 3.865052e-01f, 3.786044e-01f, 3.704756e-01f, 3.621235e-01f, + 3.535534e-01f, 3.447703e-01f, 3.357795e-01f, 3.265864e-01f, + 3.171966e-01f, 3.076158e-01f, 2.978497e-01f, 2.879041e-01f, + 2.777851e-01f, 2.674988e-01f, 2.570514e-01f, 2.464491e-01f, + 2.356984e-01f, 2.248057e-01f, 2.137775e-01f, 2.026207e-01f, + 1.913417e-01f, 1.799475e-01f, 1.684449e-01f, 1.568409e-01f, + 1.451423e-01f, 1.333564e-01f, 1.214901e-01f, 1.095506e-01f, + 9.754516e-02f, 8.548094e-02f, 7.336524e-02f, 6.120534e-02f, + 4.900857e-02f, 3.678228e-02f, 2.453384e-02f, 1.227061e-02f}; +static const int AUP_FFTW_g_ip512[] = {128, 128, 0, 16, 0, 64, 32, 96}; +static const float AUP_FFTW_g_w512[] = { + 1.000000e+00f, 7.071068e-01f, 5.001506e-01f, 5.013585e-01f, + 9.987955e-01f, 4.906767e-02f, 9.891765e-01f, -1.467305e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.891765e-01f, 1.467305e-01f, 9.039893e-01f, -4.275551e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.700313e-01f, 2.429802e-01f, 7.409511e-01f, -6.715590e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.415441e-01f, 3.368899e-01f, 5.141027e-01f, -8.577286e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 9.039893e-01f, 4.275551e-01f, 2.429802e-01f, -9.700313e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.577286e-01f, 5.141027e-01f, -4.906767e-02f, -9.987955e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 8.032075e-01f, 5.956993e-01f, -3.368899e-01f, -9.415441e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 7.409511e-01f, 6.715590e-01f, -5.956993e-01f, -8.032075e-01f, + 1.000000e+00f, 7.071068e-01f, 5.006030e-01f, 5.054710e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 1.000000e+00f, 7.071068e-01f, 5.024193e-01f, 5.224986e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 1.000000e+00f, 7.071068e-01f, 5.097956e-01f, 6.013449e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 1.000000e+00f, 7.071068e-01f, 9.238795e-01f, 3.826834e-01f, + 1.000000e+00f, 7.071068e-01f, 0.000000e+00f, 0.000000e+00f, + 7.071068e-01f, 4.999624e-01f, 4.998494e-01f, 4.996612e-01f, + 4.993977e-01f, 4.990591e-01f, 4.986452e-01f, 4.981563e-01f, + 4.975924e-01f, 4.969535e-01f, 4.962398e-01f, 4.954513e-01f, + 4.945883e-01f, 4.936507e-01f, 4.926388e-01f, 4.915527e-01f, + 4.903926e-01f, 4.891587e-01f, 4.878511e-01f, 4.864700e-01f, + 4.850156e-01f, 4.834882e-01f, 4.818880e-01f, 4.802153e-01f, + 4.784702e-01f, 4.766530e-01f, 4.747641e-01f, 4.728037e-01f, + 4.707720e-01f, 4.686695e-01f, 4.664964e-01f, 4.642530e-01f, + 4.619398e-01f, 4.595569e-01f, 4.571049e-01f, 4.545840e-01f, + 4.519946e-01f, 4.493372e-01f, 4.466122e-01f, 4.438198e-01f, + 4.409606e-01f, 4.380350e-01f, 4.350435e-01f, 4.319864e-01f, + 4.288643e-01f, 4.256776e-01f, 4.224268e-01f, 4.191124e-01f, + 4.157348e-01f, 4.122947e-01f, 4.087924e-01f, 4.052286e-01f, + 4.016038e-01f, 3.979185e-01f, 3.941732e-01f, 3.903686e-01f, + 3.865052e-01f, 3.825836e-01f, 3.786044e-01f, 3.745682e-01f, + 3.704756e-01f, 3.663271e-01f, 3.621235e-01f, 3.578654e-01f, + 3.535534e-01f, 3.491881e-01f, 3.447703e-01f, 3.403005e-01f, + 3.357795e-01f, 3.312079e-01f, 3.265864e-01f, 3.219158e-01f, + 3.171966e-01f, 3.124297e-01f, 3.076158e-01f, 3.027555e-01f, + 2.978497e-01f, 2.928989e-01f, 2.879041e-01f, 2.828659e-01f, + 2.777851e-01f, 2.726625e-01f, 2.674988e-01f, 2.622948e-01f, + 2.570514e-01f, 2.517692e-01f, 2.464491e-01f, 2.410919e-01f, + 2.356984e-01f, 2.302694e-01f, 2.248057e-01f, 2.193081e-01f, + 2.137775e-01f, 2.082148e-01f, 2.026207e-01f, 1.969960e-01f, + 1.913417e-01f, 1.856586e-01f, 1.799475e-01f, 1.742093e-01f, + 1.684449e-01f, 1.626551e-01f, 1.568409e-01f, 1.510030e-01f, + 1.451423e-01f, 1.392598e-01f, 1.333564e-01f, 1.274328e-01f, + 1.214901e-01f, 1.155291e-01f, 1.095506e-01f, 1.035557e-01f, + 9.754516e-02f, 9.151994e-02f, 8.548094e-02f, 7.942907e-02f, + 7.336524e-02f, 6.729035e-02f, 6.120534e-02f, 5.511110e-02f, + 4.900857e-02f, 4.289866e-02f, 3.678228e-02f, 3.066037e-02f, + 2.453384e-02f, 1.840361e-02f, 1.227061e-02f, 6.135769e-03f}; +static const int AUP_FFTW_g_ip1024[] = {256, 256, 0, 16, 0, 64, 32, 96, + 0, 256, 128, 384, 64, 320, 192, 448}; +static const float AUP_FFTW_g_w1024[] = { + 1.000000e+00f, 7.071068e-01f, 5.000377e-01f, 5.003390e-01f, + 9.996988e-01f, 2.454123e-02f, 9.972905e-01f, -7.356456e-02f, + 9.987955e-01f, 4.906767e-02f, 9.891765e-01f, -1.467305e-01f, + 9.972905e-01f, 7.356456e-02f, 9.757021e-01f, -2.191012e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.924795e-01f, 1.224107e-01f, 9.329928e-01f, -3.598950e-01f, + 9.891765e-01f, 1.467305e-01f, 9.039893e-01f, -4.275551e-01f, + 9.852776e-01f, 1.709619e-01f, 8.700870e-01f, -4.928982e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.757021e-01f, 2.191012e-01f, 7.883464e-01f, -6.152316e-01f, + 9.700313e-01f, 2.429802e-01f, 7.409511e-01f, -6.715590e-01f, + 9.637761e-01f, 2.667128e-01f, 6.895405e-01f, -7.242471e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.495282e-01f, 3.136817e-01f, 5.758082e-01f, -8.175848e-01f, + 9.415441e-01f, 3.368899e-01f, 5.141027e-01f, -8.577286e-01f, + 9.329928e-01f, 3.598950e-01f, 4.496113e-01f, -8.932243e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 9.142098e-01f, 4.052413e-01f, 3.136817e-01f, -9.495282e-01f, + 9.039893e-01f, 4.275551e-01f, 2.429802e-01f, -9.700313e-01f, + 8.932243e-01f, 4.496113e-01f, 1.709619e-01f, -9.852776e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.700870e-01f, 4.928982e-01f, 2.454123e-02f, -9.996988e-01f, + 8.577286e-01f, 5.141027e-01f, -4.906767e-02f, -9.987955e-01f, + 8.448536e-01f, 5.349976e-01f, -1.224107e-01f, -9.924795e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 8.175848e-01f, 5.758082e-01f, -2.667128e-01f, -9.637761e-01f, + 8.032075e-01f, 5.956993e-01f, -3.368899e-01f, -9.415441e-01f, + 7.883464e-01f, 6.152316e-01f, -4.052413e-01f, -9.142098e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 7.572088e-01f, 6.531728e-01f, -5.349976e-01f, -8.448536e-01f, + 7.409511e-01f, 6.715590e-01f, -5.956993e-01f, -8.032075e-01f, + 7.242471e-01f, 6.895405e-01f, -6.531728e-01f, -7.572088e-01f, + 1.000000e+00f, 7.071068e-01f, 5.001506e-01f, 5.013585e-01f, + 9.987955e-01f, 4.906767e-02f, 9.891765e-01f, -1.467305e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.891765e-01f, 1.467305e-01f, 9.039893e-01f, -4.275551e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.700313e-01f, 2.429802e-01f, 7.409511e-01f, -6.715590e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.415441e-01f, 3.368899e-01f, 5.141027e-01f, -8.577286e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 9.039893e-01f, 4.275551e-01f, 2.429802e-01f, -9.700313e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.577286e-01f, 5.141027e-01f, -4.906767e-02f, -9.987955e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 8.032075e-01f, 5.956993e-01f, -3.368899e-01f, -9.415441e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 7.409511e-01f, 6.715590e-01f, -5.956993e-01f, -8.032075e-01f, + 1.000000e+00f, 7.071068e-01f, 5.006030e-01f, 5.054710e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 1.000000e+00f, 7.071068e-01f, 5.024193e-01f, 5.224986e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 1.000000e+00f, 7.071068e-01f, 5.097956e-01f, 6.013449e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 1.000000e+00f, 7.071068e-01f, 9.238795e-01f, 3.826834e-01f, + 1.000000e+00f, 7.071068e-01f, 0.000000e+00f, 0.000000e+00f, + 7.071068e-01f, 4.999906e-01f, 4.999624e-01f, 4.999153e-01f, + 4.998494e-01f, 4.997647e-01f, 4.996612e-01f, 4.995389e-01f, + 4.993977e-01f, 4.992378e-01f, 4.990591e-01f, 4.988615e-01f, + 4.986452e-01f, 4.984101e-01f, 4.981563e-01f, 4.978837e-01f, + 4.975924e-01f, 4.972823e-01f, 4.969535e-01f, 4.966060e-01f, + 4.962398e-01f, 4.958549e-01f, 4.954513e-01f, 4.950291e-01f, + 4.945883e-01f, 4.941288e-01f, 4.936507e-01f, 4.931540e-01f, + 4.926388e-01f, 4.921050e-01f, 4.915527e-01f, 4.909819e-01f, + 4.903926e-01f, 4.897849e-01f, 4.891587e-01f, 4.885141e-01f, + 4.878511e-01f, 4.871697e-01f, 4.864700e-01f, 4.857519e-01f, + 4.850156e-01f, 4.842610e-01f, 4.834882e-01f, 4.826972e-01f, + 4.818880e-01f, 4.810607e-01f, 4.802153e-01f, 4.793517e-01f, + 4.784702e-01f, 4.775706e-01f, 4.766530e-01f, 4.757175e-01f, + 4.747641e-01f, 4.737928e-01f, 4.728037e-01f, 4.717967e-01f, + 4.707720e-01f, 4.697296e-01f, 4.686695e-01f, 4.675918e-01f, + 4.664964e-01f, 4.653835e-01f, 4.642530e-01f, 4.631051e-01f, + 4.619398e-01f, 4.607570e-01f, 4.595569e-01f, 4.583395e-01f, + 4.571049e-01f, 4.558530e-01f, 4.545840e-01f, 4.532979e-01f, + 4.519946e-01f, 4.506744e-01f, 4.493372e-01f, 4.479831e-01f, + 4.466122e-01f, 4.452244e-01f, 4.438198e-01f, 4.423985e-01f, + 4.409606e-01f, 4.395061e-01f, 4.380350e-01f, 4.365475e-01f, + 4.350435e-01f, 4.335231e-01f, 4.319864e-01f, 4.304335e-01f, + 4.288643e-01f, 4.272790e-01f, 4.256776e-01f, 4.240602e-01f, + 4.224268e-01f, 4.207775e-01f, 4.191124e-01f, 4.174314e-01f, + 4.157348e-01f, 4.140225e-01f, 4.122947e-01f, 4.105513e-01f, + 4.087924e-01f, 4.070182e-01f, 4.052286e-01f, 4.034238e-01f, + 4.016038e-01f, 3.997686e-01f, 3.979185e-01f, 3.960533e-01f, + 3.941732e-01f, 3.922783e-01f, 3.903686e-01f, 3.884442e-01f, + 3.865052e-01f, 3.845517e-01f, 3.825836e-01f, 3.806012e-01f, + 3.786044e-01f, 3.765934e-01f, 3.745682e-01f, 3.725289e-01f, + 3.704756e-01f, 3.684083e-01f, 3.663271e-01f, 3.642322e-01f, + 3.621235e-01f, 3.600013e-01f, 3.578654e-01f, 3.557161e-01f, + 3.535534e-01f, 3.513774e-01f, 3.491881e-01f, 3.469857e-01f, + 3.447703e-01f, 3.425418e-01f, 3.403005e-01f, 3.380464e-01f, + 3.357795e-01f, 3.335000e-01f, 3.312079e-01f, 3.289033e-01f, + 3.265864e-01f, 3.242572e-01f, 3.219158e-01f, 3.195622e-01f, + 3.171966e-01f, 3.148191e-01f, 3.124297e-01f, 3.100286e-01f, + 3.076158e-01f, 3.051914e-01f, 3.027555e-01f, 3.003082e-01f, + 2.978497e-01f, 2.953799e-01f, 2.928989e-01f, 2.904070e-01f, + 2.879041e-01f, 2.853904e-01f, 2.828659e-01f, 2.803308e-01f, + 2.777851e-01f, 2.752290e-01f, 2.726625e-01f, 2.700857e-01f, + 2.674988e-01f, 2.649018e-01f, 2.622948e-01f, 2.596780e-01f, + 2.570514e-01f, 2.544151e-01f, 2.517692e-01f, 2.491138e-01f, + 2.464491e-01f, 2.437751e-01f, 2.410919e-01f, 2.383996e-01f, + 2.356984e-01f, 2.329882e-01f, 2.302694e-01f, 2.275418e-01f, + 2.248057e-01f, 2.220611e-01f, 2.193081e-01f, 2.165469e-01f, + 2.137775e-01f, 2.110001e-01f, 2.082148e-01f, 2.054216e-01f, + 2.026207e-01f, 1.998121e-01f, 1.969960e-01f, 1.941725e-01f, + 1.913417e-01f, 1.885037e-01f, 1.856586e-01f, 1.828065e-01f, + 1.799475e-01f, 1.770818e-01f, 1.742093e-01f, 1.713304e-01f, + 1.684449e-01f, 1.655532e-01f, 1.626551e-01f, 1.597510e-01f, + 1.568409e-01f, 1.539248e-01f, 1.510030e-01f, 1.480754e-01f, + 1.451423e-01f, 1.422038e-01f, 1.392598e-01f, 1.363107e-01f, + 1.333564e-01f, 1.303971e-01f, 1.274328e-01f, 1.244638e-01f, + 1.214901e-01f, 1.185118e-01f, 1.155291e-01f, 1.125420e-01f, + 1.095506e-01f, 1.065552e-01f, 1.035557e-01f, 1.005523e-01f, + 9.754516e-02f, 9.453433e-02f, 9.151994e-02f, 8.850211e-02f, + 8.548094e-02f, 8.245656e-02f, 7.942907e-02f, 7.639859e-02f, + 7.336524e-02f, 7.032912e-02f, 6.729035e-02f, 6.424906e-02f, + 6.120534e-02f, 5.815932e-02f, 5.511110e-02f, 5.206082e-02f, + 4.900857e-02f, 4.595448e-02f, 4.289866e-02f, 3.984122e-02f, + 3.678228e-02f, 3.372196e-02f, 3.066037e-02f, 2.759762e-02f, + 2.453384e-02f, 2.146913e-02f, 1.840361e-02f, 1.533740e-02f, + 1.227061e-02f, 9.203365e-03f, 6.135769e-03f, 3.067942e-03f}; +static const int AUP_FFTW_g_ip2048[] = {512, 512, 0, 16, 0, 64, 32, 96, + 0, 256, 128, 384, 64, 320, 192, 448}; +static const float AUP_FFTW_g_w2048[] = { + 1.000000e+00f, 7.071068e-01f, 5.000094e-01f, 5.000847e-01f, + 9.999247e-01f, 1.227154e-02f, 9.993224e-01f, -3.680722e-02f, + 9.996988e-01f, 2.454123e-02f, 9.972905e-01f, -7.356456e-02f, + 9.993224e-01f, 3.680722e-02f, 9.939070e-01f, -1.102222e-01f, + 9.987955e-01f, 4.906767e-02f, 9.891765e-01f, -1.467305e-01f, + 9.981181e-01f, 6.132074e-02f, 9.831055e-01f, -1.830399e-01f, + 9.972905e-01f, 7.356456e-02f, 9.757021e-01f, -2.191012e-01f, + 9.963126e-01f, 8.579731e-02f, 9.669765e-01f, -2.548657e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.939070e-01f, 1.102222e-01f, 9.456073e-01f, -3.253103e-01f, + 9.924795e-01f, 1.224107e-01f, 9.329928e-01f, -3.598950e-01f, + 9.909026e-01f, 1.345807e-01f, 9.191139e-01f, -3.939920e-01f, + 9.891765e-01f, 1.467305e-01f, 9.039893e-01f, -4.275551e-01f, + 9.873014e-01f, 1.588581e-01f, 8.876396e-01f, -4.605387e-01f, + 9.852776e-01f, 1.709619e-01f, 8.700870e-01f, -4.928982e-01f, + 9.831055e-01f, 1.830399e-01f, 8.513552e-01f, -5.245897e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.783174e-01f, 2.071114e-01f, 8.104572e-01f, -5.857979e-01f, + 9.757021e-01f, 2.191012e-01f, 7.883464e-01f, -6.152316e-01f, + 9.729400e-01f, 2.310581e-01f, 7.651673e-01f, -6.438315e-01f, + 9.700313e-01f, 2.429802e-01f, 7.409511e-01f, -6.715590e-01f, + 9.669765e-01f, 2.548657e-01f, 7.157308e-01f, -6.983762e-01f, + 9.637761e-01f, 2.667128e-01f, 6.895405e-01f, -7.242471e-01f, + 9.604305e-01f, 2.785197e-01f, 6.624158e-01f, -7.491364e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.533060e-01f, 3.020059e-01f, 6.055110e-01f, -7.958369e-01f, + 9.495282e-01f, 3.136817e-01f, 5.758082e-01f, -8.175848e-01f, + 9.456073e-01f, 3.253103e-01f, 5.453250e-01f, -8.382247e-01f, + 9.415441e-01f, 3.368899e-01f, 5.141027e-01f, -8.577286e-01f, + 9.373390e-01f, 3.484187e-01f, 4.821838e-01f, -8.760701e-01f, + 9.329928e-01f, 3.598950e-01f, 4.496113e-01f, -8.932243e-01f, + 9.285061e-01f, 3.713172e-01f, 4.164296e-01f, -9.091680e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 9.191139e-01f, 3.939920e-01f, 3.484187e-01f, -9.373390e-01f, + 9.142098e-01f, 4.052413e-01f, 3.136817e-01f, -9.495282e-01f, + 9.091680e-01f, 4.164296e-01f, 2.785197e-01f, -9.604305e-01f, + 9.039893e-01f, 4.275551e-01f, 2.429802e-01f, -9.700313e-01f, + 8.986745e-01f, 4.386162e-01f, 2.071114e-01f, -9.783174e-01f, + 8.932243e-01f, 4.496113e-01f, 1.709619e-01f, -9.852776e-01f, + 8.876396e-01f, 4.605387e-01f, 1.345807e-01f, -9.909026e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.760701e-01f, 4.821838e-01f, 6.132074e-02f, -9.981181e-01f, + 8.700870e-01f, 4.928982e-01f, 2.454123e-02f, -9.996988e-01f, + 8.639729e-01f, 5.035384e-01f, -1.227154e-02f, -9.999247e-01f, + 8.577286e-01f, 5.141027e-01f, -4.906767e-02f, -9.987955e-01f, + 8.513552e-01f, 5.245897e-01f, -8.579731e-02f, -9.963126e-01f, + 8.448536e-01f, 5.349976e-01f, -1.224107e-01f, -9.924795e-01f, + 8.382247e-01f, 5.453250e-01f, -1.588581e-01f, -9.873014e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 8.245893e-01f, 5.657318e-01f, -2.310581e-01f, -9.729400e-01f, + 8.175848e-01f, 5.758082e-01f, -2.667128e-01f, -9.637761e-01f, + 8.104572e-01f, 5.857979e-01f, -3.020059e-01f, -9.533060e-01f, + 8.032075e-01f, 5.956993e-01f, -3.368899e-01f, -9.415441e-01f, + 7.958369e-01f, 6.055110e-01f, -3.713172e-01f, -9.285061e-01f, + 7.883464e-01f, 6.152316e-01f, -4.052413e-01f, -9.142098e-01f, + 7.807372e-01f, 6.248595e-01f, -4.386162e-01f, -8.986745e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 7.651673e-01f, 6.438315e-01f, -5.035384e-01f, -8.639729e-01f, + 7.572088e-01f, 6.531728e-01f, -5.349976e-01f, -8.448536e-01f, + 7.491364e-01f, 6.624158e-01f, -5.657318e-01f, -8.245893e-01f, + 7.409511e-01f, 6.715590e-01f, -5.956993e-01f, -8.032075e-01f, + 7.326543e-01f, 6.806010e-01f, -6.248595e-01f, -7.807372e-01f, + 7.242471e-01f, 6.895405e-01f, -6.531728e-01f, -7.572088e-01f, + 7.157308e-01f, 6.983762e-01f, -6.806010e-01f, -7.326543e-01f, + 1.000000e+00f, 7.071068e-01f, 5.000377e-01f, 5.003390e-01f, + 9.996988e-01f, 2.454123e-02f, 9.972905e-01f, -7.356456e-02f, + 9.987955e-01f, 4.906767e-02f, 9.891765e-01f, -1.467305e-01f, + 9.972905e-01f, 7.356456e-02f, 9.757021e-01f, -2.191012e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.924795e-01f, 1.224107e-01f, 9.329928e-01f, -3.598950e-01f, + 9.891765e-01f, 1.467305e-01f, 9.039893e-01f, -4.275551e-01f, + 9.852776e-01f, 1.709619e-01f, 8.700870e-01f, -4.928982e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.757021e-01f, 2.191012e-01f, 7.883464e-01f, -6.152316e-01f, + 9.700313e-01f, 2.429802e-01f, 7.409511e-01f, -6.715590e-01f, + 9.637761e-01f, 2.667128e-01f, 6.895405e-01f, -7.242471e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.495282e-01f, 3.136817e-01f, 5.758082e-01f, -8.175848e-01f, + 9.415441e-01f, 3.368899e-01f, 5.141027e-01f, -8.577286e-01f, + 9.329928e-01f, 3.598950e-01f, 4.496113e-01f, -8.932243e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 9.142098e-01f, 4.052413e-01f, 3.136817e-01f, -9.495282e-01f, + 9.039893e-01f, 4.275551e-01f, 2.429802e-01f, -9.700313e-01f, + 8.932243e-01f, 4.496113e-01f, 1.709619e-01f, -9.852776e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.700870e-01f, 4.928982e-01f, 2.454123e-02f, -9.996988e-01f, + 8.577286e-01f, 5.141027e-01f, -4.906767e-02f, -9.987955e-01f, + 8.448536e-01f, 5.349976e-01f, -1.224107e-01f, -9.924795e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 8.175848e-01f, 5.758082e-01f, -2.667128e-01f, -9.637761e-01f, + 8.032075e-01f, 5.956993e-01f, -3.368899e-01f, -9.415441e-01f, + 7.883464e-01f, 6.152316e-01f, -4.052413e-01f, -9.142098e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 7.572088e-01f, 6.531728e-01f, -5.349976e-01f, -8.448536e-01f, + 7.409511e-01f, 6.715590e-01f, -5.956993e-01f, -8.032075e-01f, + 7.242471e-01f, 6.895405e-01f, -6.531728e-01f, -7.572088e-01f, + 1.000000e+00f, 7.071068e-01f, 5.001506e-01f, 5.013585e-01f, + 9.987955e-01f, 4.906767e-02f, 9.891765e-01f, -1.467305e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.891765e-01f, 1.467305e-01f, 9.039893e-01f, -4.275551e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.700313e-01f, 2.429802e-01f, 7.409511e-01f, -6.715590e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.415441e-01f, 3.368899e-01f, 5.141027e-01f, -8.577286e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 9.039893e-01f, 4.275551e-01f, 2.429802e-01f, -9.700313e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.577286e-01f, 5.141027e-01f, -4.906767e-02f, -9.987955e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 8.032075e-01f, 5.956993e-01f, -3.368899e-01f, -9.415441e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 7.409511e-01f, 6.715590e-01f, -5.956993e-01f, -8.032075e-01f, + 1.000000e+00f, 7.071068e-01f, 5.006030e-01f, 5.054710e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 1.000000e+00f, 7.071068e-01f, 5.024193e-01f, 5.224986e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 1.000000e+00f, 7.071068e-01f, 5.097956e-01f, 6.013449e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 1.000000e+00f, 7.071068e-01f, 9.238795e-01f, 3.826834e-01f, + 1.000000e+00f, 7.071068e-01f, 0.000000e+00f, 0.000000e+00f, + 7.071068e-01f, 4.999976e-01f, 4.999906e-01f, 4.999788e-01f, + 4.999624e-01f, 4.999412e-01f, 4.999153e-01f, 4.998847e-01f, + 4.998494e-01f, 4.998094e-01f, 4.997647e-01f, 4.997153e-01f, + 4.996612e-01f, 4.996024e-01f, 4.995389e-01f, 4.994706e-01f, + 4.993977e-01f, 4.993201e-01f, 4.992378e-01f, 4.991508e-01f, + 4.990591e-01f, 4.989626e-01f, 4.988615e-01f, 4.987557e-01f, + 4.986452e-01f, 4.985300e-01f, 4.984101e-01f, 4.982856e-01f, + 4.981563e-01f, 4.980224e-01f, 4.978837e-01f, 4.977404e-01f, + 4.975924e-01f, 4.974397e-01f, 4.972823e-01f, 4.971202e-01f, + 4.969535e-01f, 4.967821e-01f, 4.966060e-01f, 4.964252e-01f, + 4.962398e-01f, 4.960497e-01f, 4.958549e-01f, 4.956554e-01f, + 4.954513e-01f, 4.952425e-01f, 4.950291e-01f, 4.948110e-01f, + 4.945883e-01f, 4.943608e-01f, 4.941288e-01f, 4.938921e-01f, + 4.936507e-01f, 4.934047e-01f, 4.931540e-01f, 4.928988e-01f, + 4.926388e-01f, 4.923743e-01f, 4.921050e-01f, 4.918312e-01f, + 4.915527e-01f, 4.912697e-01f, 4.909819e-01f, 4.906896e-01f, + 4.903926e-01f, 4.900911e-01f, 4.897849e-01f, 4.894741e-01f, + 4.891587e-01f, 4.888387e-01f, 4.885141e-01f, 4.881849e-01f, + 4.878511e-01f, 4.875127e-01f, 4.871697e-01f, 4.868221e-01f, + 4.864700e-01f, 4.861132e-01f, 4.857519e-01f, 4.853861e-01f, + 4.850156e-01f, 4.846406e-01f, 4.842610e-01f, 4.838769e-01f, + 4.834882e-01f, 4.830950e-01f, 4.826972e-01f, 4.822949e-01f, + 4.818880e-01f, 4.814766e-01f, 4.810607e-01f, 4.806402e-01f, + 4.802153e-01f, 4.797858e-01f, 4.793517e-01f, 4.789132e-01f, + 4.784702e-01f, 4.780226e-01f, 4.775706e-01f, 4.771140e-01f, + 4.766530e-01f, 4.761875e-01f, 4.757175e-01f, 4.752430e-01f, + 4.747641e-01f, 4.742807e-01f, 4.737928e-01f, 4.733005e-01f, + 4.728037e-01f, 4.723024e-01f, 4.717967e-01f, 4.712866e-01f, + 4.707720e-01f, 4.702530e-01f, 4.697296e-01f, 4.692018e-01f, + 4.686695e-01f, 4.681328e-01f, 4.675918e-01f, 4.670463e-01f, + 4.664964e-01f, 4.659421e-01f, 4.653835e-01f, 4.648204e-01f, + 4.642530e-01f, 4.636813e-01f, 4.631051e-01f, 4.625246e-01f, + 4.619398e-01f, 4.613506e-01f, 4.607570e-01f, 4.601591e-01f, + 4.595569e-01f, 4.589504e-01f, 4.583395e-01f, 4.577244e-01f, + 4.571049e-01f, 4.564811e-01f, 4.558530e-01f, 4.552206e-01f, + 4.545840e-01f, 4.539431e-01f, 4.532979e-01f, 4.526484e-01f, + 4.519946e-01f, 4.513367e-01f, 4.506744e-01f, 4.500079e-01f, + 4.493372e-01f, 4.486623e-01f, 4.479831e-01f, 4.472997e-01f, + 4.466122e-01f, 4.459204e-01f, 4.452244e-01f, 4.445242e-01f, + 4.438198e-01f, 4.431113e-01f, 4.423985e-01f, 4.416817e-01f, + 4.409606e-01f, 4.402354e-01f, 4.395061e-01f, 4.387726e-01f, + 4.380350e-01f, 4.372933e-01f, 4.365475e-01f, 4.357975e-01f, + 4.350435e-01f, 4.342854e-01f, 4.335231e-01f, 4.327568e-01f, + 4.319864e-01f, 4.312120e-01f, 4.304335e-01f, 4.296509e-01f, + 4.288643e-01f, 4.280737e-01f, 4.272790e-01f, 4.264803e-01f, + 4.256776e-01f, 4.248709e-01f, 4.240602e-01f, 4.232455e-01f, + 4.224268e-01f, 4.216041e-01f, 4.207775e-01f, 4.199469e-01f, + 4.191124e-01f, 4.182739e-01f, 4.174314e-01f, 4.165851e-01f, + 4.157348e-01f, 4.148806e-01f, 4.140225e-01f, 4.131605e-01f, + 4.122947e-01f, 4.114249e-01f, 4.105513e-01f, 4.096738e-01f, + 4.087924e-01f, 4.079072e-01f, 4.070182e-01f, 4.061253e-01f, + 4.052286e-01f, 4.043281e-01f, 4.034238e-01f, 4.025157e-01f, + 4.016038e-01f, 4.006881e-01f, 3.997686e-01f, 3.988454e-01f, + 3.979185e-01f, 3.969877e-01f, 3.960533e-01f, 3.951151e-01f, + 3.941732e-01f, 3.932276e-01f, 3.922783e-01f, 3.913253e-01f, + 3.903686e-01f, 3.894083e-01f, 3.884442e-01f, 3.874766e-01f, + 3.865052e-01f, 3.855303e-01f, 3.845517e-01f, 3.835695e-01f, + 3.825836e-01f, 3.815942e-01f, 3.806012e-01f, 3.796046e-01f, + 3.786044e-01f, 3.776007e-01f, 3.765934e-01f, 3.755826e-01f, + 3.745682e-01f, 3.735503e-01f, 3.725289e-01f, 3.715040e-01f, + 3.704756e-01f, 3.694437e-01f, 3.684083e-01f, 3.673694e-01f, + 3.663271e-01f, 3.652814e-01f, 3.642322e-01f, 3.631796e-01f, + 3.621235e-01f, 3.610641e-01f, 3.600013e-01f, 3.589350e-01f, + 3.578654e-01f, 3.567924e-01f, 3.557161e-01f, 3.546364e-01f, + 3.535534e-01f, 3.524670e-01f, 3.513774e-01f, 3.502844e-01f, + 3.491881e-01f, 3.480886e-01f, 3.469857e-01f, 3.458796e-01f, + 3.447703e-01f, 3.436577e-01f, 3.425418e-01f, 3.414228e-01f, + 3.403005e-01f, 3.391750e-01f, 3.380464e-01f, 3.369145e-01f, + 3.357795e-01f, 3.346413e-01f, 3.335000e-01f, 3.323555e-01f, + 3.312079e-01f, 3.300572e-01f, 3.289033e-01f, 3.277464e-01f, + 3.265864e-01f, 3.254233e-01f, 3.242572e-01f, 3.230880e-01f, + 3.219158e-01f, 3.207405e-01f, 3.195622e-01f, 3.183809e-01f, + 3.171966e-01f, 3.160094e-01f, 3.148191e-01f, 3.136259e-01f, + 3.124297e-01f, 3.112306e-01f, 3.100286e-01f, 3.088237e-01f, + 3.076158e-01f, 3.064050e-01f, 3.051914e-01f, 3.039749e-01f, + 3.027555e-01f, 3.015333e-01f, 3.003082e-01f, 2.990804e-01f, + 2.978497e-01f, 2.966161e-01f, 2.953799e-01f, 2.941408e-01f, + 2.928989e-01f, 2.916543e-01f, 2.904070e-01f, 2.891569e-01f, + 2.879041e-01f, 2.866486e-01f, 2.853904e-01f, 2.841295e-01f, + 2.828659e-01f, 2.815997e-01f, 2.803308e-01f, 2.790593e-01f, + 2.777851e-01f, 2.765084e-01f, 2.752290e-01f, 2.739470e-01f, + 2.726625e-01f, 2.713754e-01f, 2.700857e-01f, 2.687935e-01f, + 2.674988e-01f, 2.662016e-01f, 2.649018e-01f, 2.635996e-01f, + 2.622948e-01f, 2.609876e-01f, 2.596780e-01f, 2.583659e-01f, + 2.570514e-01f, 2.557344e-01f, 2.544151e-01f, 2.530933e-01f, + 2.517692e-01f, 2.504427e-01f, 2.491138e-01f, 2.477826e-01f, + 2.464491e-01f, 2.451132e-01f, 2.437751e-01f, 2.424346e-01f, + 2.410919e-01f, 2.397469e-01f, 2.383996e-01f, 2.370501e-01f, + 2.356984e-01f, 2.343444e-01f, 2.329882e-01f, 2.316299e-01f, + 2.302694e-01f, 2.289067e-01f, 2.275418e-01f, 2.261748e-01f, + 2.248057e-01f, 2.234344e-01f, 2.220611e-01f, 2.206856e-01f, + 2.193081e-01f, 2.179285e-01f, 2.165469e-01f, 2.151632e-01f, + 2.137775e-01f, 2.123898e-01f, 2.110001e-01f, 2.096084e-01f, + 2.082148e-01f, 2.068192e-01f, 2.054216e-01f, 2.040221e-01f, + 2.026207e-01f, 2.012173e-01f, 1.998121e-01f, 1.984050e-01f, + 1.969960e-01f, 1.955852e-01f, 1.941725e-01f, 1.927580e-01f, + 1.913417e-01f, 1.899236e-01f, 1.885037e-01f, 1.870820e-01f, + 1.856586e-01f, 1.842334e-01f, 1.828065e-01f, 1.813779e-01f, + 1.799475e-01f, 1.785155e-01f, 1.770818e-01f, 1.756464e-01f, + 1.742093e-01f, 1.727707e-01f, 1.713304e-01f, 1.698884e-01f, + 1.684449e-01f, 1.669998e-01f, 1.655532e-01f, 1.641049e-01f, + 1.626551e-01f, 1.612038e-01f, 1.597510e-01f, 1.582967e-01f, + 1.568409e-01f, 1.553836e-01f, 1.539248e-01f, 1.524646e-01f, + 1.510030e-01f, 1.495399e-01f, 1.480754e-01f, 1.466096e-01f, + 1.451423e-01f, 1.436737e-01f, 1.422038e-01f, 1.407325e-01f, + 1.392598e-01f, 1.377859e-01f, 1.363107e-01f, 1.348342e-01f, + 1.333564e-01f, 1.318773e-01f, 1.303971e-01f, 1.289156e-01f, + 1.274328e-01f, 1.259489e-01f, 1.244638e-01f, 1.229775e-01f, + 1.214901e-01f, 1.200015e-01f, 1.185118e-01f, 1.170210e-01f, + 1.155291e-01f, 1.140360e-01f, 1.125420e-01f, 1.110468e-01f, + 1.095506e-01f, 1.080534e-01f, 1.065552e-01f, 1.050559e-01f, + 1.035557e-01f, 1.020545e-01f, 1.005523e-01f, 9.904921e-02f, + 9.754516e-02f, 9.604020e-02f, 9.453433e-02f, 9.302758e-02f, + 9.151994e-02f, 9.001145e-02f, 8.850211e-02f, 8.699194e-02f, + 8.548094e-02f, 8.396915e-02f, 8.245656e-02f, 8.094320e-02f, + 7.942907e-02f, 7.791420e-02f, 7.639859e-02f, 7.488227e-02f, + 7.336524e-02f, 7.184752e-02f, 7.032912e-02f, 6.881006e-02f, + 6.729035e-02f, 6.577001e-02f, 6.424906e-02f, 6.272749e-02f, + 6.120534e-02f, 5.968261e-02f, 5.815932e-02f, 5.663548e-02f, + 5.511110e-02f, 5.358621e-02f, 5.206082e-02f, 5.053493e-02f, + 4.900857e-02f, 4.748175e-02f, 4.595448e-02f, 4.442678e-02f, + 4.289866e-02f, 4.137013e-02f, 3.984122e-02f, 3.831193e-02f, + 3.678228e-02f, 3.525229e-02f, 3.372196e-02f, 3.219132e-02f, + 3.066037e-02f, 2.912913e-02f, 2.759762e-02f, 2.606585e-02f, + 2.453384e-02f, 2.300159e-02f, 2.146913e-02f, 1.993646e-02f, + 1.840361e-02f, 1.687059e-02f, 1.533740e-02f, 1.380407e-02f, + 1.227061e-02f, 1.073704e-02f, 9.203365e-03f, 7.669603e-03f, + 6.135769e-03f, 4.601877e-03f, 3.067942e-03f, 1.533978e-03f}; +static const int AUP_FFTW_g_ip4096[] = { + 1024, 1024, 0, 16, 0, 64, 32, 96, 0, 256, 128, + 384, 64, 320, 192, 448, 0, 1024, 512, 1536, 256, 1280, + 768, 1792, 128, 1152, 640, 1664, 384, 1408, 896, 1920}; +static const float AUP_FFTW_g_w4096[] = { + 1.000000e+00f, 7.071068e-01f, 5.000024e-01f, 5.000212e-01f, + 9.999812e-01f, 6.135885e-03f, 9.998306e-01f, -1.840673e-02f, + 9.999247e-01f, 1.227154e-02f, 9.993224e-01f, -3.680722e-02f, + 9.998306e-01f, 1.840673e-02f, 9.984756e-01f, -5.519524e-02f, + 9.996988e-01f, 2.454123e-02f, 9.972905e-01f, -7.356456e-02f, + 9.995294e-01f, 3.067480e-02f, 9.957674e-01f, -9.190896e-02f, + 9.993224e-01f, 3.680722e-02f, 9.939070e-01f, -1.102222e-01f, + 9.990777e-01f, 4.293826e-02f, 9.917098e-01f, -1.284981e-01f, + 9.987955e-01f, 4.906767e-02f, 9.891765e-01f, -1.467305e-01f, + 9.984756e-01f, 5.519524e-02f, 9.863081e-01f, -1.649131e-01f, + 9.981181e-01f, 6.132074e-02f, 9.831055e-01f, -1.830399e-01f, + 9.977231e-01f, 6.744392e-02f, 9.795698e-01f, -2.011046e-01f, + 9.972905e-01f, 7.356456e-02f, 9.757021e-01f, -2.191012e-01f, + 9.968203e-01f, 7.968244e-02f, 9.715039e-01f, -2.370236e-01f, + 9.963126e-01f, 8.579731e-02f, 9.669765e-01f, -2.548657e-01f, + 9.957674e-01f, 9.190896e-02f, 9.621214e-01f, -2.726214e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.945646e-01f, 1.041216e-01f, 9.514350e-01f, -3.078496e-01f, + 9.939070e-01f, 1.102222e-01f, 9.456073e-01f, -3.253103e-01f, + 9.932119e-01f, 1.163186e-01f, 9.394592e-01f, -3.426607e-01f, + 9.924795e-01f, 1.224107e-01f, 9.329928e-01f, -3.598950e-01f, + 9.917098e-01f, 1.284981e-01f, 9.262102e-01f, -3.770074e-01f, + 9.909026e-01f, 1.345807e-01f, 9.191139e-01f, -3.939920e-01f, + 9.900582e-01f, 1.406582e-01f, 9.117060e-01f, -4.108432e-01f, + 9.891765e-01f, 1.467305e-01f, 9.039893e-01f, -4.275551e-01f, + 9.882576e-01f, 1.527972e-01f, 8.959662e-01f, -4.441221e-01f, + 9.873014e-01f, 1.588581e-01f, 8.876396e-01f, -4.605387e-01f, + 9.863081e-01f, 1.649131e-01f, 8.790122e-01f, -4.767992e-01f, + 9.852776e-01f, 1.709619e-01f, 8.700870e-01f, -4.928982e-01f, + 9.842101e-01f, 1.770042e-01f, 8.608669e-01f, -5.088301e-01f, + 9.831055e-01f, 1.830399e-01f, 8.513552e-01f, -5.245897e-01f, + 9.819639e-01f, 1.890687e-01f, 8.415550e-01f, -5.401715e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.795698e-01f, 2.011046e-01f, 8.211025e-01f, -5.707807e-01f, + 9.783174e-01f, 2.071114e-01f, 8.104572e-01f, -5.857979e-01f, + 9.770281e-01f, 2.131103e-01f, 7.995373e-01f, -6.006165e-01f, + 9.757021e-01f, 2.191012e-01f, 7.883464e-01f, -6.152316e-01f, + 9.743394e-01f, 2.250839e-01f, 7.768885e-01f, -6.296382e-01f, + 9.729400e-01f, 2.310581e-01f, 7.651673e-01f, -6.438315e-01f, + 9.715039e-01f, 2.370236e-01f, 7.531868e-01f, -6.578067e-01f, + 9.700313e-01f, 2.429802e-01f, 7.409511e-01f, -6.715590e-01f, + 9.685221e-01f, 2.489276e-01f, 7.284644e-01f, -6.850837e-01f, + 9.669765e-01f, 2.548657e-01f, 7.157308e-01f, -6.983762e-01f, + 9.653944e-01f, 2.607941e-01f, 7.027547e-01f, -7.114322e-01f, + 9.637761e-01f, 2.667128e-01f, 6.895405e-01f, -7.242471e-01f, + 9.621214e-01f, 2.726214e-01f, 6.760927e-01f, -7.368166e-01f, + 9.604305e-01f, 2.785197e-01f, 6.624158e-01f, -7.491364e-01f, + 9.587035e-01f, 2.844075e-01f, 6.485144e-01f, -7.612024e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.551412e-01f, 2.961509e-01f, 6.200572e-01f, -7.845566e-01f, + 9.533060e-01f, 3.020059e-01f, 6.055110e-01f, -7.958369e-01f, + 9.514350e-01f, 3.078496e-01f, 5.907597e-01f, -8.068476e-01f, + 9.495282e-01f, 3.136817e-01f, 5.758082e-01f, -8.175848e-01f, + 9.475856e-01f, 3.195020e-01f, 5.606616e-01f, -8.280450e-01f, + 9.456073e-01f, 3.253103e-01f, 5.453250e-01f, -8.382247e-01f, + 9.435935e-01f, 3.311063e-01f, 5.298036e-01f, -8.481203e-01f, + 9.415441e-01f, 3.368899e-01f, 5.141027e-01f, -8.577286e-01f, + 9.394592e-01f, 3.426607e-01f, 4.982277e-01f, -8.670462e-01f, + 9.373390e-01f, 3.484187e-01f, 4.821838e-01f, -8.760701e-01f, + 9.351835e-01f, 3.541635e-01f, 4.659765e-01f, -8.847971e-01f, + 9.329928e-01f, 3.598950e-01f, 4.496113e-01f, -8.932243e-01f, + 9.307670e-01f, 3.656130e-01f, 4.330938e-01f, -9.013488e-01f, + 9.285061e-01f, 3.713172e-01f, 4.164296e-01f, -9.091680e-01f, + 9.262102e-01f, 3.770074e-01f, 3.996242e-01f, -9.166791e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 9.215140e-01f, 3.883450e-01f, 3.656130e-01f, -9.307670e-01f, + 9.191139e-01f, 3.939920e-01f, 3.484187e-01f, -9.373390e-01f, + 9.166791e-01f, 3.996242e-01f, 3.311063e-01f, -9.435935e-01f, + 9.142098e-01f, 4.052413e-01f, 3.136817e-01f, -9.495282e-01f, + 9.117060e-01f, 4.108432e-01f, 2.961509e-01f, -9.551412e-01f, + 9.091680e-01f, 4.164296e-01f, 2.785197e-01f, -9.604305e-01f, + 9.065957e-01f, 4.220003e-01f, 2.607941e-01f, -9.653944e-01f, + 9.039893e-01f, 4.275551e-01f, 2.429802e-01f, -9.700313e-01f, + 9.013488e-01f, 4.330938e-01f, 2.250839e-01f, -9.743394e-01f, + 8.986745e-01f, 4.386162e-01f, 2.071114e-01f, -9.783174e-01f, + 8.959662e-01f, 4.441221e-01f, 1.890687e-01f, -9.819639e-01f, + 8.932243e-01f, 4.496113e-01f, 1.709619e-01f, -9.852776e-01f, + 8.904487e-01f, 4.550836e-01f, 1.527972e-01f, -9.882576e-01f, + 8.876396e-01f, 4.605387e-01f, 1.345807e-01f, -9.909026e-01f, + 8.847971e-01f, 4.659765e-01f, 1.163186e-01f, -9.932119e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.790122e-01f, 4.767992e-01f, 7.968244e-02f, -9.968203e-01f, + 8.760701e-01f, 4.821838e-01f, 6.132074e-02f, -9.981181e-01f, + 8.730950e-01f, 4.875502e-01f, 4.293826e-02f, -9.990777e-01f, + 8.700870e-01f, 4.928982e-01f, 2.454123e-02f, -9.996988e-01f, + 8.670462e-01f, 4.982277e-01f, 6.135885e-03f, -9.999812e-01f, + 8.639729e-01f, 5.035384e-01f, -1.227154e-02f, -9.999247e-01f, + 8.608669e-01f, 5.088301e-01f, -3.067480e-02f, -9.995294e-01f, + 8.577286e-01f, 5.141027e-01f, -4.906767e-02f, -9.987955e-01f, + 8.545580e-01f, 5.193560e-01f, -6.744392e-02f, -9.977231e-01f, + 8.513552e-01f, 5.245897e-01f, -8.579731e-02f, -9.963126e-01f, + 8.481203e-01f, 5.298036e-01f, -1.041216e-01f, -9.945646e-01f, + 8.448536e-01f, 5.349976e-01f, -1.224107e-01f, -9.924795e-01f, + 8.415550e-01f, 5.401715e-01f, -1.406582e-01f, -9.900582e-01f, + 8.382247e-01f, 5.453250e-01f, -1.588581e-01f, -9.873014e-01f, + 8.348629e-01f, 5.504580e-01f, -1.770042e-01f, -9.842101e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 8.280450e-01f, 5.606616e-01f, -2.131103e-01f, -9.770281e-01f, + 8.245893e-01f, 5.657318e-01f, -2.310581e-01f, -9.729400e-01f, + 8.211025e-01f, 5.707807e-01f, -2.489276e-01f, -9.685221e-01f, + 8.175848e-01f, 5.758082e-01f, -2.667128e-01f, -9.637761e-01f, + 8.140363e-01f, 5.808140e-01f, -2.844075e-01f, -9.587035e-01f, + 8.104572e-01f, 5.857979e-01f, -3.020059e-01f, -9.533060e-01f, + 8.068476e-01f, 5.907597e-01f, -3.195020e-01f, -9.475856e-01f, + 8.032075e-01f, 5.956993e-01f, -3.368899e-01f, -9.415441e-01f, + 7.995373e-01f, 6.006165e-01f, -3.541635e-01f, -9.351835e-01f, + 7.958369e-01f, 6.055110e-01f, -3.713172e-01f, -9.285061e-01f, + 7.921066e-01f, 6.103828e-01f, -3.883450e-01f, -9.215140e-01f, + 7.883464e-01f, 6.152316e-01f, -4.052413e-01f, -9.142098e-01f, + 7.845566e-01f, 6.200572e-01f, -4.220003e-01f, -9.065957e-01f, + 7.807372e-01f, 6.248595e-01f, -4.386162e-01f, -8.986745e-01f, + 7.768885e-01f, 6.296382e-01f, -4.550836e-01f, -8.904487e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 7.691033e-01f, 6.391244e-01f, -4.875502e-01f, -8.730950e-01f, + 7.651673e-01f, 6.438315e-01f, -5.035384e-01f, -8.639729e-01f, + 7.612024e-01f, 6.485144e-01f, -5.193560e-01f, -8.545580e-01f, + 7.572088e-01f, 6.531728e-01f, -5.349976e-01f, -8.448536e-01f, + 7.531868e-01f, 6.578067e-01f, -5.504580e-01f, -8.348629e-01f, + 7.491364e-01f, 6.624158e-01f, -5.657318e-01f, -8.245893e-01f, + 7.450578e-01f, 6.669999e-01f, -5.808140e-01f, -8.140363e-01f, + 7.409511e-01f, 6.715590e-01f, -5.956993e-01f, -8.032075e-01f, + 7.368166e-01f, 6.760927e-01f, -6.103828e-01f, -7.921066e-01f, + 7.326543e-01f, 6.806010e-01f, -6.248595e-01f, -7.807372e-01f, + 7.284644e-01f, 6.850837e-01f, -6.391244e-01f, -7.691033e-01f, + 7.242471e-01f, 6.895405e-01f, -6.531728e-01f, -7.572088e-01f, + 7.200025e-01f, 6.939715e-01f, -6.669999e-01f, -7.450578e-01f, + 7.157308e-01f, 6.983762e-01f, -6.806010e-01f, -7.326543e-01f, + 7.114322e-01f, 7.027547e-01f, -6.939715e-01f, -7.200025e-01f, + 1.000000e+00f, 7.071068e-01f, 5.000094e-01f, 5.000847e-01f, + 9.999247e-01f, 1.227154e-02f, 9.993224e-01f, -3.680722e-02f, + 9.996988e-01f, 2.454123e-02f, 9.972905e-01f, -7.356456e-02f, + 9.993224e-01f, 3.680722e-02f, 9.939070e-01f, -1.102222e-01f, + 9.987955e-01f, 4.906767e-02f, 9.891765e-01f, -1.467305e-01f, + 9.981181e-01f, 6.132074e-02f, 9.831055e-01f, -1.830399e-01f, + 9.972905e-01f, 7.356456e-02f, 9.757021e-01f, -2.191012e-01f, + 9.963126e-01f, 8.579731e-02f, 9.669765e-01f, -2.548657e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.939070e-01f, 1.102222e-01f, 9.456073e-01f, -3.253103e-01f, + 9.924795e-01f, 1.224107e-01f, 9.329928e-01f, -3.598950e-01f, + 9.909026e-01f, 1.345807e-01f, 9.191139e-01f, -3.939920e-01f, + 9.891765e-01f, 1.467305e-01f, 9.039893e-01f, -4.275551e-01f, + 9.873014e-01f, 1.588581e-01f, 8.876396e-01f, -4.605387e-01f, + 9.852776e-01f, 1.709619e-01f, 8.700870e-01f, -4.928982e-01f, + 9.831055e-01f, 1.830399e-01f, 8.513552e-01f, -5.245897e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.783174e-01f, 2.071114e-01f, 8.104572e-01f, -5.857979e-01f, + 9.757021e-01f, 2.191012e-01f, 7.883464e-01f, -6.152316e-01f, + 9.729400e-01f, 2.310581e-01f, 7.651673e-01f, -6.438315e-01f, + 9.700313e-01f, 2.429802e-01f, 7.409511e-01f, -6.715590e-01f, + 9.669765e-01f, 2.548657e-01f, 7.157308e-01f, -6.983762e-01f, + 9.637761e-01f, 2.667128e-01f, 6.895405e-01f, -7.242471e-01f, + 9.604305e-01f, 2.785197e-01f, 6.624158e-01f, -7.491364e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.533060e-01f, 3.020059e-01f, 6.055110e-01f, -7.958369e-01f, + 9.495282e-01f, 3.136817e-01f, 5.758082e-01f, -8.175848e-01f, + 9.456073e-01f, 3.253103e-01f, 5.453250e-01f, -8.382247e-01f, + 9.415441e-01f, 3.368899e-01f, 5.141027e-01f, -8.577286e-01f, + 9.373390e-01f, 3.484187e-01f, 4.821838e-01f, -8.760701e-01f, + 9.329928e-01f, 3.598950e-01f, 4.496113e-01f, -8.932243e-01f, + 9.285061e-01f, 3.713172e-01f, 4.164296e-01f, -9.091680e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 9.191139e-01f, 3.939920e-01f, 3.484187e-01f, -9.373390e-01f, + 9.142098e-01f, 4.052413e-01f, 3.136817e-01f, -9.495282e-01f, + 9.091680e-01f, 4.164296e-01f, 2.785197e-01f, -9.604305e-01f, + 9.039893e-01f, 4.275551e-01f, 2.429802e-01f, -9.700313e-01f, + 8.986745e-01f, 4.386162e-01f, 2.071114e-01f, -9.783174e-01f, + 8.932243e-01f, 4.496113e-01f, 1.709619e-01f, -9.852776e-01f, + 8.876396e-01f, 4.605387e-01f, 1.345807e-01f, -9.909026e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.760701e-01f, 4.821838e-01f, 6.132074e-02f, -9.981181e-01f, + 8.700870e-01f, 4.928982e-01f, 2.454123e-02f, -9.996988e-01f, + 8.639729e-01f, 5.035384e-01f, -1.227154e-02f, -9.999247e-01f, + 8.577286e-01f, 5.141027e-01f, -4.906767e-02f, -9.987955e-01f, + 8.513552e-01f, 5.245897e-01f, -8.579731e-02f, -9.963126e-01f, + 8.448536e-01f, 5.349976e-01f, -1.224107e-01f, -9.924795e-01f, + 8.382247e-01f, 5.453250e-01f, -1.588581e-01f, -9.873014e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 8.245893e-01f, 5.657318e-01f, -2.310581e-01f, -9.729400e-01f, + 8.175848e-01f, 5.758082e-01f, -2.667128e-01f, -9.637761e-01f, + 8.104572e-01f, 5.857979e-01f, -3.020059e-01f, -9.533060e-01f, + 8.032075e-01f, 5.956993e-01f, -3.368899e-01f, -9.415441e-01f, + 7.958369e-01f, 6.055110e-01f, -3.713172e-01f, -9.285061e-01f, + 7.883464e-01f, 6.152316e-01f, -4.052413e-01f, -9.142098e-01f, + 7.807372e-01f, 6.248595e-01f, -4.386162e-01f, -8.986745e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 7.651673e-01f, 6.438315e-01f, -5.035384e-01f, -8.639729e-01f, + 7.572088e-01f, 6.531728e-01f, -5.349976e-01f, -8.448536e-01f, + 7.491364e-01f, 6.624158e-01f, -5.657318e-01f, -8.245893e-01f, + 7.409511e-01f, 6.715590e-01f, -5.956993e-01f, -8.032075e-01f, + 7.326543e-01f, 6.806010e-01f, -6.248595e-01f, -7.807372e-01f, + 7.242471e-01f, 6.895405e-01f, -6.531728e-01f, -7.572088e-01f, + 7.157308e-01f, 6.983762e-01f, -6.806010e-01f, -7.326543e-01f, + 1.000000e+00f, 7.071068e-01f, 5.000377e-01f, 5.003390e-01f, + 9.996988e-01f, 2.454123e-02f, 9.972905e-01f, -7.356456e-02f, + 9.987955e-01f, 4.906767e-02f, 9.891765e-01f, -1.467305e-01f, + 9.972905e-01f, 7.356456e-02f, 9.757021e-01f, -2.191012e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.924795e-01f, 1.224107e-01f, 9.329928e-01f, -3.598950e-01f, + 9.891765e-01f, 1.467305e-01f, 9.039893e-01f, -4.275551e-01f, + 9.852776e-01f, 1.709619e-01f, 8.700870e-01f, -4.928982e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.757021e-01f, 2.191012e-01f, 7.883464e-01f, -6.152316e-01f, + 9.700313e-01f, 2.429802e-01f, 7.409511e-01f, -6.715590e-01f, + 9.637761e-01f, 2.667128e-01f, 6.895405e-01f, -7.242471e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.495282e-01f, 3.136817e-01f, 5.758082e-01f, -8.175848e-01f, + 9.415441e-01f, 3.368899e-01f, 5.141027e-01f, -8.577286e-01f, + 9.329928e-01f, 3.598950e-01f, 4.496113e-01f, -8.932243e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 9.142098e-01f, 4.052413e-01f, 3.136817e-01f, -9.495282e-01f, + 9.039893e-01f, 4.275551e-01f, 2.429802e-01f, -9.700313e-01f, + 8.932243e-01f, 4.496113e-01f, 1.709619e-01f, -9.852776e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.700870e-01f, 4.928982e-01f, 2.454123e-02f, -9.996988e-01f, + 8.577286e-01f, 5.141027e-01f, -4.906767e-02f, -9.987955e-01f, + 8.448536e-01f, 5.349976e-01f, -1.224107e-01f, -9.924795e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 8.175848e-01f, 5.758082e-01f, -2.667128e-01f, -9.637761e-01f, + 8.032075e-01f, 5.956993e-01f, -3.368899e-01f, -9.415441e-01f, + 7.883464e-01f, 6.152316e-01f, -4.052413e-01f, -9.142098e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 7.572088e-01f, 6.531728e-01f, -5.349976e-01f, -8.448536e-01f, + 7.409511e-01f, 6.715590e-01f, -5.956993e-01f, -8.032075e-01f, + 7.242471e-01f, 6.895405e-01f, -6.531728e-01f, -7.572088e-01f, + 1.000000e+00f, 7.071068e-01f, 5.001506e-01f, 5.013585e-01f, + 9.987955e-01f, 4.906767e-02f, 9.891765e-01f, -1.467305e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.891765e-01f, 1.467305e-01f, 9.039893e-01f, -4.275551e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.700313e-01f, 2.429802e-01f, 7.409511e-01f, -6.715590e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.415441e-01f, 3.368899e-01f, 5.141027e-01f, -8.577286e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 9.039893e-01f, 4.275551e-01f, 2.429802e-01f, -9.700313e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.577286e-01f, 5.141027e-01f, -4.906767e-02f, -9.987955e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 8.032075e-01f, 5.956993e-01f, -3.368899e-01f, -9.415441e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 7.409511e-01f, 6.715590e-01f, -5.956993e-01f, -8.032075e-01f, + 1.000000e+00f, 7.071068e-01f, 5.006030e-01f, 5.054710e-01f, + 9.951847e-01f, 9.801714e-02f, 9.569403e-01f, -2.902847e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.569403e-01f, 2.902847e-01f, 6.343933e-01f, -7.730105e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 8.819213e-01f, 4.713967e-01f, 9.801714e-02f, -9.951847e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 7.730105e-01f, 6.343933e-01f, -4.713967e-01f, -8.819213e-01f, + 1.000000e+00f, 7.071068e-01f, 5.024193e-01f, 5.224986e-01f, + 9.807853e-01f, 1.950903e-01f, 8.314696e-01f, -5.555702e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 8.314696e-01f, 5.555702e-01f, -1.950903e-01f, -9.807853e-01f, + 1.000000e+00f, 7.071068e-01f, 5.097956e-01f, 6.013449e-01f, + 9.238795e-01f, 3.826834e-01f, 3.826834e-01f, -9.238795e-01f, + 1.000000e+00f, 7.071068e-01f, 9.238795e-01f, 3.826834e-01f, + 1.000000e+00f, 7.071068e-01f, 0.000000e+00f, 0.000000e+00f, + 7.071068e-01f, 4.999994e-01f, 4.999976e-01f, 4.999947e-01f, + 4.999906e-01f, 4.999853e-01f, 4.999788e-01f, 4.999712e-01f, + 4.999624e-01f, 4.999524e-01f, 4.999412e-01f, 4.999288e-01f, + 4.999153e-01f, 4.999006e-01f, 4.998847e-01f, 4.998676e-01f, + 4.998494e-01f, 4.998300e-01f, 4.998094e-01f, 4.997876e-01f, + 4.997647e-01f, 4.997406e-01f, 4.997153e-01f, 4.996888e-01f, + 4.996612e-01f, 4.996324e-01f, 4.996024e-01f, 4.995712e-01f, + 4.995389e-01f, 4.995053e-01f, 4.994706e-01f, 4.994348e-01f, + 4.993977e-01f, 4.993595e-01f, 4.993201e-01f, 4.992795e-01f, + 4.992378e-01f, 4.991949e-01f, 4.991508e-01f, 4.991055e-01f, + 4.990591e-01f, 4.990114e-01f, 4.989626e-01f, 4.989127e-01f, + 4.988615e-01f, 4.988092e-01f, 4.987557e-01f, 4.987011e-01f, + 4.986452e-01f, 4.985882e-01f, 4.985300e-01f, 4.984707e-01f, + 4.984101e-01f, 4.983484e-01f, 4.982856e-01f, 4.982215e-01f, + 4.981563e-01f, 4.980899e-01f, 4.980224e-01f, 4.979536e-01f, + 4.978837e-01f, 4.978126e-01f, 4.977404e-01f, 4.976670e-01f, + 4.975924e-01f, 4.975166e-01f, 4.974397e-01f, 4.973616e-01f, + 4.972823e-01f, 4.972018e-01f, 4.971202e-01f, 4.970374e-01f, + 4.969535e-01f, 4.968684e-01f, 4.967821e-01f, 4.966946e-01f, + 4.966060e-01f, 4.965162e-01f, 4.964252e-01f, 4.963331e-01f, + 4.962398e-01f, 4.961453e-01f, 4.960497e-01f, 4.959529e-01f, + 4.958549e-01f, 4.957557e-01f, 4.956554e-01f, 4.955540e-01f, + 4.954513e-01f, 4.953475e-01f, 4.952425e-01f, 4.951364e-01f, + 4.950291e-01f, 4.949206e-01f, 4.948110e-01f, 4.947002e-01f, + 4.945883e-01f, 4.944751e-01f, 4.943608e-01f, 4.942454e-01f, + 4.941288e-01f, 4.940110e-01f, 4.938921e-01f, 4.937720e-01f, + 4.936507e-01f, 4.935283e-01f, 4.934047e-01f, 4.932800e-01f, + 4.931540e-01f, 4.930270e-01f, 4.928988e-01f, 4.927694e-01f, + 4.926388e-01f, 4.925071e-01f, 4.923743e-01f, 4.922402e-01f, + 4.921050e-01f, 4.919687e-01f, 4.918312e-01f, 4.916926e-01f, + 4.915527e-01f, 4.914118e-01f, 4.912697e-01f, 4.911264e-01f, + 4.909819e-01f, 4.908363e-01f, 4.906896e-01f, 4.905417e-01f, + 4.903926e-01f, 4.902424e-01f, 4.900911e-01f, 4.899386e-01f, + 4.897849e-01f, 4.896301e-01f, 4.894741e-01f, 4.893170e-01f, + 4.891587e-01f, 4.889993e-01f, 4.888387e-01f, 4.886770e-01f, + 4.885141e-01f, 4.883500e-01f, 4.881849e-01f, 4.880185e-01f, + 4.878511e-01f, 4.876824e-01f, 4.875127e-01f, 4.873418e-01f, + 4.871697e-01f, 4.869965e-01f, 4.868221e-01f, 4.866466e-01f, + 4.864700e-01f, 4.862922e-01f, 4.861132e-01f, 4.859332e-01f, + 4.857519e-01f, 4.855696e-01f, 4.853861e-01f, 4.852014e-01f, + 4.850156e-01f, 4.848287e-01f, 4.846406e-01f, 4.844514e-01f, + 4.842610e-01f, 4.840696e-01f, 4.838769e-01f, 4.836831e-01f, + 4.834882e-01f, 4.832922e-01f, 4.830950e-01f, 4.828967e-01f, + 4.826972e-01f, 4.824966e-01f, 4.822949e-01f, 4.820920e-01f, + 4.818880e-01f, 4.816829e-01f, 4.814766e-01f, 4.812692e-01f, + 4.810607e-01f, 4.808510e-01f, 4.806402e-01f, 4.804283e-01f, + 4.802153e-01f, 4.800011e-01f, 4.797858e-01f, 4.795693e-01f, + 4.793517e-01f, 4.791330e-01f, 4.789132e-01f, 4.786923e-01f, + 4.784702e-01f, 4.782470e-01f, 4.780226e-01f, 4.777972e-01f, + 4.775706e-01f, 4.773429e-01f, 4.771140e-01f, 4.768841e-01f, + 4.766530e-01f, 4.764208e-01f, 4.761875e-01f, 4.759531e-01f, + 4.757175e-01f, 4.754808e-01f, 4.752430e-01f, 4.750041e-01f, + 4.747641e-01f, 4.745229e-01f, 4.742807e-01f, 4.740373e-01f, + 4.737928e-01f, 4.735472e-01f, 4.733005e-01f, 4.730526e-01f, + 4.728037e-01f, 4.725536e-01f, 4.723024e-01f, 4.720501e-01f, + 4.717967e-01f, 4.715422e-01f, 4.712866e-01f, 4.710299e-01f, + 4.707720e-01f, 4.705131e-01f, 4.702530e-01f, 4.699919e-01f, + 4.697296e-01f, 4.694662e-01f, 4.692018e-01f, 4.689362e-01f, + 4.686695e-01f, 4.684017e-01f, 4.681328e-01f, 4.678628e-01f, + 4.675918e-01f, 4.673196e-01f, 4.670463e-01f, 4.667719e-01f, + 4.664964e-01f, 4.662198e-01f, 4.659421e-01f, 4.656634e-01f, + 4.653835e-01f, 4.651025e-01f, 4.648204e-01f, 4.645373e-01f, + 4.642530e-01f, 4.639677e-01f, 4.636813e-01f, 4.633937e-01f, + 4.631051e-01f, 4.628154e-01f, 4.625246e-01f, 4.622327e-01f, + 4.619398e-01f, 4.616457e-01f, 4.613506e-01f, 4.610543e-01f, + 4.607570e-01f, 4.604586e-01f, 4.601591e-01f, 4.598586e-01f, + 4.595569e-01f, 4.592542e-01f, 4.589504e-01f, 4.586455e-01f, + 4.583395e-01f, 4.580325e-01f, 4.577244e-01f, 4.574152e-01f, + 4.571049e-01f, 4.567935e-01f, 4.564811e-01f, 4.561676e-01f, + 4.558530e-01f, 4.555374e-01f, 4.552206e-01f, 4.549029e-01f, + 4.545840e-01f, 4.542641e-01f, 4.539431e-01f, 4.536210e-01f, + 4.532979e-01f, 4.529736e-01f, 4.526484e-01f, 4.523220e-01f, + 4.519946e-01f, 4.516662e-01f, 4.513367e-01f, 4.510061e-01f, + 4.506744e-01f, 4.503417e-01f, 4.500079e-01f, 4.496731e-01f, + 4.493372e-01f, 4.490003e-01f, 4.486623e-01f, 4.483232e-01f, + 4.479831e-01f, 4.476420e-01f, 4.472997e-01f, 4.469565e-01f, + 4.466122e-01f, 4.462668e-01f, 4.459204e-01f, 4.455729e-01f, + 4.452244e-01f, 4.448748e-01f, 4.445242e-01f, 4.441725e-01f, + 4.438198e-01f, 4.434661e-01f, 4.431113e-01f, 4.427554e-01f, + 4.423985e-01f, 4.420406e-01f, 4.416817e-01f, 4.413217e-01f, + 4.409606e-01f, 4.405986e-01f, 4.402354e-01f, 4.398713e-01f, + 4.395061e-01f, 4.391399e-01f, 4.387726e-01f, 4.384044e-01f, + 4.380350e-01f, 4.376647e-01f, 4.372933e-01f, 4.369209e-01f, + 4.365475e-01f, 4.361730e-01f, 4.357975e-01f, 4.354210e-01f, + 4.350435e-01f, 4.346649e-01f, 4.342854e-01f, 4.339047e-01f, + 4.335231e-01f, 4.331405e-01f, 4.327568e-01f, 4.323721e-01f, + 4.319864e-01f, 4.315997e-01f, 4.312120e-01f, 4.308232e-01f, + 4.304335e-01f, 4.300427e-01f, 4.296509e-01f, 4.292581e-01f, + 4.288643e-01f, 4.284695e-01f, 4.280737e-01f, 4.276768e-01f, + 4.272790e-01f, 4.268802e-01f, 4.264803e-01f, 4.260795e-01f, + 4.256776e-01f, 4.252747e-01f, 4.248709e-01f, 4.244660e-01f, + 4.240602e-01f, 4.236533e-01f, 4.232455e-01f, 4.228366e-01f, + 4.224268e-01f, 4.220159e-01f, 4.216041e-01f, 4.211913e-01f, + 4.207775e-01f, 4.203627e-01f, 4.199469e-01f, 4.195301e-01f, + 4.191124e-01f, 4.186936e-01f, 4.182739e-01f, 4.178531e-01f, + 4.174314e-01f, 4.170088e-01f, 4.165851e-01f, 4.161604e-01f, + 4.157348e-01f, 4.153082e-01f, 4.148806e-01f, 4.144521e-01f, + 4.140225e-01f, 4.135920e-01f, 4.131605e-01f, 4.127281e-01f, + 4.122947e-01f, 4.118603e-01f, 4.114249e-01f, 4.109886e-01f, + 4.105513e-01f, 4.101130e-01f, 4.096738e-01f, 4.092336e-01f, + 4.087924e-01f, 4.083503e-01f, 4.079072e-01f, 4.074632e-01f, + 4.070182e-01f, 4.065722e-01f, 4.061253e-01f, 4.056774e-01f, + 4.052286e-01f, 4.047788e-01f, 4.043281e-01f, 4.038764e-01f, + 4.034238e-01f, 4.029702e-01f, 4.025157e-01f, 4.020602e-01f, + 4.016038e-01f, 4.011464e-01f, 4.006881e-01f, 4.002288e-01f, + 3.997686e-01f, 3.993075e-01f, 3.988454e-01f, 3.983824e-01f, + 3.979185e-01f, 3.974536e-01f, 3.969877e-01f, 3.965210e-01f, + 3.960533e-01f, 3.955847e-01f, 3.951151e-01f, 3.946446e-01f, + 3.941732e-01f, 3.937009e-01f, 3.932276e-01f, 3.927534e-01f, + 3.922783e-01f, 3.918023e-01f, 3.913253e-01f, 3.908474e-01f, + 3.903686e-01f, 3.898889e-01f, 3.894083e-01f, 3.889267e-01f, + 3.884442e-01f, 3.879608e-01f, 3.874766e-01f, 3.869913e-01f, + 3.865052e-01f, 3.860182e-01f, 3.855303e-01f, 3.850414e-01f, + 3.845517e-01f, 3.840610e-01f, 3.835695e-01f, 3.830770e-01f, + 3.825836e-01f, 3.820894e-01f, 3.815942e-01f, 3.810981e-01f, + 3.806012e-01f, 3.801033e-01f, 3.796046e-01f, 3.791050e-01f, + 3.786044e-01f, 3.781030e-01f, 3.776007e-01f, 3.770975e-01f, + 3.765934e-01f, 3.760884e-01f, 3.755826e-01f, 3.750758e-01f, + 3.745682e-01f, 3.740597e-01f, 3.735503e-01f, 3.730400e-01f, + 3.725289e-01f, 3.720169e-01f, 3.715040e-01f, 3.709902e-01f, + 3.704756e-01f, 3.699600e-01f, 3.694437e-01f, 3.689264e-01f, + 3.684083e-01f, 3.678893e-01f, 3.673694e-01f, 3.668487e-01f, + 3.663271e-01f, 3.658047e-01f, 3.652814e-01f, 3.647572e-01f, + 3.642322e-01f, 3.637063e-01f, 3.631796e-01f, 3.626520e-01f, + 3.621235e-01f, 3.615942e-01f, 3.610641e-01f, 3.605331e-01f, + 3.600013e-01f, 3.594686e-01f, 3.589350e-01f, 3.584006e-01f, + 3.578654e-01f, 3.573293e-01f, 3.567924e-01f, 3.562547e-01f, + 3.557161e-01f, 3.551767e-01f, 3.546364e-01f, 3.540953e-01f, + 3.535534e-01f, 3.530106e-01f, 3.524670e-01f, 3.519226e-01f, + 3.513774e-01f, 3.508313e-01f, 3.502844e-01f, 3.497367e-01f, + 3.491881e-01f, 3.486388e-01f, 3.480886e-01f, 3.475376e-01f, + 3.469857e-01f, 3.464331e-01f, 3.458796e-01f, 3.453254e-01f, + 3.447703e-01f, 3.442144e-01f, 3.436577e-01f, 3.431002e-01f, + 3.425418e-01f, 3.419827e-01f, 3.414228e-01f, 3.408620e-01f, + 3.403005e-01f, 3.397382e-01f, 3.391750e-01f, 3.386111e-01f, + 3.380464e-01f, 3.374808e-01f, 3.369145e-01f, 3.363474e-01f, + 3.357795e-01f, 3.352108e-01f, 3.346413e-01f, 3.340710e-01f, + 3.335000e-01f, 3.329281e-01f, 3.323555e-01f, 3.317821e-01f, + 3.312079e-01f, 3.306329e-01f, 3.300572e-01f, 3.294806e-01f, + 3.289033e-01f, 3.283253e-01f, 3.277464e-01f, 3.271668e-01f, + 3.265864e-01f, 3.260053e-01f, 3.254233e-01f, 3.248407e-01f, + 3.242572e-01f, 3.236730e-01f, 3.230880e-01f, 3.225023e-01f, + 3.219158e-01f, 3.213285e-01f, 3.207405e-01f, 3.201517e-01f, + 3.195622e-01f, 3.189720e-01f, 3.183809e-01f, 3.177892e-01f, + 3.171966e-01f, 3.166034e-01f, 3.160094e-01f, 3.154146e-01f, + 3.148191e-01f, 3.142229e-01f, 3.136259e-01f, 3.130282e-01f, + 3.124297e-01f, 3.118306e-01f, 3.112306e-01f, 3.106300e-01f, + 3.100286e-01f, 3.094265e-01f, 3.088237e-01f, 3.082201e-01f, + 3.076158e-01f, 3.070108e-01f, 3.064050e-01f, 3.057986e-01f, + 3.051914e-01f, 3.045835e-01f, 3.039749e-01f, 3.033656e-01f, + 3.027555e-01f, 3.021448e-01f, 3.015333e-01f, 3.009211e-01f, + 3.003082e-01f, 2.996946e-01f, 2.990804e-01f, 2.984654e-01f, + 2.978497e-01f, 2.972332e-01f, 2.966161e-01f, 2.959983e-01f, + 2.953799e-01f, 2.947607e-01f, 2.941408e-01f, 2.935202e-01f, + 2.928989e-01f, 2.922770e-01f, 2.916543e-01f, 2.910310e-01f, + 2.904070e-01f, 2.897823e-01f, 2.891569e-01f, 2.885308e-01f, + 2.879041e-01f, 2.872767e-01f, 2.866486e-01f, 2.860198e-01f, + 2.853904e-01f, 2.847603e-01f, 2.841295e-01f, 2.834980e-01f, + 2.828659e-01f, 2.822331e-01f, 2.815997e-01f, 2.809656e-01f, + 2.803308e-01f, 2.796954e-01f, 2.790593e-01f, 2.784225e-01f, + 2.777851e-01f, 2.771471e-01f, 2.765084e-01f, 2.758690e-01f, + 2.752290e-01f, 2.745883e-01f, 2.739470e-01f, 2.733051e-01f, + 2.726625e-01f, 2.720193e-01f, 2.713754e-01f, 2.707309e-01f, + 2.700857e-01f, 2.694400e-01f, 2.687935e-01f, 2.681465e-01f, + 2.674988e-01f, 2.668505e-01f, 2.662016e-01f, 2.655520e-01f, + 2.649018e-01f, 2.642510e-01f, 2.635996e-01f, 2.629475e-01f, + 2.622948e-01f, 2.616416e-01f, 2.609876e-01f, 2.603331e-01f, + 2.596780e-01f, 2.590223e-01f, 2.583659e-01f, 2.577089e-01f, + 2.570514e-01f, 2.563932e-01f, 2.557344e-01f, 2.550750e-01f, + 2.544151e-01f, 2.537545e-01f, 2.530933e-01f, 2.524316e-01f, + 2.517692e-01f, 2.511062e-01f, 2.504427e-01f, 2.497786e-01f, + 2.491138e-01f, 2.484485e-01f, 2.477826e-01f, 2.471162e-01f, + 2.464491e-01f, 2.457815e-01f, 2.451132e-01f, 2.444444e-01f, + 2.437751e-01f, 2.431051e-01f, 2.424346e-01f, 2.417635e-01f, + 2.410919e-01f, 2.404197e-01f, 2.397469e-01f, 2.390735e-01f, + 2.383996e-01f, 2.377251e-01f, 2.370501e-01f, 2.363745e-01f, + 2.356984e-01f, 2.350217e-01f, 2.343444e-01f, 2.336666e-01f, + 2.329882e-01f, 2.323093e-01f, 2.316299e-01f, 2.309499e-01f, + 2.302694e-01f, 2.295883e-01f, 2.289067e-01f, 2.282245e-01f, + 2.275418e-01f, 2.268586e-01f, 2.261748e-01f, 2.254905e-01f, + 2.248057e-01f, 2.241203e-01f, 2.234344e-01f, 2.227480e-01f, + 2.220611e-01f, 2.213736e-01f, 2.206856e-01f, 2.199971e-01f, + 2.193081e-01f, 2.186186e-01f, 2.179285e-01f, 2.172380e-01f, + 2.165469e-01f, 2.158553e-01f, 2.151632e-01f, 2.144706e-01f, + 2.137775e-01f, 2.130839e-01f, 2.123898e-01f, 2.116952e-01f, + 2.110001e-01f, 2.103045e-01f, 2.096084e-01f, 2.089119e-01f, + 2.082148e-01f, 2.075172e-01f, 2.068192e-01f, 2.061206e-01f, + 2.054216e-01f, 2.047221e-01f, 2.040221e-01f, 2.033216e-01f, + 2.026207e-01f, 2.019192e-01f, 2.012173e-01f, 2.005149e-01f, + 1.998121e-01f, 1.991088e-01f, 1.984050e-01f, 1.977007e-01f, + 1.969960e-01f, 1.962908e-01f, 1.955852e-01f, 1.948791e-01f, + 1.941725e-01f, 1.934655e-01f, 1.927580e-01f, 1.920501e-01f, + 1.913417e-01f, 1.906329e-01f, 1.899236e-01f, 1.892139e-01f, + 1.885037e-01f, 1.877931e-01f, 1.870820e-01f, 1.863705e-01f, + 1.856586e-01f, 1.849462e-01f, 1.842334e-01f, 1.835202e-01f, + 1.828065e-01f, 1.820924e-01f, 1.813779e-01f, 1.806629e-01f, + 1.799475e-01f, 1.792317e-01f, 1.785155e-01f, 1.777988e-01f, + 1.770818e-01f, 1.763643e-01f, 1.756464e-01f, 1.749281e-01f, + 1.742093e-01f, 1.734902e-01f, 1.727707e-01f, 1.720507e-01f, + 1.713304e-01f, 1.706096e-01f, 1.698884e-01f, 1.691669e-01f, + 1.684449e-01f, 1.677226e-01f, 1.669998e-01f, 1.662767e-01f, + 1.655532e-01f, 1.648292e-01f, 1.641049e-01f, 1.633802e-01f, + 1.626551e-01f, 1.619297e-01f, 1.612038e-01f, 1.604776e-01f, + 1.597510e-01f, 1.590240e-01f, 1.582967e-01f, 1.575690e-01f, + 1.568409e-01f, 1.561124e-01f, 1.553836e-01f, 1.546544e-01f, + 1.539248e-01f, 1.531949e-01f, 1.524646e-01f, 1.517340e-01f, + 1.510030e-01f, 1.502716e-01f, 1.495399e-01f, 1.488079e-01f, + 1.480754e-01f, 1.473427e-01f, 1.466096e-01f, 1.458761e-01f, + 1.451423e-01f, 1.444082e-01f, 1.436737e-01f, 1.429389e-01f, + 1.422038e-01f, 1.414683e-01f, 1.407325e-01f, 1.399963e-01f, + 1.392598e-01f, 1.385230e-01f, 1.377859e-01f, 1.370485e-01f, + 1.363107e-01f, 1.355726e-01f, 1.348342e-01f, 1.340954e-01f, + 1.333564e-01f, 1.326170e-01f, 1.318773e-01f, 1.311374e-01f, + 1.303971e-01f, 1.296565e-01f, 1.289156e-01f, 1.281743e-01f, + 1.274328e-01f, 1.266910e-01f, 1.259489e-01f, 1.252065e-01f, + 1.244638e-01f, 1.237208e-01f, 1.229775e-01f, 1.222340e-01f, + 1.214901e-01f, 1.207459e-01f, 1.200015e-01f, 1.192568e-01f, + 1.185118e-01f, 1.177665e-01f, 1.170210e-01f, 1.162752e-01f, + 1.155291e-01f, 1.147827e-01f, 1.140360e-01f, 1.132891e-01f, + 1.125420e-01f, 1.117945e-01f, 1.110468e-01f, 1.102988e-01f, + 1.095506e-01f, 1.088021e-01f, 1.080534e-01f, 1.073044e-01f, + 1.065552e-01f, 1.058057e-01f, 1.050559e-01f, 1.043059e-01f, + 1.035557e-01f, 1.028052e-01f, 1.020545e-01f, 1.013035e-01f, + 1.005523e-01f, 9.980088e-02f, 9.904921e-02f, 9.829730e-02f, + 9.754516e-02f, 9.679279e-02f, 9.604020e-02f, 9.528738e-02f, + 9.453433e-02f, 9.378106e-02f, 9.302758e-02f, 9.227387e-02f, + 9.151994e-02f, 9.076580e-02f, 9.001145e-02f, 8.925689e-02f, + 8.850211e-02f, 8.774713e-02f, 8.699194e-02f, 8.623654e-02f, + 8.548094e-02f, 8.472515e-02f, 8.396915e-02f, 8.321295e-02f, + 8.245656e-02f, 8.169997e-02f, 8.094320e-02f, 8.018623e-02f, + 7.942907e-02f, 7.867173e-02f, 7.791420e-02f, 7.715649e-02f, + 7.639859e-02f, 7.564052e-02f, 7.488227e-02f, 7.412384e-02f, + 7.336524e-02f, 7.260646e-02f, 7.184752e-02f, 7.108840e-02f, + 7.032912e-02f, 6.956967e-02f, 6.881006e-02f, 6.805029e-02f, + 6.729035e-02f, 6.653026e-02f, 6.577001e-02f, 6.500961e-02f, + 6.424906e-02f, 6.348835e-02f, 6.272749e-02f, 6.196649e-02f, + 6.120534e-02f, 6.044404e-02f, 5.968261e-02f, 5.892103e-02f, + 5.815932e-02f, 5.739746e-02f, 5.663548e-02f, 5.587336e-02f, + 5.511110e-02f, 5.434872e-02f, 5.358621e-02f, 5.282358e-02f, + 5.206082e-02f, 5.129793e-02f, 5.053493e-02f, 4.977181e-02f, + 4.900857e-02f, 4.824522e-02f, 4.748175e-02f, 4.671817e-02f, + 4.595448e-02f, 4.519068e-02f, 4.442678e-02f, 4.366277e-02f, + 4.289866e-02f, 4.213444e-02f, 4.137013e-02f, 4.060572e-02f, + 3.984122e-02f, 3.907662e-02f, 3.831193e-02f, 3.754715e-02f, + 3.678228e-02f, 3.601733e-02f, 3.525229e-02f, 3.448716e-02f, + 3.372196e-02f, 3.295668e-02f, 3.219132e-02f, 3.142588e-02f, + 3.066037e-02f, 2.989479e-02f, 2.912913e-02f, 2.836341e-02f, + 2.759762e-02f, 2.683177e-02f, 2.606585e-02f, 2.529987e-02f, + 2.453384e-02f, 2.376774e-02f, 2.300159e-02f, 2.223539e-02f, + 2.146913e-02f, 2.070282e-02f, 1.993646e-02f, 1.917006e-02f, + 1.840361e-02f, 1.763712e-02f, 1.687059e-02f, 1.610401e-02f, + 1.533740e-02f, 1.457075e-02f, 1.380407e-02f, 1.303736e-02f, + 1.227061e-02f, 1.150384e-02f, 1.073704e-02f, 9.970214e-03f, + 9.203365e-03f, 8.436494e-03f, 7.669603e-03f, 6.902694e-03f, + 6.135769e-03f, 5.368830e-03f, 4.601877e-03f, 3.834914e-03f, + 3.067942e-03f, 2.300963e-03f, 1.533978e-03f, 7.669901e-04f}; + +// ========================================================================================== +// internal tools +// ========================================================================================== +static void AUP_FFTW_cftleaf(int n, int isplt, float* a, int nw, float* w); +static void AUP_FFTW_cftf1st(int n, float* a, float* w); +static void AUP_FFTW_cftrec4(int n, float* a, int nw, float* w); +static void AUP_FFTW_cftfsub(int n, float* a, int* ip, int nw, float* w); +static void AUP_FFTW_cftbsub(int n, float* a, int* ip, int nw, float* w); +static void AUP_FFTW_bitrv2(int n, int* ip, float* a); +static void AUP_FFTW_bitrv2conj(int n, int* ip, float* a); +static void AUP_FFTW_bitrv216(float* a); +static void AUP_FFTW_bitrv216neg(float* a); +static void AUP_FFTW_bitrv208(float* a); +static void AUP_FFTW_bitrv208neg(float* a); +static void AUP_FFTW_cftb1st(int n, float* a, float* w); +static int AUP_FFTW_cfttree(int n, int j, int k, float* a, int nw, float* w); +static void AUP_FFTW_cftmdl1(int n, float* a, float* w); +static void AUP_FFTW_cftmdl2(int n, float* a, float* w); +static void AUP_FFTW_cftfx41(int n, float* a, int nw, float* w); +static void AUP_FFTW_cftf161(float* a, float* w); +static void AUP_FFTW_cftf162(float* a, float* w); +static void AUP_FFTW_cftf081(float* a, float* w); +static void AUP_FFTW_cftf082(float* a, float* w); +static void AUP_FFTW_cftf040(float* a); +static void AUP_FFTW_cftb040(float* a); +static void AUP_FFTW_cftx020(float* a); +static void AUP_FFTW_rftfsub(int n, float* a, int nc, float* c); +static void AUP_FFTW_rftbsub(int n, float* a, int nc, float* c); +static void AUP_FFTW_dctsub(int n, float* a, int nc, float* c); +static void AUP_FFTW_dstsub(int n, float* a, int nc, float* c); +static void AUP_FFTW_rdft(int n, int isgn, float* a, int* ip, float* w); + +static void AUP_FFTW_cftleaf(int n, int isplt, float* a, int nw, float* w) { + if (n == 512) { + AUP_FFTW_cftmdl1(128, a, &w[nw - 64]); + AUP_FFTW_cftf161(a, &w[nw - 8]); + AUP_FFTW_cftf162(&a[32], &w[nw - 32]); + AUP_FFTW_cftf161(&a[64], &w[nw - 8]); + AUP_FFTW_cftf161(&a[96], &w[nw - 8]); + AUP_FFTW_cftmdl2(128, &a[128], &w[nw - 128]); + AUP_FFTW_cftf161(&a[128], &w[nw - 8]); + AUP_FFTW_cftf162(&a[160], &w[nw - 32]); + AUP_FFTW_cftf161(&a[192], &w[nw - 8]); + AUP_FFTW_cftf162(&a[224], &w[nw - 32]); + AUP_FFTW_cftmdl1(128, &a[256], &w[nw - 64]); + AUP_FFTW_cftf161(&a[256], &w[nw - 8]); + AUP_FFTW_cftf162(&a[288], &w[nw - 32]); + AUP_FFTW_cftf161(&a[320], &w[nw - 8]); + AUP_FFTW_cftf161(&a[352], &w[nw - 8]); + if (isplt != 0) { + AUP_FFTW_cftmdl1(128, &a[384], &w[nw - 64]); + AUP_FFTW_cftf161(&a[480], &w[nw - 8]); + } else { + AUP_FFTW_cftmdl2(128, &a[384], &w[nw - 128]); + AUP_FFTW_cftf162(&a[480], &w[nw - 32]); + } + AUP_FFTW_cftf161(&a[384], &w[nw - 8]); + AUP_FFTW_cftf162(&a[416], &w[nw - 32]); + AUP_FFTW_cftf161(&a[448], &w[nw - 8]); + } else { + AUP_FFTW_cftmdl1(64, a, &w[nw - 32]); + AUP_FFTW_cftf081(a, &w[nw - 8]); + AUP_FFTW_cftf082(&a[16], &w[nw - 8]); + AUP_FFTW_cftf081(&a[32], &w[nw - 8]); + AUP_FFTW_cftf081(&a[48], &w[nw - 8]); + AUP_FFTW_cftmdl2(64, &a[64], &w[nw - 64]); + AUP_FFTW_cftf081(&a[64], &w[nw - 8]); + AUP_FFTW_cftf082(&a[80], &w[nw - 8]); + AUP_FFTW_cftf081(&a[96], &w[nw - 8]); + AUP_FFTW_cftf082(&a[112], &w[nw - 8]); + AUP_FFTW_cftmdl1(64, &a[128], &w[nw - 32]); + AUP_FFTW_cftf081(&a[128], &w[nw - 8]); + AUP_FFTW_cftf082(&a[144], &w[nw - 8]); + AUP_FFTW_cftf081(&a[160], &w[nw - 8]); + AUP_FFTW_cftf081(&a[176], &w[nw - 8]); + if (isplt != 0) { + AUP_FFTW_cftmdl1(64, &a[192], &w[nw - 32]); + AUP_FFTW_cftf081(&a[240], &w[nw - 8]); + } else { + AUP_FFTW_cftmdl2(64, &a[192], &w[nw - 64]); + AUP_FFTW_cftf082(&a[240], &w[nw - 8]); + } + AUP_FFTW_cftf081(&a[192], &w[nw - 8]); + AUP_FFTW_cftf082(&a[208], &w[nw - 8]); + AUP_FFTW_cftf081(&a[224], &w[nw - 8]); + } +} + +static void AUP_FFTW_cftf1st(int n, float* a, float* w) { + int j, j0, j1, j2, j3, k, m, mh; + float wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i; + float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, y2i, + y3r, y3i; + + mh = n >> 3; + m = 2 * mh; + j1 = m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[0] + a[j2]; + x0i = a[1] + a[j2 + 1]; + x1r = a[0] - a[j2]; + x1i = a[1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + a[j2] = x1r - x3i; + a[j2 + 1] = x1i + x3r; + a[j3] = x1r + x3i; + a[j3 + 1] = x1i - x3r; + wn4r = w[1]; + csc1 = w[2]; + csc3 = w[3]; + wd1r = 1; + wd1i = 0; + wd3r = 1; + wd3i = 0; + k = 0; + for (j = 2; j < mh - 2; j += 4) { + k += 4; + wk1r = csc1 * (wd1r + w[k]); + wk1i = csc1 * (wd1i + w[k + 1]); + wk3r = csc3 * (wd3r + w[k + 2]); + wk3i = csc3 * (wd3i + w[k + 3]); + wd1r = w[k]; + wd1i = w[k + 1]; + wd3r = w[k + 2]; + wd3i = w[k + 3]; + j1 = j + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j] + a[j2]; + x0i = a[j + 1] + a[j2 + 1]; + x1r = a[j] - a[j2]; + x1i = a[j + 1] - a[j2 + 1]; + y0r = a[j + 2] + a[j2 + 2]; + y0i = a[j + 3] + a[j2 + 3]; + y1r = a[j + 2] - a[j2 + 2]; + y1i = a[j + 3] - a[j2 + 3]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + y2r = a[j1 + 2] + a[j3 + 2]; + y2i = a[j1 + 3] + a[j3 + 3]; + y3r = a[j1 + 2] - a[j3 + 2]; + y3i = a[j1 + 3] - a[j3 + 3]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + a[j + 2] = y0r + y2r; + a[j + 3] = y0i + y2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + a[j1 + 2] = y0r - y2r; + a[j1 + 3] = y0i - y2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wk1r * x0r - wk1i * x0i; + a[j2 + 1] = wk1r * x0i + wk1i * x0r; + x0r = y1r - y3i; + x0i = y1i + y3r; + a[j2 + 2] = wd1r * x0r - wd1i * x0i; + a[j2 + 3] = wd1r * x0i + wd1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3r * x0r + wk3i * x0i; + a[j3 + 1] = wk3r * x0i - wk3i * x0r; + x0r = y1r + y3i; + x0i = y1i - y3r; + a[j3 + 2] = wd3r * x0r + wd3i * x0i; + a[j3 + 3] = wd3r * x0i - wd3i * x0r; + j0 = m - j; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] + a[j2]; + x0i = a[j0 + 1] + a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = a[j0 + 1] - a[j2 + 1]; + y0r = a[j0 - 2] + a[j2 - 2]; + y0i = a[j0 - 1] + a[j2 - 1]; + y1r = a[j0 - 2] - a[j2 - 2]; + y1i = a[j0 - 1] - a[j2 - 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + y2r = a[j1 - 2] + a[j3 - 2]; + y2i = a[j1 - 1] + a[j3 - 1]; + y3r = a[j1 - 2] - a[j3 - 2]; + y3i = a[j1 - 1] - a[j3 - 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i + x2i; + a[j0 - 2] = y0r + y2r; + a[j0 - 1] = y0i + y2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + a[j1 - 2] = y0r - y2r; + a[j1 - 1] = y0i - y2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wk1i * x0r - wk1r * x0i; + a[j2 + 1] = wk1i * x0i + wk1r * x0r; + x0r = y1r - y3i; + x0i = y1i + y3r; + a[j2 - 2] = wd1i * x0r - wd1r * x0i; + a[j2 - 1] = wd1i * x0i + wd1r * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3i * x0r + wk3r * x0i; + a[j3 + 1] = wk3i * x0i - wk3r * x0r; + x0r = y1r + y3i; + x0i = y1i - y3r; + a[j3 - 2] = wd3i * x0r + wd3r * x0i; + a[j3 - 1] = wd3i * x0i - wd3r * x0r; + } + wk1r = csc1 * (wd1r + wn4r); + wk1i = csc1 * (wd1i + wn4r); + wk3r = csc3 * (wd3r - wn4r); + wk3i = csc3 * (wd3i - wn4r); + j0 = mh; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0 - 2] + a[j2 - 2]; + x0i = a[j0 - 1] + a[j2 - 1]; + x1r = a[j0 - 2] - a[j2 - 2]; + x1i = a[j0 - 1] - a[j2 - 1]; + x2r = a[j1 - 2] + a[j3 - 2]; + x2i = a[j1 - 1] + a[j3 - 1]; + x3r = a[j1 - 2] - a[j3 - 2]; + x3i = a[j1 - 1] - a[j3 - 1]; + a[j0 - 2] = x0r + x2r; + a[j0 - 1] = x0i + x2i; + a[j1 - 2] = x0r - x2r; + a[j1 - 1] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2 - 2] = wk1r * x0r - wk1i * x0i; + a[j2 - 1] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3 - 2] = wk3r * x0r + wk3i * x0i; + a[j3 - 1] = wk3r * x0i - wk3i * x0r; + x0r = a[j0] + a[j2]; + x0i = a[j0 + 1] + a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = a[j0 + 1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wn4r * (x0r - x0i); + a[j2 + 1] = wn4r * (x0i + x0r); + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = -wn4r * (x0r + x0i); + a[j3 + 1] = -wn4r * (x0i - x0r); + x0r = a[j0 + 2] + a[j2 + 2]; + x0i = a[j0 + 3] + a[j2 + 3]; + x1r = a[j0 + 2] - a[j2 + 2]; + x1i = a[j0 + 3] - a[j2 + 3]; + x2r = a[j1 + 2] + a[j3 + 2]; + x2i = a[j1 + 3] + a[j3 + 3]; + x3r = a[j1 + 2] - a[j3 + 2]; + x3i = a[j1 + 3] - a[j3 + 3]; + a[j0 + 2] = x0r + x2r; + a[j0 + 3] = x0i + x2i; + a[j1 + 2] = x0r - x2r; + a[j1 + 3] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2 + 2] = wk1i * x0r - wk1r * x0i; + a[j2 + 3] = wk1i * x0i + wk1r * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3 + 2] = wk3i * x0r + wk3r * x0i; + a[j3 + 3] = wk3i * x0i - wk3r * x0r; +} + +static void AUP_FFTW_cftrec4(int n, float* a, int nw, float* w) { + int isplt, j, k, m; + + m = n; + while (m > 512) { + m >>= 2; + AUP_FFTW_cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]); + } + AUP_FFTW_cftleaf(m, 1, &a[n - m], nw, w); + k = 0; + for (j = n - m; j > 0; j -= m) { + k++; + isplt = AUP_FFTW_cfttree(m, j, k, a, nw, w); + AUP_FFTW_cftleaf(m, isplt, &a[j - m], nw, w); + } +} + +static void AUP_FFTW_cftfsub(int n, float* a, int* ip, int nw, float* w) { + if (n > 8) { + if (n > 32) { + AUP_FFTW_cftf1st(n, a, &w[nw - (n >> 2)]); + if (n > 512) { + AUP_FFTW_cftrec4(n, a, nw, w); + } else if (n > 128) { + AUP_FFTW_cftleaf(n, 1, a, nw, w); + } else { + AUP_FFTW_cftfx41(n, a, nw, w); + } + AUP_FFTW_bitrv2(n, ip, a); + } else if (n == 32) { + AUP_FFTW_cftf161(a, &w[nw - 8]); + AUP_FFTW_bitrv216(a); + } else { + AUP_FFTW_cftf081(a, w); + AUP_FFTW_bitrv208(a); + } + } else if (n == 8) { + AUP_FFTW_cftf040(a); + } else if (n == 4) { + AUP_FFTW_cftx020(a); + } +} + +static void AUP_FFTW_cftbsub(int n, float* a, int* ip, int nw, float* w) { + if (n > 8) { + if (n > 32) { + AUP_FFTW_cftb1st(n, a, &w[nw - (n >> 2)]); + if (n > 512) { + AUP_FFTW_cftrec4(n, a, nw, w); + } else if (n > 128) { + AUP_FFTW_cftleaf(n, 1, a, nw, w); + } else { + AUP_FFTW_cftfx41(n, a, nw, w); + } + AUP_FFTW_bitrv2conj(n, ip, a); + } else if (n == 32) { + AUP_FFTW_cftf161(a, &w[nw - 8]); + AUP_FFTW_bitrv216neg(a); + } else { + AUP_FFTW_cftf081(a, w); + AUP_FFTW_bitrv208neg(a); + } + } else if (n == 8) { + AUP_FFTW_cftb040(a); + } else if (n == 4) { + AUP_FFTW_cftx020(a); + } +} + +static void AUP_FFTW_bitrv2(int n, int* ip, float* a) { + int j, j1, k, k1, l, m, nh, nm; + float xr, xi, yr, yi; + + m = 1; + for (l = n >> 2; l > 8; l >>= 2) { + m <<= 1; + } + nh = n >> 1; + nm = 4 * m; + if (l == 8) { + for (k = 0; k < m; k++) { + for (j = 0; j < k; j++) { + j1 = 4 * j + 2 * ip[m + k]; + k1 = 4 * k + 2 * ip[m + j]; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh; + k1 += 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 += nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += 2; + k1 += nh; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh; + k1 -= 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 += nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + k1 = 4 * k + 2 * ip[m + k]; + j1 = k1 + 2; + k1 += nh; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= 2; + k1 -= nh; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh + 2; + k1 += nh + 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh - nm; + k1 += 2 * nm - 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + } else { + for (k = 0; k < m; k++) { + for (j = 0; j < k; j++) { + j1 = 4 * j + ip[m + k]; + k1 = 4 * k + ip[m + j]; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh; + k1 += 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += 2; + k1 += nh; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh; + k1 -= 2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + k1 = 4 * k + ip[m + k]; + j1 = k1 + 2; + k1 += nh; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += nm; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + } +} + +static void AUP_FFTW_bitrv2conj(int n, int* ip, float* a) { + int j, j1, k, k1, l, m, nh, nm; + float xr, xi, yr, yi; + + m = 1; + for (l = n >> 2; l > 8; l >>= 2) { + m <<= 1; + } + nh = n >> 1; + nm = 4 * m; + if (l == 8) { + for (k = 0; k < m; k++) { + for (j = 0; j < k; j++) { + j1 = 4 * j + 2 * ip[m + k]; + k1 = 4 * k + 2 * ip[m + j]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh; + k1 += 2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 += nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += 2; + k1 += nh; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh; + k1 -= 2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 += nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + k1 = 4 * k + 2 * ip[m + k]; + j1 = k1 + 2; + k1 += nh; + a[j1 - 1] = -a[j1 - 1]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + a[k1 + 3] = -a[k1 + 3]; + j1 += nm; + k1 += 2 * nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 -= nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= 2; + k1 -= nh; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh + 2; + k1 += nh + 2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh - nm; + k1 += 2 * nm - 2; + a[j1 - 1] = -a[j1 - 1]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + a[k1 + 3] = -a[k1 + 3]; + } + } else { + for (k = 0; k < m; k++) { + for (j = 0; j < k; j++) { + j1 = 4 * j + ip[m + k]; + k1 = 4 * k + ip[m + j]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nh; + k1 += 2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += 2; + k1 += nh; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += nm; + k1 += nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nh; + k1 -= 2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 -= nm; + k1 -= nm; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + k1 = 4 * k + ip[m + k]; + j1 = k1 + 2; + k1 += nh; + a[j1 - 1] = -a[j1 - 1]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + a[k1 + 3] = -a[k1 + 3]; + j1 += nm; + k1 += nm; + a[j1 - 1] = -a[j1 - 1]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + a[k1 + 3] = -a[k1 + 3]; + } + } +} + +static void AUP_FFTW_bitrv216(float* a) { + float x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x7r, x7i, x8r, x8i, + x10r, x10i, x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i; + + x1r = a[2]; + x1i = a[3]; + x2r = a[4]; + x2i = a[5]; + x3r = a[6]; + x3i = a[7]; + x4r = a[8]; + x4i = a[9]; + x5r = a[10]; + x5i = a[11]; + x7r = a[14]; + x7i = a[15]; + x8r = a[16]; + x8i = a[17]; + x10r = a[20]; + x10i = a[21]; + x11r = a[22]; + x11i = a[23]; + x12r = a[24]; + x12i = a[25]; + x13r = a[26]; + x13i = a[27]; + x14r = a[28]; + x14i = a[29]; + a[2] = x8r; + a[3] = x8i; + a[4] = x4r; + a[5] = x4i; + a[6] = x12r; + a[7] = x12i; + a[8] = x2r; + a[9] = x2i; + a[10] = x10r; + a[11] = x10i; + a[14] = x14r; + a[15] = x14i; + a[16] = x1r; + a[17] = x1i; + a[20] = x5r; + a[21] = x5i; + a[22] = x13r; + a[23] = x13i; + a[24] = x3r; + a[25] = x3i; + a[26] = x11r; + a[27] = x11i; + a[28] = x7r; + a[29] = x7i; +} + +static void AUP_FFTW_bitrv216neg(float* a) { + float x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x6r, x6i, x7r, x7i, + x8r, x8i, x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, x13r, x13i, x14r, + x14i, x15r, x15i; + + x1r = a[2]; + x1i = a[3]; + x2r = a[4]; + x2i = a[5]; + x3r = a[6]; + x3i = a[7]; + x4r = a[8]; + x4i = a[9]; + x5r = a[10]; + x5i = a[11]; + x6r = a[12]; + x6i = a[13]; + x7r = a[14]; + x7i = a[15]; + x8r = a[16]; + x8i = a[17]; + x9r = a[18]; + x9i = a[19]; + x10r = a[20]; + x10i = a[21]; + x11r = a[22]; + x11i = a[23]; + x12r = a[24]; + x12i = a[25]; + x13r = a[26]; + x13i = a[27]; + x14r = a[28]; + x14i = a[29]; + x15r = a[30]; + x15i = a[31]; + a[2] = x15r; + a[3] = x15i; + a[4] = x7r; + a[5] = x7i; + a[6] = x11r; + a[7] = x11i; + a[8] = x3r; + a[9] = x3i; + a[10] = x13r; + a[11] = x13i; + a[12] = x5r; + a[13] = x5i; + a[14] = x9r; + a[15] = x9i; + a[16] = x1r; + a[17] = x1i; + a[18] = x14r; + a[19] = x14i; + a[20] = x6r; + a[21] = x6i; + a[22] = x10r; + a[23] = x10i; + a[24] = x2r; + a[25] = x2i; + a[26] = x12r; + a[27] = x12i; + a[28] = x4r; + a[29] = x4i; + a[30] = x8r; + a[31] = x8i; +} + +static void AUP_FFTW_bitrv208(float* a) { + float x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i; + + x1r = a[2]; + x1i = a[3]; + x3r = a[6]; + x3i = a[7]; + x4r = a[8]; + x4i = a[9]; + x6r = a[12]; + x6i = a[13]; + a[2] = x4r; + a[3] = x4i; + a[6] = x6r; + a[7] = x6i; + a[8] = x1r; + a[9] = x1i; + a[12] = x3r; + a[13] = x3i; +} + +static void AUP_FFTW_bitrv208neg(float* a) { + float x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, x5r, x5i, x6r, x6i, x7r, x7i; + + x1r = a[2]; + x1i = a[3]; + x2r = a[4]; + x2i = a[5]; + x3r = a[6]; + x3i = a[7]; + x4r = a[8]; + x4i = a[9]; + x5r = a[10]; + x5i = a[11]; + x6r = a[12]; + x6i = a[13]; + x7r = a[14]; + x7i = a[15]; + a[2] = x7r; + a[3] = x7i; + a[4] = x3r; + a[5] = x3i; + a[6] = x5r; + a[7] = x5i; + a[8] = x1r; + a[9] = x1i; + a[10] = x6r; + a[11] = x6i; + a[12] = x2r; + a[13] = x2i; + a[14] = x4r; + a[15] = x4i; +} + +static void AUP_FFTW_cftb1st(int n, float* a, float* w) { + int j, j0, j1, j2, j3, k, m, mh; + float wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i; + float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, y2i, + y3r, y3i; + + mh = n >> 3; + m = 2 * mh; + j1 = m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[0] + a[j2]; + x0i = -a[1] - a[j2 + 1]; + x1r = a[0] - a[j2]; + x1i = -a[1] + a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[0] = x0r + x2r; + a[1] = x0i - x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i + x2i; + a[j2] = x1r + x3i; + a[j2 + 1] = x1i + x3r; + a[j3] = x1r - x3i; + a[j3 + 1] = x1i - x3r; + wn4r = w[1]; + csc1 = w[2]; + csc3 = w[3]; + wd1r = 1; + wd1i = 0; + wd3r = 1; + wd3i = 0; + k = 0; + for (j = 2; j < mh - 2; j += 4) { + k += 4; + wk1r = csc1 * (wd1r + w[k]); + wk1i = csc1 * (wd1i + w[k + 1]); + wk3r = csc3 * (wd3r + w[k + 2]); + wk3i = csc3 * (wd3i + w[k + 3]); + wd1r = w[k]; + wd1i = w[k + 1]; + wd3r = w[k + 2]; + wd3i = w[k + 3]; + j1 = j + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j] + a[j2]; + x0i = -a[j + 1] - a[j2 + 1]; + x1r = a[j] - a[j2]; + x1i = -a[j + 1] + a[j2 + 1]; + y0r = a[j + 2] + a[j2 + 2]; + y0i = -a[j + 3] - a[j2 + 3]; + y1r = a[j + 2] - a[j2 + 2]; + y1i = -a[j + 3] + a[j2 + 3]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + y2r = a[j1 + 2] + a[j3 + 2]; + y2i = a[j1 + 3] + a[j3 + 3]; + y3r = a[j1 + 2] - a[j3 + 2]; + y3i = a[j1 + 3] - a[j3 + 3]; + a[j] = x0r + x2r; + a[j + 1] = x0i - x2i; + a[j + 2] = y0r + y2r; + a[j + 3] = y0i - y2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i + x2i; + a[j1 + 2] = y0r - y2r; + a[j1 + 3] = y0i + y2i; + x0r = x1r + x3i; + x0i = x1i + x3r; + a[j2] = wk1r * x0r - wk1i * x0i; + a[j2 + 1] = wk1r * x0i + wk1i * x0r; + x0r = y1r + y3i; + x0i = y1i + y3r; + a[j2 + 2] = wd1r * x0r - wd1i * x0i; + a[j2 + 3] = wd1r * x0i + wd1i * x0r; + x0r = x1r - x3i; + x0i = x1i - x3r; + a[j3] = wk3r * x0r + wk3i * x0i; + a[j3 + 1] = wk3r * x0i - wk3i * x0r; + x0r = y1r - y3i; + x0i = y1i - y3r; + a[j3 + 2] = wd3r * x0r + wd3i * x0i; + a[j3 + 3] = wd3r * x0i - wd3i * x0r; + j0 = m - j; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] + a[j2]; + x0i = -a[j0 + 1] - a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = -a[j0 + 1] + a[j2 + 1]; + y0r = a[j0 - 2] + a[j2 - 2]; + y0i = -a[j0 - 1] - a[j2 - 1]; + y1r = a[j0 - 2] - a[j2 - 2]; + y1i = -a[j0 - 1] + a[j2 - 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + y2r = a[j1 - 2] + a[j3 - 2]; + y2i = a[j1 - 1] + a[j3 - 1]; + y3r = a[j1 - 2] - a[j3 - 2]; + y3i = a[j1 - 1] - a[j3 - 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i - x2i; + a[j0 - 2] = y0r + y2r; + a[j0 - 1] = y0i - y2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i + x2i; + a[j1 - 2] = y0r - y2r; + a[j1 - 1] = y0i + y2i; + x0r = x1r + x3i; + x0i = x1i + x3r; + a[j2] = wk1i * x0r - wk1r * x0i; + a[j2 + 1] = wk1i * x0i + wk1r * x0r; + x0r = y1r + y3i; + x0i = y1i + y3r; + a[j2 - 2] = wd1i * x0r - wd1r * x0i; + a[j2 - 1] = wd1i * x0i + wd1r * x0r; + x0r = x1r - x3i; + x0i = x1i - x3r; + a[j3] = wk3i * x0r + wk3r * x0i; + a[j3 + 1] = wk3i * x0i - wk3r * x0r; + x0r = y1r - y3i; + x0i = y1i - y3r; + a[j3 - 2] = wd3i * x0r + wd3r * x0i; + a[j3 - 1] = wd3i * x0i - wd3r * x0r; + } + wk1r = csc1 * (wd1r + wn4r); + wk1i = csc1 * (wd1i + wn4r); + wk3r = csc3 * (wd3r - wn4r); + wk3i = csc3 * (wd3i - wn4r); + j0 = mh; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0 - 2] + a[j2 - 2]; + x0i = -a[j0 - 1] - a[j2 - 1]; + x1r = a[j0 - 2] - a[j2 - 2]; + x1i = -a[j0 - 1] + a[j2 - 1]; + x2r = a[j1 - 2] + a[j3 - 2]; + x2i = a[j1 - 1] + a[j3 - 1]; + x3r = a[j1 - 2] - a[j3 - 2]; + x3i = a[j1 - 1] - a[j3 - 1]; + a[j0 - 2] = x0r + x2r; + a[j0 - 1] = x0i - x2i; + a[j1 - 2] = x0r - x2r; + a[j1 - 1] = x0i + x2i; + x0r = x1r + x3i; + x0i = x1i + x3r; + a[j2 - 2] = wk1r * x0r - wk1i * x0i; + a[j2 - 1] = wk1r * x0i + wk1i * x0r; + x0r = x1r - x3i; + x0i = x1i - x3r; + a[j3 - 2] = wk3r * x0r + wk3i * x0i; + a[j3 - 1] = wk3r * x0i - wk3i * x0r; + x0r = a[j0] + a[j2]; + x0i = -a[j0 + 1] - a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = -a[j0 + 1] + a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i - x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i + x2i; + x0r = x1r + x3i; + x0i = x1i + x3r; + a[j2] = wn4r * (x0r - x0i); + a[j2 + 1] = wn4r * (x0i + x0r); + x0r = x1r - x3i; + x0i = x1i - x3r; + a[j3] = -wn4r * (x0r + x0i); + a[j3 + 1] = -wn4r * (x0i - x0r); + x0r = a[j0 + 2] + a[j2 + 2]; + x0i = -a[j0 + 3] - a[j2 + 3]; + x1r = a[j0 + 2] - a[j2 + 2]; + x1i = -a[j0 + 3] + a[j2 + 3]; + x2r = a[j1 + 2] + a[j3 + 2]; + x2i = a[j1 + 3] + a[j3 + 3]; + x3r = a[j1 + 2] - a[j3 + 2]; + x3i = a[j1 + 3] - a[j3 + 3]; + a[j0 + 2] = x0r + x2r; + a[j0 + 3] = x0i - x2i; + a[j1 + 2] = x0r - x2r; + a[j1 + 3] = x0i + x2i; + x0r = x1r + x3i; + x0i = x1i + x3r; + a[j2 + 2] = wk1i * x0r - wk1r * x0i; + a[j2 + 3] = wk1i * x0i + wk1r * x0r; + x0r = x1r - x3i; + x0i = x1i - x3r; + a[j3 + 2] = wk3i * x0r + wk3r * x0i; + a[j3 + 3] = wk3i * x0i - wk3r * x0r; +} + +static int AUP_FFTW_cfttree(int n, int j, int k, float* a, int nw, float* w) { + int i, isplt, m; + + if ((k & 3) != 0) { + isplt = k & 1; + if (isplt != 0) { + AUP_FFTW_cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]); + } else { + AUP_FFTW_cftmdl2(n, &a[j - n], &w[nw - n]); + } + } else { + m = n; + for (i = k; (i & 3) == 0; i >>= 2) { + m <<= 2; + } + isplt = i & 1; + if (isplt != 0) { + while (m > 128) { + AUP_FFTW_cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]); + m >>= 2; + } + } else { + while (m > 128) { + AUP_FFTW_cftmdl2(m, &a[j - m], &w[nw - m]); + m >>= 2; + } + } + } + return isplt; +} + +static void AUP_FFTW_cftmdl1(int n, float* a, float* w) { + int j, j0, j1, j2, j3, k, m, mh; + float wn4r, wk1r, wk1i, wk3r, wk3i; + float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + mh = n >> 3; + m = 2 * mh; + j1 = m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[0] + a[j2]; + x0i = a[1] + a[j2 + 1]; + x1r = a[0] - a[j2]; + x1i = a[1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + a[j2] = x1r - x3i; + a[j2 + 1] = x1i + x3r; + a[j3] = x1r + x3i; + a[j3 + 1] = x1i - x3r; + wn4r = w[1]; + k = 0; + for (j = 2; j < mh; j += 2) { + k += 4; + wk1r = w[k]; + wk1i = w[k + 1]; + wk3r = w[k + 2]; + wk3i = w[k + 3]; + j1 = j + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j] + a[j2]; + x0i = a[j + 1] + a[j2 + 1]; + x1r = a[j] - a[j2]; + x1i = a[j + 1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wk1r * x0r - wk1i * x0i; + a[j2 + 1] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3r * x0r + wk3i * x0i; + a[j3 + 1] = wk3r * x0i - wk3i * x0r; + j0 = m - j; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] + a[j2]; + x0i = a[j0 + 1] + a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = a[j0 + 1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wk1i * x0r - wk1r * x0i; + a[j2 + 1] = wk1i * x0i + wk1r * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3i * x0r + wk3r * x0i; + a[j3 + 1] = wk3i * x0i - wk3r * x0r; + } + j0 = mh; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] + a[j2]; + x0i = a[j0 + 1] + a[j2 + 1]; + x1r = a[j0] - a[j2]; + x1i = a[j0 + 1] - a[j2 + 1]; + x2r = a[j1] + a[j3]; + x2i = a[j1 + 1] + a[j3 + 1]; + x3r = a[j1] - a[j3]; + x3i = a[j1 + 1] - a[j3 + 1]; + a[j0] = x0r + x2r; + a[j0 + 1] = x0i + x2i; + a[j1] = x0r - x2r; + a[j1 + 1] = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j2] = wn4r * (x0r - x0i); + a[j2 + 1] = wn4r * (x0i + x0r); + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = -wn4r * (x0r + x0i); + a[j3 + 1] = -wn4r * (x0i - x0r); +} + +static void AUP_FFTW_cftmdl2(int n, float* a, float* w) { + int j, j0, j1, j2, j3, k, kr, m, mh; + float wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i; + float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i; + + mh = n >> 3; + m = 2 * mh; + wn4r = w[1]; + j1 = m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[0] - a[j2 + 1]; + x0i = a[1] + a[j2]; + x1r = a[0] + a[j2 + 1]; + x1i = a[1] - a[j2]; + x2r = a[j1] - a[j3 + 1]; + x2i = a[j1 + 1] + a[j3]; + x3r = a[j1] + a[j3 + 1]; + x3i = a[j1 + 1] - a[j3]; + y0r = wn4r * (x2r - x2i); + y0i = wn4r * (x2i + x2r); + a[0] = x0r + y0r; + a[1] = x0i + y0i; + a[j1] = x0r - y0r; + a[j1 + 1] = x0i - y0i; + y0r = wn4r * (x3r - x3i); + y0i = wn4r * (x3i + x3r); + a[j2] = x1r - y0i; + a[j2 + 1] = x1i + y0r; + a[j3] = x1r + y0i; + a[j3 + 1] = x1i - y0r; + k = 0; + kr = 2 * m; + for (j = 2; j < mh; j += 2) { + k += 4; + wk1r = w[k]; + wk1i = w[k + 1]; + wk3r = w[k + 2]; + wk3i = w[k + 3]; + kr -= 4; + wd1i = w[kr]; + wd1r = w[kr + 1]; + wd3i = w[kr + 2]; + wd3r = w[kr + 3]; + j1 = j + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j] - a[j2 + 1]; + x0i = a[j + 1] + a[j2]; + x1r = a[j] + a[j2 + 1]; + x1i = a[j + 1] - a[j2]; + x2r = a[j1] - a[j3 + 1]; + x2i = a[j1 + 1] + a[j3]; + x3r = a[j1] + a[j3 + 1]; + x3i = a[j1 + 1] - a[j3]; + y0r = wk1r * x0r - wk1i * x0i; + y0i = wk1r * x0i + wk1i * x0r; + y2r = wd1r * x2r - wd1i * x2i; + y2i = wd1r * x2i + wd1i * x2r; + a[j] = y0r + y2r; + a[j + 1] = y0i + y2i; + a[j1] = y0r - y2r; + a[j1 + 1] = y0i - y2i; + y0r = wk3r * x1r + wk3i * x1i; + y0i = wk3r * x1i - wk3i * x1r; + y2r = wd3r * x3r + wd3i * x3i; + y2i = wd3r * x3i - wd3i * x3r; + a[j2] = y0r + y2r; + a[j2 + 1] = y0i + y2i; + a[j3] = y0r - y2r; + a[j3 + 1] = y0i - y2i; + j0 = m - j; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] - a[j2 + 1]; + x0i = a[j0 + 1] + a[j2]; + x1r = a[j0] + a[j2 + 1]; + x1i = a[j0 + 1] - a[j2]; + x2r = a[j1] - a[j3 + 1]; + x2i = a[j1 + 1] + a[j3]; + x3r = a[j1] + a[j3 + 1]; + x3i = a[j1 + 1] - a[j3]; + y0r = wd1i * x0r - wd1r * x0i; + y0i = wd1i * x0i + wd1r * x0r; + y2r = wk1i * x2r - wk1r * x2i; + y2i = wk1i * x2i + wk1r * x2r; + a[j0] = y0r + y2r; + a[j0 + 1] = y0i + y2i; + a[j1] = y0r - y2r; + a[j1 + 1] = y0i - y2i; + y0r = wd3i * x1r + wd3r * x1i; + y0i = wd3i * x1i - wd3r * x1r; + y2r = wk3i * x3r + wk3r * x3i; + y2i = wk3i * x3i - wk3r * x3r; + a[j2] = y0r + y2r; + a[j2 + 1] = y0i + y2i; + a[j3] = y0r - y2r; + a[j3 + 1] = y0i - y2i; + } + wk1r = w[m]; + wk1i = w[m + 1]; + j0 = mh; + j1 = j0 + m; + j2 = j1 + m; + j3 = j2 + m; + x0r = a[j0] - a[j2 + 1]; + x0i = a[j0 + 1] + a[j2]; + x1r = a[j0] + a[j2 + 1]; + x1i = a[j0 + 1] - a[j2]; + x2r = a[j1] - a[j3 + 1]; + x2i = a[j1 + 1] + a[j3]; + x3r = a[j1] + a[j3 + 1]; + x3i = a[j1 + 1] - a[j3]; + y0r = wk1r * x0r - wk1i * x0i; + y0i = wk1r * x0i + wk1i * x0r; + y2r = wk1i * x2r - wk1r * x2i; + y2i = wk1i * x2i + wk1r * x2r; + a[j0] = y0r + y2r; + a[j0 + 1] = y0i + y2i; + a[j1] = y0r - y2r; + a[j1 + 1] = y0i - y2i; + y0r = wk1i * x1r - wk1r * x1i; + y0i = wk1i * x1i + wk1r * x1r; + y2r = wk1r * x3r - wk1i * x3i; + y2i = wk1r * x3i + wk1i * x3r; + a[j2] = y0r - y2r; + a[j2 + 1] = y0i - y2i; + a[j3] = y0r + y2r; + a[j3 + 1] = y0i + y2i; +} + +static void AUP_FFTW_cftfx41(int n, float* a, int nw, float* w) { + if (n == 128) { + AUP_FFTW_cftf161(a, &w[nw - 8]); + AUP_FFTW_cftf162(&a[32], &w[nw - 32]); + AUP_FFTW_cftf161(&a[64], &w[nw - 8]); + AUP_FFTW_cftf161(&a[96], &w[nw - 8]); + } else { + AUP_FFTW_cftf081(a, &w[nw - 8]); + AUP_FFTW_cftf082(&a[16], &w[nw - 8]); + AUP_FFTW_cftf081(&a[32], &w[nw - 8]); + AUP_FFTW_cftf081(&a[48], &w[nw - 8]); + } +} + +static void AUP_FFTW_cftf161(float* a, float* w) { + float wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, + y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, y8r, y8i, + y9r, y9i, y10r, y10i, y11r, y11i, y12r, y12i, y13r, y13i, y14r, y14i, + y15r, y15i; + + wn4r = w[1]; + wk1r = w[2]; + wk1i = w[3]; + x0r = a[0] + a[16]; + x0i = a[1] + a[17]; + x1r = a[0] - a[16]; + x1i = a[1] - a[17]; + x2r = a[8] + a[24]; + x2i = a[9] + a[25]; + x3r = a[8] - a[24]; + x3i = a[9] - a[25]; + y0r = x0r + x2r; + y0i = x0i + x2i; + y4r = x0r - x2r; + y4i = x0i - x2i; + y8r = x1r - x3i; + y8i = x1i + x3r; + y12r = x1r + x3i; + y12i = x1i - x3r; + x0r = a[2] + a[18]; + x0i = a[3] + a[19]; + x1r = a[2] - a[18]; + x1i = a[3] - a[19]; + x2r = a[10] + a[26]; + x2i = a[11] + a[27]; + x3r = a[10] - a[26]; + x3i = a[11] - a[27]; + y1r = x0r + x2r; + y1i = x0i + x2i; + y5r = x0r - x2r; + y5i = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + y9r = wk1r * x0r - wk1i * x0i; + y9i = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + y13r = wk1i * x0r - wk1r * x0i; + y13i = wk1i * x0i + wk1r * x0r; + x0r = a[4] + a[20]; + x0i = a[5] + a[21]; + x1r = a[4] - a[20]; + x1i = a[5] - a[21]; + x2r = a[12] + a[28]; + x2i = a[13] + a[29]; + x3r = a[12] - a[28]; + x3i = a[13] - a[29]; + y2r = x0r + x2r; + y2i = x0i + x2i; + y6r = x0r - x2r; + y6i = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + y10r = wn4r * (x0r - x0i); + y10i = wn4r * (x0i + x0r); + x0r = x1r + x3i; + x0i = x1i - x3r; + y14r = wn4r * (x0r + x0i); + y14i = wn4r * (x0i - x0r); + x0r = a[6] + a[22]; + x0i = a[7] + a[23]; + x1r = a[6] - a[22]; + x1i = a[7] - a[23]; + x2r = a[14] + a[30]; + x2i = a[15] + a[31]; + x3r = a[14] - a[30]; + x3i = a[15] - a[31]; + y3r = x0r + x2r; + y3i = x0i + x2i; + y7r = x0r - x2r; + y7i = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + y11r = wk1i * x0r - wk1r * x0i; + y11i = wk1i * x0i + wk1r * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + y15r = wk1r * x0r - wk1i * x0i; + y15i = wk1r * x0i + wk1i * x0r; + x0r = y12r - y14r; + x0i = y12i - y14i; + x1r = y12r + y14r; + x1i = y12i + y14i; + x2r = y13r - y15r; + x2i = y13i - y15i; + x3r = y13r + y15r; + x3i = y13i + y15i; + a[24] = x0r + x2r; + a[25] = x0i + x2i; + a[26] = x0r - x2r; + a[27] = x0i - x2i; + a[28] = x1r - x3i; + a[29] = x1i + x3r; + a[30] = x1r + x3i; + a[31] = x1i - x3r; + x0r = y8r + y10r; + x0i = y8i + y10i; + x1r = y8r - y10r; + x1i = y8i - y10i; + x2r = y9r + y11r; + x2i = y9i + y11i; + x3r = y9r - y11r; + x3i = y9i - y11i; + a[16] = x0r + x2r; + a[17] = x0i + x2i; + a[18] = x0r - x2r; + a[19] = x0i - x2i; + a[20] = x1r - x3i; + a[21] = x1i + x3r; + a[22] = x1r + x3i; + a[23] = x1i - x3r; + x0r = y5r - y7i; + x0i = y5i + y7r; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + x0r = y5r + y7i; + x0i = y5i - y7r; + x3r = wn4r * (x0r - x0i); + x3i = wn4r * (x0i + x0r); + x0r = y4r - y6i; + x0i = y4i + y6r; + x1r = y4r + y6i; + x1i = y4i - y6r; + a[8] = x0r + x2r; + a[9] = x0i + x2i; + a[10] = x0r - x2r; + a[11] = x0i - x2i; + a[12] = x1r - x3i; + a[13] = x1i + x3r; + a[14] = x1r + x3i; + a[15] = x1i - x3r; + x0r = y0r + y2r; + x0i = y0i + y2i; + x1r = y0r - y2r; + x1i = y0i - y2i; + x2r = y1r + y3r; + x2i = y1i + y3i; + x3r = y1r - y3r; + x3i = y1i - y3i; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[2] = x0r - x2r; + a[3] = x0i - x2i; + a[4] = x1r - x3i; + a[5] = x1i + x3r; + a[6] = x1r + x3i; + a[7] = x1i - x3r; +} + +static void AUP_FFTW_cftf162(float* a, float* w) { + float wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, x0r, x0i, x1r, x1i, x2r, x2i, + y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, + y7i, y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, y12r, y12i, y13r, y13i, + y14r, y14i, y15r, y15i; + + wn4r = w[1]; + wk1r = w[4]; + wk1i = w[5]; + wk3r = w[6]; + wk3i = -w[7]; + wk2r = w[8]; + wk2i = w[9]; + x1r = a[0] - a[17]; + x1i = a[1] + a[16]; + x0r = a[8] - a[25]; + x0i = a[9] + a[24]; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + y0r = x1r + x2r; + y0i = x1i + x2i; + y4r = x1r - x2r; + y4i = x1i - x2i; + x1r = a[0] + a[17]; + x1i = a[1] - a[16]; + x0r = a[8] + a[25]; + x0i = a[9] - a[24]; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + y8r = x1r - x2i; + y8i = x1i + x2r; + y12r = x1r + x2i; + y12i = x1i - x2r; + x0r = a[2] - a[19]; + x0i = a[3] + a[18]; + x1r = wk1r * x0r - wk1i * x0i; + x1i = wk1r * x0i + wk1i * x0r; + x0r = a[10] - a[27]; + x0i = a[11] + a[26]; + x2r = wk3i * x0r - wk3r * x0i; + x2i = wk3i * x0i + wk3r * x0r; + y1r = x1r + x2r; + y1i = x1i + x2i; + y5r = x1r - x2r; + y5i = x1i - x2i; + x0r = a[2] + a[19]; + x0i = a[3] - a[18]; + x1r = wk3r * x0r - wk3i * x0i; + x1i = wk3r * x0i + wk3i * x0r; + x0r = a[10] + a[27]; + x0i = a[11] - a[26]; + x2r = wk1r * x0r + wk1i * x0i; + x2i = wk1r * x0i - wk1i * x0r; + y9r = x1r - x2r; + y9i = x1i - x2i; + y13r = x1r + x2r; + y13i = x1i + x2i; + x0r = a[4] - a[21]; + x0i = a[5] + a[20]; + x1r = wk2r * x0r - wk2i * x0i; + x1i = wk2r * x0i + wk2i * x0r; + x0r = a[12] - a[29]; + x0i = a[13] + a[28]; + x2r = wk2i * x0r - wk2r * x0i; + x2i = wk2i * x0i + wk2r * x0r; + y2r = x1r + x2r; + y2i = x1i + x2i; + y6r = x1r - x2r; + y6i = x1i - x2i; + x0r = a[4] + a[21]; + x0i = a[5] - a[20]; + x1r = wk2i * x0r - wk2r * x0i; + x1i = wk2i * x0i + wk2r * x0r; + x0r = a[12] + a[29]; + x0i = a[13] - a[28]; + x2r = wk2r * x0r - wk2i * x0i; + x2i = wk2r * x0i + wk2i * x0r; + y10r = x1r - x2r; + y10i = x1i - x2i; + y14r = x1r + x2r; + y14i = x1i + x2i; + x0r = a[6] - a[23]; + x0i = a[7] + a[22]; + x1r = wk3r * x0r - wk3i * x0i; + x1i = wk3r * x0i + wk3i * x0r; + x0r = a[14] - a[31]; + x0i = a[15] + a[30]; + x2r = wk1i * x0r - wk1r * x0i; + x2i = wk1i * x0i + wk1r * x0r; + y3r = x1r + x2r; + y3i = x1i + x2i; + y7r = x1r - x2r; + y7i = x1i - x2i; + x0r = a[6] + a[23]; + x0i = a[7] - a[22]; + x1r = wk1i * x0r + wk1r * x0i; + x1i = wk1i * x0i - wk1r * x0r; + x0r = a[14] + a[31]; + x0i = a[15] - a[30]; + x2r = wk3i * x0r - wk3r * x0i; + x2i = wk3i * x0i + wk3r * x0r; + y11r = x1r + x2r; + y11i = x1i + x2i; + y15r = x1r - x2r; + y15i = x1i - x2i; + x1r = y0r + y2r; + x1i = y0i + y2i; + x2r = y1r + y3r; + x2i = y1i + y3i; + a[0] = x1r + x2r; + a[1] = x1i + x2i; + a[2] = x1r - x2r; + a[3] = x1i - x2i; + x1r = y0r - y2r; + x1i = y0i - y2i; + x2r = y1r - y3r; + x2i = y1i - y3i; + a[4] = x1r - x2i; + a[5] = x1i + x2r; + a[6] = x1r + x2i; + a[7] = x1i - x2r; + x1r = y4r - y6i; + x1i = y4i + y6r; + x0r = y5r - y7i; + x0i = y5i + y7r; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + a[8] = x1r + x2r; + a[9] = x1i + x2i; + a[10] = x1r - x2r; + a[11] = x1i - x2i; + x1r = y4r + y6i; + x1i = y4i - y6r; + x0r = y5r + y7i; + x0i = y5i - y7r; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + a[12] = x1r - x2i; + a[13] = x1i + x2r; + a[14] = x1r + x2i; + a[15] = x1i - x2r; + x1r = y8r + y10r; + x1i = y8i + y10i; + x2r = y9r - y11r; + x2i = y9i - y11i; + a[16] = x1r + x2r; + a[17] = x1i + x2i; + a[18] = x1r - x2r; + a[19] = x1i - x2i; + x1r = y8r - y10r; + x1i = y8i - y10i; + x2r = y9r + y11r; + x2i = y9i + y11i; + a[20] = x1r - x2i; + a[21] = x1i + x2r; + a[22] = x1r + x2i; + a[23] = x1i - x2r; + x1r = y12r - y14i; + x1i = y12i + y14r; + x0r = y13r + y15i; + x0i = y13i - y15r; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + a[24] = x1r + x2r; + a[25] = x1i + x2i; + a[26] = x1r - x2r; + a[27] = x1i - x2i; + x1r = y12r + y14i; + x1i = y12i - y14r; + x0r = y13r - y15i; + x0i = y13i + y15r; + x2r = wn4r * (x0r - x0i); + x2i = wn4r * (x0i + x0r); + a[28] = x1r - x2i; + a[29] = x1i + x2r; + a[30] = x1r + x2i; + a[31] = x1i - x2r; +} + +static void AUP_FFTW_cftf081(float* a, float* w) { + float wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y1r, y1i, y2r, + y2i, y3r, y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; + + wn4r = w[1]; + x0r = a[0] + a[8]; + x0i = a[1] + a[9]; + x1r = a[0] - a[8]; + x1i = a[1] - a[9]; + x2r = a[4] + a[12]; + x2i = a[5] + a[13]; + x3r = a[4] - a[12]; + x3i = a[5] - a[13]; + y0r = x0r + x2r; + y0i = x0i + x2i; + y2r = x0r - x2r; + y2i = x0i - x2i; + y1r = x1r - x3i; + y1i = x1i + x3r; + y3r = x1r + x3i; + y3i = x1i - x3r; + x0r = a[2] + a[10]; + x0i = a[3] + a[11]; + x1r = a[2] - a[10]; + x1i = a[3] - a[11]; + x2r = a[6] + a[14]; + x2i = a[7] + a[15]; + x3r = a[6] - a[14]; + x3i = a[7] - a[15]; + y4r = x0r + x2r; + y4i = x0i + x2i; + y6r = x0r - x2r; + y6i = x0i - x2i; + x0r = x1r - x3i; + x0i = x1i + x3r; + x2r = x1r + x3i; + x2i = x1i - x3r; + y5r = wn4r * (x0r - x0i); + y5i = wn4r * (x0r + x0i); + y7r = wn4r * (x2r - x2i); + y7i = wn4r * (x2r + x2i); + a[8] = y1r + y5r; + a[9] = y1i + y5i; + a[10] = y1r - y5r; + a[11] = y1i - y5i; + a[12] = y3r - y7i; + a[13] = y3i + y7r; + a[14] = y3r + y7i; + a[15] = y3i - y7r; + a[0] = y0r + y4r; + a[1] = y0i + y4i; + a[2] = y0r - y4r; + a[3] = y0i - y4i; + a[4] = y2r - y6i; + a[5] = y2i + y6r; + a[6] = y2r + y6i; + a[7] = y2i - y6r; +} + +static void AUP_FFTW_cftf082(float* a, float* w) { + float wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, y0r, y0i, y1r, y1i, y2r, y2i, y3r, + y3i, y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i; + + wn4r = w[1]; + wk1r = w[2]; + wk1i = w[3]; + y0r = a[0] - a[9]; + y0i = a[1] + a[8]; + y1r = a[0] + a[9]; + y1i = a[1] - a[8]; + x0r = a[4] - a[13]; + x0i = a[5] + a[12]; + y2r = wn4r * (x0r - x0i); + y2i = wn4r * (x0i + x0r); + x0r = a[4] + a[13]; + x0i = a[5] - a[12]; + y3r = wn4r * (x0r - x0i); + y3i = wn4r * (x0i + x0r); + x0r = a[2] - a[11]; + x0i = a[3] + a[10]; + y4r = wk1r * x0r - wk1i * x0i; + y4i = wk1r * x0i + wk1i * x0r; + x0r = a[2] + a[11]; + x0i = a[3] - a[10]; + y5r = wk1i * x0r - wk1r * x0i; + y5i = wk1i * x0i + wk1r * x0r; + x0r = a[6] - a[15]; + x0i = a[7] + a[14]; + y6r = wk1i * x0r - wk1r * x0i; + y6i = wk1i * x0i + wk1r * x0r; + x0r = a[6] + a[15]; + x0i = a[7] - a[14]; + y7r = wk1r * x0r - wk1i * x0i; + y7i = wk1r * x0i + wk1i * x0r; + x0r = y0r + y2r; + x0i = y0i + y2i; + x1r = y4r + y6r; + x1i = y4i + y6i; + a[0] = x0r + x1r; + a[1] = x0i + x1i; + a[2] = x0r - x1r; + a[3] = x0i - x1i; + x0r = y0r - y2r; + x0i = y0i - y2i; + x1r = y4r - y6r; + x1i = y4i - y6i; + a[4] = x0r - x1i; + a[5] = x0i + x1r; + a[6] = x0r + x1i; + a[7] = x0i - x1r; + x0r = y1r - y3i; + x0i = y1i + y3r; + x1r = y5r - y7r; + x1i = y5i - y7i; + a[8] = x0r + x1r; + a[9] = x0i + x1i; + a[10] = x0r - x1r; + a[11] = x0i - x1i; + x0r = y1r + y3i; + x0i = y1i - y3r; + x1r = y5r + y7r; + x1i = y5i + y7i; + a[12] = x0r - x1i; + a[13] = x0i + x1r; + a[14] = x0r + x1i; + a[15] = x0i - x1r; +} + +static void AUP_FFTW_cftf040(float* a) { + float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + x0r = a[0] + a[4]; + x0i = a[1] + a[5]; + x1r = a[0] - a[4]; + x1i = a[1] - a[5]; + x2r = a[2] + a[6]; + x2i = a[3] + a[7]; + x3r = a[2] - a[6]; + x3i = a[3] - a[7]; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[2] = x1r - x3i; + a[3] = x1i + x3r; + a[4] = x0r - x2r; + a[5] = x0i - x2i; + a[6] = x1r + x3i; + a[7] = x1i - x3r; +} + +static void AUP_FFTW_cftb040(float* a) { + float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + x0r = a[0] + a[4]; + x0i = a[1] + a[5]; + x1r = a[0] - a[4]; + x1i = a[1] - a[5]; + x2r = a[2] + a[6]; + x2i = a[3] + a[7]; + x3r = a[2] - a[6]; + x3i = a[3] - a[7]; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[2] = x1r + x3i; + a[3] = x1i - x3r; + a[4] = x0r - x2r; + a[5] = x0i - x2i; + a[6] = x1r - x3i; + a[7] = x1i + x3r; +} + +static void AUP_FFTW_cftx020(float* a) { + float x0r, x0i; + + x0r = a[0] - a[2]; + x0i = a[1] - a[3]; + a[0] += a[2]; + a[1] += a[3]; + a[2] = x0r; + a[3] = x0i; +} + +static void AUP_FFTW_rftfsub(int n, float* a, int nc, float* c) { + int j, k, kk, ks, m; + float wkr, wki, xr, xi, yr, yi; + + m = n >> 1; + ks = 2 * nc / m; + kk = 0; + for (j = 2; j < m; j += 2) { + k = n - j; + kk += ks; + wkr = 0.5f - c[nc - kk]; + wki = c[kk]; + xr = a[j] - a[k]; + xi = a[j + 1] + a[k + 1]; + yr = wkr * xr - wki * xi; + yi = wkr * xi + wki * xr; + a[j] -= yr; + a[j + 1] -= yi; + a[k] += yr; + a[k + 1] -= yi; + } +} + +static void AUP_FFTW_rftbsub(int n, float* a, int nc, float* c) { + int j, k, kk, ks, m; + float wkr, wki, xr, xi, yr, yi; + + m = n >> 1; + ks = 2 * nc / m; + kk = 0; + for (j = 2; j < m; j += 2) { + k = n - j; + kk += ks; + wkr = 0.5f - c[nc - kk]; + wki = c[kk]; + xr = a[j] - a[k]; + xi = a[j + 1] + a[k + 1]; + yr = wkr * xr + wki * xi; + yi = wkr * xi - wki * xr; + a[j] -= yr; + a[j + 1] -= yi; + a[k] += yr; + a[k + 1] -= yi; + } +} + +static void AUP_FFTW_dctsub(int n, float* a, int nc, float* c) { + int j, k, kk, ks, m; + float wkr, wki, xr; + + m = n >> 1; + ks = nc / n; + kk = 0; + for (j = 1; j < m; j++) { + k = n - j; + kk += ks; + wkr = c[kk] - c[nc - kk]; + wki = c[kk] + c[nc - kk]; + xr = wki * a[j] - wkr * a[k]; + a[j] = wkr * a[j] + wki * a[k]; + a[k] = xr; + } + a[m] *= c[0]; +} + +static void AUP_FFTW_dstsub(int n, float* a, int nc, float* c) { + int j, k, kk, ks, m; + float wkr, wki, xr; + + m = n >> 1; + ks = nc / n; + kk = 0; + for (j = 1; j < m; j++) { + k = n - j; + kk += ks; + wkr = c[kk] - c[nc - kk]; + wki = c[kk] + c[nc - kk]; + xr = wki * a[k] - wkr * a[j]; + a[k] = wkr * a[k] + wki * a[j]; + a[j] = xr; + } + a[m] *= c[0]; +} + +static void AUP_FFTW_rdft(int n, int isgn, float* a, int* ip, float* w) { + float xi; + + int nw = ip[0]; + int nc = ip[1]; + + if (isgn >= 0) { + if (n > 4) { + AUP_FFTW_cftfsub(n, a, ip, nw, w); + AUP_FFTW_rftfsub(n, a, nc, w + nw); + } else if (n == 4) { + AUP_FFTW_cftfsub(n, a, ip, nw, w); + } + xi = a[0] - a[1]; + a[0] += a[1]; + a[1] = xi; + } else { + a[1] = 0.5f * (a[0] - a[1]); + a[0] -= a[1]; + if (n > 4) { + AUP_FFTW_rftbsub(n, a, nc, w + nw); + AUP_FFTW_cftbsub(n, a, ip, nw, w); + } else if (n == 4) { + AUP_FFTW_cftbsub(n, a, ip, nw, w); + } + } +} + +// ========================================================================================== +// public APIs +// ========================================================================================== + +void AUP_FFTW_r2c_256(float* in, float* out) { + int i; + + float tmp[258] = {0}; + + // scale + for (i = 0; i < 256; ++i) { + tmp[i] = in[i] * 0.00390625f; + } + + AUP_FFTW_rdft(256, 1, tmp, (int*)AUP_FFTW_g_ip256, (float*)AUP_FFTW_g_w256); + + out[0] = tmp[0]; + out[255] = tmp[1]; + for (i = 1; i < 255; i += 2) { + out[i] = tmp[i + 1]; + out[i + 1] = -tmp[i + 2]; + } +} + +void AUP_FFTW_c2r_256(float* in, float* out) { + int i; + + out[0] = in[0]; + out[1] = in[255]; + for (i = 2; i < 256; i += 2) { + out[i] = in[i - 1]; + out[i + 1] = -in[i]; + } + + AUP_FFTW_rdft(256, -1, out, (int*)AUP_FFTW_g_ip256, (float*)AUP_FFTW_g_w256); + /* 1/N */ + for (i = 0; i < 256; i++) { + out[i] *= 2; + } +} + +void AUP_FFTW_c2r_512(float* in, float* out) { + int i; + + out[0] = in[0]; + out[1] = in[511]; + for (i = 2; i < 512; i += 2) { + out[i] = in[i - 1]; + out[i + 1] = -in[i]; + } + AUP_FFTW_rdft(512, -1, out, (int*)AUP_FFTW_g_ip512, (float*)AUP_FFTW_g_w512); + /* 1/N */ + for (i = 0; i < 512; i++) { + out[i] *= 2; + } +} + +void AUP_FFTW_r2c_512(float* in, float* out) { + int i; + + float tmp[514] = {0}; + + // scale + for (i = 0; i < 512; ++i) { + tmp[i] = in[i] * 0.001953125f; + } + + AUP_FFTW_rdft(512, 1, tmp, (int*)AUP_FFTW_g_ip512, (float*)AUP_FFTW_g_w512); + + out[0] = tmp[0]; + out[511] = tmp[1]; + for (i = 1; i < 511; i += 2) { + out[i] = tmp[i + 1]; + out[i + 1] = -tmp[i + 2]; + } +} + +void AUP_FFTW_r2c_1024(float* in, float* out) { + int i; + + float tmp[1026] = {0}; + // scale + for (i = 0; i < 1024; ++i) { + tmp[i] = in[i] * 0.0009765625f; + } + + AUP_FFTW_rdft(1024, 1, tmp, (int*)AUP_FFTW_g_ip1024, + (float*)AUP_FFTW_g_w1024); + + out[0] = tmp[0]; + out[1023] = tmp[1]; + for (i = 1; i < 1023; i += 2) { + out[i] = tmp[i + 1]; + out[i + 1] = -tmp[i + 2]; + } +} + +void AUP_FFTW_c2r_1024(float* in, float* out) { + int i; + // memcpy(out,in,sizeof(float)*1024); + out[0] = in[0]; + out[1] = in[1023]; + for (i = 2; i < 1024; i += 2) { + out[i] = in[i - 1]; + out[i + 1] = -in[i]; + } + AUP_FFTW_rdft(1024, -1, out, (int*)AUP_FFTW_g_ip1024, + (float*)AUP_FFTW_g_w1024); + /* 1/N */ + for (i = 0; i < 1024; i++) { + out[i] *= 2; + } +} + +void AUP_FFTW_r2c_2048(float* in, float* out) { + int i; + + float tmp[2050] = {0}; + + // scale + for (i = 0; i < 2048; ++i) { + tmp[i] = in[i] * 0.00048828125f; + } + + AUP_FFTW_rdft(2048, 1, tmp, (int*)AUP_FFTW_g_ip2048, + (float*)AUP_FFTW_g_w2048); + + out[0] = tmp[0]; + out[2047] = tmp[1]; + for (i = 1; i < 2047; i += 2) { + out[i] = tmp[i + 1]; + out[i + 1] = -tmp[i + 2]; + } +} + +void AUP_FFTW_c2r_2048(float* in, float* out) { + int i; + + out[0] = in[0]; + out[1] = in[2047]; + for (i = 2; i < 2048; i += 2) { + out[i] = in[i - 1]; + out[i + 1] = -in[i]; + } + AUP_FFTW_rdft(2048, -1, out, (int*)AUP_FFTW_g_ip2048, + (float*)AUP_FFTW_g_w2048); + /* 1/N */ + for (i = 0; i < 2048; i++) { + out[i] *= 2; + } +} + +void AUP_FFTW_r2c_4096(float* in, float* out) { + int i; + + float tmp[4098] = {0}; + + // scale + for (i = 0; i < 4096; ++i) { + tmp[i] = in[i] * 0.000244140625f; + } + + AUP_FFTW_rdft(4096, 1, tmp, (int*)AUP_FFTW_g_ip4096, + (float*)AUP_FFTW_g_w4096); + + out[0] = tmp[0]; + out[4095] = tmp[1]; + for (i = 1; i < 4095; i += 2) { + out[i] = tmp[i + 1]; + out[i + 1] = -tmp[i + 2]; + } +} + +void AUP_FFTW_c2r_4096(float* in, float* out) { + int i; + + out[0] = in[0]; + out[1] = in[4095]; + for (i = 2; i < 4096; i += 2) { + out[i] = in[i - 1]; + out[i + 1] = -in[i]; + } + AUP_FFTW_rdft(4096, -1, out, (int*)AUP_FFTW_g_ip4096, + (float*)AUP_FFTW_g_w4096); + for (i = 0; i < 4096; i++) { + out[i] *= 2; + } +} + +// if direction == 0: format1->format2 +// if direction == 1: format2->format1 +void AUP_FFTW_InplaceTransf(int direction, int fftSz, float* inplaceTranfBuf) { + float nyqReal; + int idx; + + if (direction == 0) { + // [Real-0, Real-Nyq, Real-1, Imag-1, Real-2, Imag-2, ...] -> + // [Real-0, Real-1, (-1)*Imag-1, Real-2, (-1)*Imag-2, ..., Real-Nyq] + nyqReal = inplaceTranfBuf[1]; + for (idx = 1; idx < (fftSz - 1); idx += 2) { + inplaceTranfBuf[idx] = inplaceTranfBuf[idx + 1]; + inplaceTranfBuf[idx + 1] = -(inplaceTranfBuf[idx + 2]); + } + inplaceTranfBuf[fftSz - 1] = nyqReal; + } else { + // [Real-0, Real-1, (-1)*Imag-1, Real-2, (-1)*Imag-2, ..., Real-Nyq] -> + // [Real-0, Real-Nyq, Real-1, Imag-1, Real-2, Imag-2, ...] + nyqReal = inplaceTranfBuf[fftSz - 1]; + for (idx = fftSz - 1; idx > 2; idx -= 2) { + inplaceTranfBuf[idx] = -(inplaceTranfBuf[idx - 1]); + inplaceTranfBuf[idx - 1] = inplaceTranfBuf[idx - 2]; + } + inplaceTranfBuf[1] = nyqReal; + } + return; +} + +void AUP_FFTW_RescaleFFTOut(int fftSz, float* inplaceBuf) { + int idx; + for (idx = 0; idx < fftSz; idx++) { + inplaceBuf[idx] *= (float)fftSz; + } + return; +} + +void AUP_FFTW_RescaleIFFTOut(int fftSz, float* inplaceBuf) { + int idx; + for (idx = 0; idx < fftSz; idx++) { + inplaceBuf[idx] *= 0.5f; + } + return; +}