ref: 1074e5f03b519f5c0d12a9c83413b28cabcd5f06
parent: 2fc6c71d0964719e8f6727bbc7870e332dae7ecd
author: Jean-Marc Valin <jmvalin@amazon.com>
date: Mon May 15 21:07:44 EDT 2023
Properly handle constant tables LPCNet code should now be fully reentrant
--- a/dnn/Makefile.am
+++ b/dnn/Makefile.am
@@ -32,6 +32,7 @@
lpcnet.c \
lpcnet_dec.c \
lpcnet_enc.c \
+ lpcnet_tables.c \
nnet.c \
nnet_data.c \
plc_data.c \
@@ -56,7 +57,7 @@
#dump_data_SOURCES = dump_data.c
#dump_data_LDADD = $(DUMP_OBJ) $(LIBM)
-dump_data_SOURCES = common.c dump_data.c burg.c freq.c kiss_fft.c pitch.c lpcnet_dec.c lpcnet_enc.c ceps_codebooks.c
+dump_data_SOURCES = common.c dump_data.c burg.c freq.c kiss_fft.c pitch.c lpcnet_dec.c lpcnet_enc.c lpcnet_tables.c ceps_codebooks.c
dump_data_LDADD = $(LIBM)
dump_data_CFLAGS = $(AM_CFLAGS)
--- /dev/null
+++ b/dnn/dump_lpcnet_tables.c
@@ -1,0 +1,96 @@
+/* Copyright (c) 2017-2018 Mozilla
+ Copyright (c) 2023 Amazon */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <math.h>
+#include <stdio.h>
+#include "freq.h"
+#include "kiss_fft.h"
+
+
+int main(void) {+ int i;
+ FILE *file;
+ kiss_fft_state *kfft;
+ float half_window[OVERLAP_SIZE];
+ float dct_table[NB_BANDS*NB_BANDS];
+
+ file=fopen("lpcnet_tables.c", "wb");+ fprintf(file, "/* The contents of this file was automatically generated by dump_lpcnet_tables.c*/\n\n");
+ fprintf(file, "#include \"kiss_fft.h\"\n\n");
+
+ kfft = opus_fft_alloc_twiddles(WINDOW_SIZE, NULL, NULL, NULL, 0);
+
+ fprintf(file, "static const arch_fft_state arch_fft = {0, NULL};\n\n");+
+ fprintf (file, "static const opus_int16 fft_bitrev[%d] = {\n", kfft->nfft);+ for (i=0;i<kfft->nfft;i++)
+ fprintf (file, "%d,%c", kfft->bitrev[i],(i+16)%15==0?'\n':' ');
+ fprintf (file, "};\n\n");
+
+ fprintf (file, "static const kiss_twiddle_cpx fft_twiddles[%d] = {\n", kfft->nfft);+ for (i=0;i<kfft->nfft;i++)
+ fprintf (file, "{%#0.9gf, %#0.9gf},%c", kfft->twiddles[i].r, kfft->twiddles[i].i,(i+3)%2==0?'\n':' ');+ fprintf (file, "};\n\n");
+
+
+ fprintf(file, "const kiss_fft_state kfft = {\n");+ fprintf(file, "%d, /* nfft */\n", kfft->nfft);
+ fprintf(file, "%#0.8gf, /* scale */\n", kfft->scale);
+ fprintf(file, "%d, /* shift */\n", kfft->shift);
+ fprintf(file, "{");+ for (i=0;i<2*MAXFACTORS;i++) {+ fprintf(file, "%d, ", kfft->factors[i]);
+ }
+ fprintf(file, "}, /* factors */\n");
+ fprintf(file, "fft_bitrev, /* bitrev*/\n");
+ fprintf(file, "fft_twiddles, /* twiddles*/\n");
+ fprintf(file, "(arch_fft_state *)&arch_fft, /* arch_fft*/\n");
+
+ fprintf(file, "};\n\n");
+
+ for (i=0;i<OVERLAP_SIZE;i++)
+ half_window[i] = sin(.5*M_PI*sin(.5*M_PI*(i+.5)/OVERLAP_SIZE) * sin(.5*M_PI*(i+.5)/OVERLAP_SIZE));
+ fprintf(file, "const float half_window[] = {\n");+ for (i=0;i<OVERLAP_SIZE;i++)
+ fprintf (file, "%#0.9gf,%c", half_window[i],(i+6)%5==0?'\n':' ');
+ fprintf(file, "};\n\n");
+
+ for (i=0;i<NB_BANDS;i++) {+ int j;
+ for (j=0;j<NB_BANDS;j++) {+ dct_table[i*NB_BANDS + j] = cos((i+.5)*j*M_PI/NB_BANDS);
+ if (j==0) dct_table[i*NB_BANDS + j] *= sqrt(.5);
+ }
+ }
+ fprintf(file, "const float dct_table[] = {\n");+ for (i=0;i<NB_BANDS*NB_BANDS;i++)
+ fprintf (file, "%#0.9gf,%c", dct_table[i],(i+6)%5==0?'\n':' ');
+ fprintf(file, "};\n");
+
+ fclose(file);
+ return 0;
+}
\ No newline at end of file
--- a/dnn/freq.c
+++ b/dnn/freq.c
@@ -51,14 +51,12 @@
0.8f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 0.666667f, 0.5f, 0.5f, 0.5f, 0.333333f, 0.25f, 0.25f, 0.2f, 0.166667f, 0.173913f
};
-typedef struct {- int init;
- kiss_fft_state *kfft;
- float half_window[OVERLAP_SIZE];
- float dct_table[NB_BANDS*NB_BANDS];
-} CommonState;
+extern const kiss_fft_state kfft;
+extern const float half_window[OVERLAP_SIZE];
+extern const float dct_table[NB_BANDS*NB_BANDS];
+
void compute_band_energy_inverse(float *bandE, const kiss_fft_cpx *X) {int i;
float sum[NB_BANDS] = {0};@@ -241,32 +239,14 @@
}
}
-CommonState common;
-static void check_init(void) {- int i;
- if (common.init) return;
- common.kfft = opus_fft_alloc_twiddles(WINDOW_SIZE, NULL, NULL, NULL, 0);
- for (i=0;i<OVERLAP_SIZE;i++)
- common.half_window[i] = sin(.5*M_PI*sin(.5*M_PI*(i+.5)/OVERLAP_SIZE) * sin(.5*M_PI*(i+.5)/OVERLAP_SIZE));
- for (i=0;i<NB_BANDS;i++) {- int j;
- for (j=0;j<NB_BANDS;j++) {- common.dct_table[i*NB_BANDS + j] = cos((i+.5)*j*M_PI/NB_BANDS);
- if (j==0) common.dct_table[i*NB_BANDS + j] *= sqrt(.5);
- }
- }
- common.init = 1;
-}
-
void dct(float *out, const float *in) {int i;
- check_init();
for (i=0;i<NB_BANDS;i++) {int j;
float sum = 0;
for (j=0;j<NB_BANDS;j++) {- sum += in[j] * common.dct_table[j*NB_BANDS + i];
+ sum += in[j] * dct_table[j*NB_BANDS + i];
}
out[i] = sum*sqrt(2./NB_BANDS);
}
@@ -274,12 +254,11 @@
void idct(float *out, const float *in) {int i;
- check_init();
for (i=0;i<NB_BANDS;i++) {int j;
float sum = 0;
for (j=0;j<NB_BANDS;j++) {- sum += in[j] * common.dct_table[i*NB_BANDS + j];
+ sum += in[j] * dct_table[i*NB_BANDS + j];
}
out[i] = sum*sqrt(2./NB_BANDS);
}
@@ -289,12 +268,11 @@
int i;
kiss_fft_cpx x[WINDOW_SIZE];
kiss_fft_cpx y[WINDOW_SIZE];
- check_init();
for (i=0;i<WINDOW_SIZE;i++) {x[i].r = in[i];
x[i].i = 0;
}
- opus_fft(common.kfft, x, y, 0);
+ opus_fft(&kfft, x, y, 0);
for (i=0;i<FREQ_SIZE;i++) {out[i] = y[i];
}
@@ -304,7 +282,6 @@
int i;
kiss_fft_cpx x[WINDOW_SIZE];
kiss_fft_cpx y[WINDOW_SIZE];
- check_init();
for (i=0;i<FREQ_SIZE;i++) {x[i] = in[i];
}
@@ -312,7 +289,7 @@
x[i].r = x[WINDOW_SIZE - i].r;
x[i].i = -x[WINDOW_SIZE - i].i;
}
- opus_fft(common.kfft, x, y, 0);
+ opus_fft(&kfft, x, y, 0);
/* output in reverse order for IFFT. */
out[0] = WINDOW_SIZE*y[0].r;
for (i=1;i<WINDOW_SIZE;i++) {@@ -369,10 +346,9 @@
void apply_window(float *x) {int i;
- check_init();
for (i=0;i<OVERLAP_SIZE;i++) {- x[i] *= common.half_window[i];
- x[WINDOW_SIZE - 1 - i] *= common.half_window[i];
+ x[i] *= half_window[i];
+ x[WINDOW_SIZE - 1 - i] *= half_window[i];
}
}
--- /dev/null
+++ b/dnn/lpcnet_tables.c
@@ -1,0 +1,304 @@
+/* The contents of this file was automatically generated by dump_lpcnet_tables.c*/
+
+#include "kiss_fft.h"
+
+static const arch_fft_state arch_fft = {0, NULL};+
+static const opus_int16 fft_bitrev[320] = {+0, 64, 128, 192, 256, 16, 80, 144, 208, 272, 32, 96, 160, 224, 288,
+48, 112, 176, 240, 304, 4, 68, 132, 196, 260, 20, 84, 148, 212, 276,
+36, 100, 164, 228, 292, 52, 116, 180, 244, 308, 8, 72, 136, 200, 264,
+24, 88, 152, 216, 280, 40, 104, 168, 232, 296, 56, 120, 184, 248, 312,
+12, 76, 140, 204, 268, 28, 92, 156, 220, 284, 44, 108, 172, 236, 300,
+60, 124, 188, 252, 316, 1, 65, 129, 193, 257, 17, 81, 145, 209, 273,
+33, 97, 161, 225, 289, 49, 113, 177, 241, 305, 5, 69, 133, 197, 261,
+21, 85, 149, 213, 277, 37, 101, 165, 229, 293, 53, 117, 181, 245, 309,
+9, 73, 137, 201, 265, 25, 89, 153, 217, 281, 41, 105, 169, 233, 297,
+57, 121, 185, 249, 313, 13, 77, 141, 205, 269, 29, 93, 157, 221, 285,
+45, 109, 173, 237, 301, 61, 125, 189, 253, 317, 2, 66, 130, 194, 258,
+18, 82, 146, 210, 274, 34, 98, 162, 226, 290, 50, 114, 178, 242, 306,
+6, 70, 134, 198, 262, 22, 86, 150, 214, 278, 38, 102, 166, 230, 294,
+54, 118, 182, 246, 310, 10, 74, 138, 202, 266, 26, 90, 154, 218, 282,
+42, 106, 170, 234, 298, 58, 122, 186, 250, 314, 14, 78, 142, 206, 270,
+30, 94, 158, 222, 286, 46, 110, 174, 238, 302, 62, 126, 190, 254, 318,
+3, 67, 131, 195, 259, 19, 83, 147, 211, 275, 35, 99, 163, 227, 291,
+51, 115, 179, 243, 307, 7, 71, 135, 199, 263, 23, 87, 151, 215, 279,
+39, 103, 167, 231, 295, 55, 119, 183, 247, 311, 11, 75, 139, 203, 267,
+27, 91, 155, 219, 283, 43, 107, 171, 235, 299, 59, 123, 187, 251, 315,
+15, 79, 143, 207, 271, 31, 95, 159, 223, 287, 47, 111, 175, 239, 303,
+63, 127, 191, 255, 319, };
+
+static const kiss_twiddle_cpx fft_twiddles[320] = {+{1.00000000f, -0.00000000f}, {0.999807239f, -0.0196336918f},+{0.999229014f, -0.0392598175f}, {0.998265624f, -0.0588708036f},+{0.996917307f, -0.0784590989f}, {0.995184720f, -0.0980171412f},+{0.993068457f, -0.117537394f}, {0.990569353f, -0.137012348f},+{0.987688363f, -0.156434461f}, {0.984426558f, -0.175796285f},+{0.980785251f, -0.195090324f}, {0.976765871f, -0.214309156f},+{0.972369909f, -0.233445361f}, {0.967599094f, -0.252491564f},+{0.962455213f, -0.271440446f}, {0.956940353f, -0.290284663f},+{0.951056540f, -0.309017003f}, {0.944806039f, -0.327630192f},+{0.938191354f, -0.346117049f}, {0.931214929f, -0.364470512f},+{0.923879504f, -0.382683426f}, {0.916187942f, -0.400748819f},+{0.908143163f, -0.418659747f}, {0.899748266f, -0.436409235f},+{0.891006529f, -0.453990489f}, {0.881921291f, -0.471396744f},+{0.872496009f, -0.488621235f}, {0.862734377f, -0.505657375f},+{0.852640152f, -0.522498548f}, {0.842217207f, -0.539138317f},+{0.831469595f, -0.555570245f}, {0.820401430f, -0.571787953f},+{0.809017003f, -0.587785244f}, {0.797320664f, -0.603555918f},+{0.785316944f, -0.619093955f}, {0.773010433f, -0.634393275f},+{0.760405958f, -0.649448037f}, {0.747508347f, -0.664252460f},+{0.734322488f, -0.678800762f}, {0.720853567f, -0.693087339f},+{0.707106769f, -0.707106769f}, {0.693087339f, -0.720853567f},+{0.678800762f, -0.734322488f}, {0.664252460f, -0.747508347f},+{0.649448037f, -0.760405958f}, {0.634393275f, -0.773010433f},+{0.619093955f, -0.785316944f}, {0.603555918f, -0.797320664f},+{0.587785244f, -0.809017003f}, {0.571787953f, -0.820401430f},+{0.555570245f, -0.831469595f}, {0.539138317f, -0.842217207f},+{0.522498548f, -0.852640152f}, {0.505657375f, -0.862734377f},+{0.488621235f, -0.872496009f}, {0.471396744f, -0.881921291f},+{0.453990489f, -0.891006529f}, {0.436409235f, -0.899748266f},+{0.418659747f, -0.908143163f}, {0.400748819f, -0.916187942f},+{0.382683426f, -0.923879504f}, {0.364470512f, -0.931214929f},+{0.346117049f, -0.938191354f}, {0.327630192f, -0.944806039f},+{0.309017003f, -0.951056540f}, {0.290284663f, -0.956940353f},+{0.271440446f, -0.962455213f}, {0.252491564f, -0.967599094f},+{0.233445361f, -0.972369909f}, {0.214309156f, -0.976765871f},+{0.195090324f, -0.980785251f}, {0.175796285f, -0.984426558f},+{0.156434461f, -0.987688363f}, {0.137012348f, -0.990569353f},+{0.117537394f, -0.993068457f}, {0.0980171412f, -0.995184720f},+{0.0784590989f, -0.996917307f}, {0.0588708036f, -0.998265624f},+{0.0392598175f, -0.999229014f}, {0.0196336918f, -0.999807239f},+{6.12323426e-17f, -1.00000000f}, {-0.0196336918f, -0.999807239f},+{-0.0392598175f, -0.999229014f}, {-0.0588708036f, -0.998265624f},+{-0.0784590989f, -0.996917307f}, {-0.0980171412f, -0.995184720f},+{-0.117537394f, -0.993068457f}, {-0.137012348f, -0.990569353f},+{-0.156434461f, -0.987688363f}, {-0.175796285f, -0.984426558f},+{-0.195090324f, -0.980785251f}, {-0.214309156f, -0.976765871f},+{-0.233445361f, -0.972369909f}, {-0.252491564f, -0.967599094f},+{-0.271440446f, -0.962455213f}, {-0.290284663f, -0.956940353f},+{-0.309017003f, -0.951056540f}, {-0.327630192f, -0.944806039f},+{-0.346117049f, -0.938191354f}, {-0.364470512f, -0.931214929f},+{-0.382683426f, -0.923879504f}, {-0.400748819f, -0.916187942f},+{-0.418659747f, -0.908143163f}, {-0.436409235f, -0.899748266f},+{-0.453990489f, -0.891006529f}, {-0.471396744f, -0.881921291f},+{-0.488621235f, -0.872496009f}, {-0.505657375f, -0.862734377f},+{-0.522498548f, -0.852640152f}, {-0.539138317f, -0.842217207f},+{-0.555570245f, -0.831469595f}, {-0.571787953f, -0.820401430f},+{-0.587785244f, -0.809017003f}, {-0.603555918f, -0.797320664f},+{-0.619093955f, -0.785316944f}, {-0.634393275f, -0.773010433f},+{-0.649448037f, -0.760405958f}, {-0.664252460f, -0.747508347f},+{-0.678800762f, -0.734322488f}, {-0.693087339f, -0.720853567f},+{-0.707106769f, -0.707106769f}, {-0.720853567f, -0.693087339f},+{-0.734322488f, -0.678800762f}, {-0.747508347f, -0.664252460f},+{-0.760405958f, -0.649448037f}, {-0.773010433f, -0.634393275f},+{-0.785316944f, -0.619093955f}, {-0.797320664f, -0.603555918f},+{-0.809017003f, -0.587785244f}, {-0.820401430f, -0.571787953f},+{-0.831469595f, -0.555570245f}, {-0.842217207f, -0.539138317f},+{-0.852640152f, -0.522498548f}, {-0.862734377f, -0.505657375f},+{-0.872496009f, -0.488621235f}, {-0.881921291f, -0.471396744f},+{-0.891006529f, -0.453990489f}, {-0.899748266f, -0.436409235f},+{-0.908143163f, -0.418659747f}, {-0.916187942f, -0.400748819f},+{-0.923879504f, -0.382683426f}, {-0.931214929f, -0.364470512f},+{-0.938191354f, -0.346117049f}, {-0.944806039f, -0.327630192f},+{-0.951056540f, -0.309017003f}, {-0.956940353f, -0.290284663f},+{-0.962455213f, -0.271440446f}, {-0.967599094f, -0.252491564f},+{-0.972369909f, -0.233445361f}, {-0.976765871f, -0.214309156f},+{-0.980785251f, -0.195090324f}, {-0.984426558f, -0.175796285f},+{-0.987688363f, -0.156434461f}, {-0.990569353f, -0.137012348f},+{-0.993068457f, -0.117537394f}, {-0.995184720f, -0.0980171412f},+{-0.996917307f, -0.0784590989f}, {-0.998265624f, -0.0588708036f},+{-0.999229014f, -0.0392598175f}, {-0.999807239f, -0.0196336918f},+{-1.00000000f, -1.22464685e-16f}, {-0.999807239f, 0.0196336918f},+{-0.999229014f, 0.0392598175f}, {-0.998265624f, 0.0588708036f},+{-0.996917307f, 0.0784590989f}, {-0.995184720f, 0.0980171412f},+{-0.993068457f, 0.117537394f}, {-0.990569353f, 0.137012348f},+{-0.987688363f, 0.156434461f}, {-0.984426558f, 0.175796285f},+{-0.980785251f, 0.195090324f}, {-0.976765871f, 0.214309156f},+{-0.972369909f, 0.233445361f}, {-0.967599094f, 0.252491564f},+{-0.962455213f, 0.271440446f}, {-0.956940353f, 0.290284663f},+{-0.951056540f, 0.309017003f}, {-0.944806039f, 0.327630192f},+{-0.938191354f, 0.346117049f}, {-0.931214929f, 0.364470512f},+{-0.923879504f, 0.382683426f}, {-0.916187942f, 0.400748819f},+{-0.908143163f, 0.418659747f}, {-0.899748266f, 0.436409235f},+{-0.891006529f, 0.453990489f}, {-0.881921291f, 0.471396744f},+{-0.872496009f, 0.488621235f}, {-0.862734377f, 0.505657375f},+{-0.852640152f, 0.522498548f}, {-0.842217207f, 0.539138317f},+{-0.831469595f, 0.555570245f}, {-0.820401430f, 0.571787953f},+{-0.809017003f, 0.587785244f}, {-0.797320664f, 0.603555918f},+{-0.785316944f, 0.619093955f}, {-0.773010433f, 0.634393275f},+{-0.760405958f, 0.649448037f}, {-0.747508347f, 0.664252460f},+{-0.734322488f, 0.678800762f}, {-0.720853567f, 0.693087339f},+{-0.707106769f, 0.707106769f}, {-0.693087339f, 0.720853567f},+{-0.678800762f, 0.734322488f}, {-0.664252460f, 0.747508347f},+{-0.649448037f, 0.760405958f}, {-0.634393275f, 0.773010433f},+{-0.619093955f, 0.785316944f}, {-0.603555918f, 0.797320664f},+{-0.587785244f, 0.809017003f}, {-0.571787953f, 0.820401430f},+{-0.555570245f, 0.831469595f}, {-0.539138317f, 0.842217207f},+{-0.522498548f, 0.852640152f}, {-0.505657375f, 0.862734377f},+{-0.488621235f, 0.872496009f}, {-0.471396744f, 0.881921291f},+{-0.453990489f, 0.891006529f}, {-0.436409235f, 0.899748266f},+{-0.418659747f, 0.908143163f}, {-0.400748819f, 0.916187942f},+{-0.382683426f, 0.923879504f}, {-0.364470512f, 0.931214929f},+{-0.346117049f, 0.938191354f}, {-0.327630192f, 0.944806039f},+{-0.309017003f, 0.951056540f}, {-0.290284663f, 0.956940353f},+{-0.271440446f, 0.962455213f}, {-0.252491564f, 0.967599094f},+{-0.233445361f, 0.972369909f}, {-0.214309156f, 0.976765871f},+{-0.195090324f, 0.980785251f}, {-0.175796285f, 0.984426558f},+{-0.156434461f, 0.987688363f}, {-0.137012348f, 0.990569353f},+{-0.117537394f, 0.993068457f}, {-0.0980171412f, 0.995184720f},+{-0.0784590989f, 0.996917307f}, {-0.0588708036f, 0.998265624f},+{-0.0392598175f, 0.999229014f}, {-0.0196336918f, 0.999807239f},+{-1.83697015e-16f, 1.00000000f}, {0.0196336918f, 0.999807239f},+{0.0392598175f, 0.999229014f}, {0.0588708036f, 0.998265624f},+{0.0784590989f, 0.996917307f}, {0.0980171412f, 0.995184720f},+{0.117537394f, 0.993068457f}, {0.137012348f, 0.990569353f},+{0.156434461f, 0.987688363f}, {0.175796285f, 0.984426558f},+{0.195090324f, 0.980785251f}, {0.214309156f, 0.976765871f},+{0.233445361f, 0.972369909f}, {0.252491564f, 0.967599094f},+{0.271440446f, 0.962455213f}, {0.290284663f, 0.956940353f},+{0.309017003f, 0.951056540f}, {0.327630192f, 0.944806039f},+{0.346117049f, 0.938191354f}, {0.364470512f, 0.931214929f},+{0.382683426f, 0.923879504f}, {0.400748819f, 0.916187942f},+{0.418659747f, 0.908143163f}, {0.436409235f, 0.899748266f},+{0.453990489f, 0.891006529f}, {0.471396744f, 0.881921291f},+{0.488621235f, 0.872496009f}, {0.505657375f, 0.862734377f},+{0.522498548f, 0.852640152f}, {0.539138317f, 0.842217207f},+{0.555570245f, 0.831469595f}, {0.571787953f, 0.820401430f},+{0.587785244f, 0.809017003f}, {0.603555918f, 0.797320664f},+{0.619093955f, 0.785316944f}, {0.634393275f, 0.773010433f},+{0.649448037f, 0.760405958f}, {0.664252460f, 0.747508347f},+{0.678800762f, 0.734322488f}, {0.693087339f, 0.720853567f},+{0.707106769f, 0.707106769f}, {0.720853567f, 0.693087339f},+{0.734322488f, 0.678800762f}, {0.747508347f, 0.664252460f},+{0.760405958f, 0.649448037f}, {0.773010433f, 0.634393275f},+{0.785316944f, 0.619093955f}, {0.797320664f, 0.603555918f},+{0.809017003f, 0.587785244f}, {0.820401430f, 0.571787953f},+{0.831469595f, 0.555570245f}, {0.842217207f, 0.539138317f},+{0.852640152f, 0.522498548f}, {0.862734377f, 0.505657375f},+{0.872496009f, 0.488621235f}, {0.881921291f, 0.471396744f},+{0.891006529f, 0.453990489f}, {0.899748266f, 0.436409235f},+{0.908143163f, 0.418659747f}, {0.916187942f, 0.400748819f},+{0.923879504f, 0.382683426f}, {0.931214929f, 0.364470512f},+{0.938191354f, 0.346117049f}, {0.944806039f, 0.327630192f},+{0.951056540f, 0.309017003f}, {0.956940353f, 0.290284663f},+{0.962455213f, 0.271440446f}, {0.967599094f, 0.252491564f},+{0.972369909f, 0.233445361f}, {0.976765871f, 0.214309156f},+{0.980785251f, 0.195090324f}, {0.984426558f, 0.175796285f},+{0.987688363f, 0.156434461f}, {0.990569353f, 0.137012348f},+{0.993068457f, 0.117537394f}, {0.995184720f, 0.0980171412f},+{0.996917307f, 0.0784590989f}, {0.998265624f, 0.0588708036f},+{0.999229014f, 0.0392598175f}, {0.999807239f, 0.0196336918f},+};
+
+const kiss_fft_state kfft = {+320, /* nfft */
+0.0031250000f, /* scale */
+-1, /* shift */
+{5, 64, 4, 16, 4, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */+fft_bitrev, /* bitrev*/
+fft_twiddles, /* twiddles*/
+(arch_fft_state *)&arch_fft, /* arch_fft*/
+};
+
+const float half_window[] = {+3.78491532e-05f, 0.000340620492f, 0.000946046319f, 0.00185389258f, 0.00306380726f,
+0.00457531959f, 0.00638783723f, 0.00850064680f, 0.0109129101f, 0.0136236614f,
+0.0166318044f, 0.0199361145f, 0.0235352255f, 0.0274276342f, 0.0316116922f,
+0.0360856056f, 0.0408474281f, 0.0458950549f, 0.0512262285f, 0.0568385124f,
+0.0627293140f, 0.0688958541f, 0.0753351897f, 0.0820441842f, 0.0890194997f,
+0.0962576419f, 0.103754878f, 0.111507311f, 0.119510807f, 0.127761051f,
+0.136253506f, 0.144983411f, 0.153945804f, 0.163135484f, 0.172547072f,
+0.182174906f, 0.192013159f, 0.202055752f, 0.212296382f, 0.222728521f,
+0.233345464f, 0.244140238f, 0.255105674f, 0.266234398f, 0.277518868f,
+0.288951218f, 0.300523549f, 0.312227666f, 0.324055225f, 0.335997701f,
+0.348046392f, 0.360192508f, 0.372427016f, 0.384740859f, 0.397124738f,
+0.409569323f, 0.422065198f, 0.434602767f, 0.447172493f, 0.459764689f,
+0.472369671f, 0.484977663f, 0.497579008f, 0.510163903f, 0.522722721f,
+0.535245717f, 0.547723293f, 0.560145974f, 0.572504222f, 0.584788740f,
+0.596990347f, 0.609099925f, 0.621108532f, 0.633007407f, 0.644788086f,
+0.656442165f, 0.667961538f, 0.679338276f, 0.690564752f, 0.701633692f,
+0.712537885f, 0.723270535f, 0.733825266f, 0.744195819f, 0.754376352f,
+0.764361382f, 0.774145722f, 0.783724606f, 0.793093503f, 0.802248418f,
+0.811185598f, 0.819901764f, 0.828393936f, 0.836659551f, 0.844696403f,
+0.852502763f, 0.860077202f, 0.867418647f, 0.874526560f, 0.881400526f,
+0.888040781f, 0.894447744f, 0.900622249f, 0.906565487f, 0.912279010f,
+0.917764664f, 0.923024654f, 0.928061485f, 0.932878017f, 0.937477291f,
+0.941862822f, 0.946038187f, 0.950007319f, 0.953774393f, 0.957343817f,
+0.960720181f, 0.963908315f, 0.966913164f, 0.969739914f, 0.972393870f,
+0.974880517f, 0.977205336f, 0.979374051f, 0.981392324f, 0.983266115f,
+0.985001266f, 0.986603677f, 0.988079309f, 0.989434063f, 0.990674019f,
+0.991804957f, 0.992832899f, 0.993763626f, 0.994602919f, 0.995356441f,
+0.996029854f, 0.996628702f, 0.997158289f, 0.997623861f, 0.998030603f,
+0.998383403f, 0.998687088f, 0.998946249f, 0.999165416f, 0.999348700f,
+0.999500215f, 0.999623775f, 0.999723017f, 0.999801278f, 0.999861658f,
+0.999907196f, 0.999940455f, 0.999963880f, 0.999979615f, 0.999989510f,
+0.999995291f, 0.999998271f, 0.999999523f, 0.999999940f, 1.00000000f,
+};
+
+const float dct_table[] = {+0.707106769f, 0.996194720f, 0.984807730f, 0.965925813f, 0.939692616f,
+0.906307817f, 0.866025388f, 0.819152057f, 0.766044438f, 0.707106769f,
+0.642787635f, 0.573576450f, 0.500000000f, 0.422618270f, 0.342020154f,
+0.258819044f, 0.173648179f, 0.0871557444f, 0.707106769f, 0.965925813f,
+0.866025388f, 0.707106769f, 0.500000000f, 0.258819044f, 6.12323426e-17f,
+-0.258819044f, -0.500000000f, -0.707106769f, -0.866025388f, -0.965925813f,
+-1.00000000f, -0.965925813f, -0.866025388f, -0.707106769f, -0.500000000f,
+-0.258819044f, 0.707106769f, 0.906307817f, 0.642787635f, 0.258819044f,
+-0.173648179f, -0.573576450f, -0.866025388f, -0.996194720f, -0.939692616f,
+-0.707106769f, -0.342020154f, 0.0871557444f, 0.500000000f, 0.819152057f,
+0.984807730f, 0.965925813f, 0.766044438f, 0.422618270f, 0.707106769f,
+0.819152057f, 0.342020154f, -0.258819044f, -0.766044438f, -0.996194720f,
+-0.866025388f, -0.422618270f, 0.173648179f, 0.707106769f, 0.984807730f,
+0.906307817f, 0.500000000f, -0.0871557444f, -0.642787635f, -0.965925813f,
+-0.939692616f, -0.573576450f, 0.707106769f, 0.707106769f, 6.12323426e-17f,
+-0.707106769f, -1.00000000f, -0.707106769f, -1.83697015e-16f, 0.707106769f,
+1.00000000f, 0.707106769f, 3.06161700e-16f, -0.707106769f, -1.00000000f,
+-0.707106769f, -4.28626385e-16f, 0.707106769f, 1.00000000f, 0.707106769f,
+0.707106769f, 0.573576450f, -0.342020154f, -0.965925813f, -0.766044438f,
+0.0871557444f, 0.866025388f, 0.906307817f, 0.173648179f, -0.707106769f,
+-0.984807730f, -0.422618270f, 0.500000000f, 0.996194720f, 0.642787635f,
+-0.258819044f, -0.939692616f, -0.819152057f, 0.707106769f, 0.422618270f,
+-0.642787635f, -0.965925813f, -0.173648179f, 0.819152057f, 0.866025388f,
+-0.0871557444f, -0.939692616f, -0.707106769f, 0.342020154f, 0.996194720f,
+0.500000000f, -0.573576450f, -0.984807730f, -0.258819044f, 0.766044438f,
+0.906307817f, 0.707106769f, 0.258819044f, -0.866025388f, -0.707106769f,
+0.500000000f, 0.965925813f, 3.06161700e-16f, -0.965925813f, -0.500000000f,
+0.707106769f, 0.866025388f, -0.258819044f, -1.00000000f, -0.258819044f,
+0.866025388f, 0.707106769f, -0.500000000f, -0.965925813f, 0.707106769f,
+0.0871557444f, -0.984807730f, -0.258819044f, 0.939692616f, 0.422618270f,
+-0.866025388f, -0.573576450f, 0.766044438f, 0.707106769f, -0.642787635f,
+-0.819152057f, 0.500000000f, 0.906307817f, -0.342020154f, -0.965925813f,
+0.173648179f, 0.996194720f, 0.707106769f, -0.0871557444f, -0.984807730f,
+0.258819044f, 0.939692616f, -0.422618270f, -0.866025388f, 0.573576450f,
+0.766044438f, -0.707106769f, -0.642787635f, 0.819152057f, 0.500000000f,
+-0.906307817f, -0.342020154f, 0.965925813f, 0.173648179f, -0.996194720f,
+0.707106769f, -0.258819044f, -0.866025388f, 0.707106769f, 0.500000000f,
+-0.965925813f, -4.28626385e-16f, 0.965925813f, -0.500000000f, -0.707106769f,
+0.866025388f, 0.258819044f, -1.00000000f, 0.258819044f, 0.866025388f,
+-0.707106769f, -0.500000000f, 0.965925813f, 0.707106769f, -0.422618270f,
+-0.642787635f, 0.965925813f, -0.173648179f, -0.819152057f, 0.866025388f,
+0.0871557444f, -0.939692616f, 0.707106769f, 0.342020154f, -0.996194720f,
+0.500000000f, 0.573576450f, -0.984807730f, 0.258819044f, 0.766044438f,
+-0.906307817f, 0.707106769f, -0.573576450f, -0.342020154f, 0.965925813f,
+-0.766044438f, -0.0871557444f, 0.866025388f, -0.906307817f, 0.173648179f,
+0.707106769f, -0.984807730f, 0.422618270f, 0.500000000f, -0.996194720f,
+0.642787635f, 0.258819044f, -0.939692616f, 0.819152057f, 0.707106769f,
+-0.707106769f, -1.83697015e-16f, 0.707106769f, -1.00000000f, 0.707106769f,
+5.51091070e-16f, -0.707106769f, 1.00000000f, -0.707106769f, -2.69484189e-15f,
+0.707106769f, -1.00000000f, 0.707106769f, -4.90477710e-16f, -0.707106769f,
+1.00000000f, -0.707106769f, 0.707106769f, -0.819152057f, 0.342020154f,
+0.258819044f, -0.766044438f, 0.996194720f, -0.866025388f, 0.422618270f,
+0.173648179f, -0.707106769f, 0.984807730f, -0.906307817f, 0.500000000f,
+0.0871557444f, -0.642787635f, 0.965925813f, -0.939692616f, 0.573576450f,
+0.707106769f, -0.906307817f, 0.642787635f, -0.258819044f, -0.173648179f,
+0.573576450f, -0.866025388f, 0.996194720f, -0.939692616f, 0.707106769f,
+-0.342020154f, -0.0871557444f, 0.500000000f, -0.819152057f, 0.984807730f,
+-0.965925813f, 0.766044438f, -0.422618270f, 0.707106769f, -0.965925813f,
+0.866025388f, -0.707106769f, 0.500000000f, -0.258819044f, 1.10280111e-15f,
+0.258819044f, -0.500000000f, 0.707106769f, -0.866025388f, 0.965925813f,
+-1.00000000f, 0.965925813f, -0.866025388f, 0.707106769f, -0.500000000f,
+0.258819044f, 0.707106769f, -0.996194720f, 0.984807730f, -0.965925813f,
+0.939692616f, -0.906307817f, 0.866025388f, -0.819152057f, 0.766044438f,
+-0.707106769f, 0.642787635f, -0.573576450f, 0.500000000f, -0.422618270f,
+0.342020154f, -0.258819044f, 0.173648179f, -0.0871557444f, };
--
⑨