diff --git a/dnn/Makefile.am b/dnn/Makefile.am index 8f3cb1f2dbd6816ebaa10d008594df332aa5c4b4..3d87ee0289ea69fcd00812dc4f430719661e4724 100644 --- a/dnn/Makefile.am +++ b/dnn/Makefile.am @@ -32,6 +32,7 @@ liblpcnet_la_SOURCES = \ lpcnet.c \ lpcnet_dec.c \ lpcnet_enc.c \ + lpcnet_tables.c \ nnet.c \ nnet_data.c \ plc_data.c \ @@ -56,7 +57,7 @@ lpcnet_demo_LDADD = liblpcnet.la #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) diff --git a/dnn/dump_lpcnet_tables.c b/dnn/dump_lpcnet_tables.c new file mode 100644 index 0000000000000000000000000000000000000000..85eb00c63cafb805a13d5a11ba2dc7f7f79efecd --- /dev/null +++ b/dnn/dump_lpcnet_tables.c @@ -0,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 diff --git a/dnn/freq.c b/dnn/freq.c index 0041fa3352f57625e41cc57cfaa31d1ebe8a3e3f..055af6d9cff405952e0d38e17a88d438737c7530 100644 --- a/dnn/freq.c +++ b/dnn/freq.c @@ -51,12 +51,10 @@ static const float compensation[] = { 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) { @@ -241,32 +239,14 @@ void interp_band_gain(float *g, const float *bandE) { } } -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 dct(float *out, const float *in) { 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 @@ void forward_transform(kiss_fft_cpx *out, const float *in) { 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 @@ void inverse_transform(float *out, const kiss_fft_cpx *in) { 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 @@ void inverse_transform(float *out, const kiss_fft_cpx *in) { 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 @@ float lpc_from_cepstrum(float *lpc, const float *cepstrum) 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]; } } diff --git a/dnn/lpcnet_tables.c b/dnn/lpcnet_tables.c new file mode 100644 index 0000000000000000000000000000000000000000..d17d52cf4e6a96781ea2d64dcefce2694233ce00 --- /dev/null +++ b/dnn/lpcnet_tables.c @@ -0,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, };