1*a58d3d2aSXin Li /* Copyright (c) 2017-2018 Mozilla
2*a58d3d2aSXin Li Copyright (c) 2023 Amazon */
3*a58d3d2aSXin Li /*
4*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
5*a58d3d2aSXin Li modification, are permitted provided that the following conditions
6*a58d3d2aSXin Li are met:
7*a58d3d2aSXin Li
8*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright
9*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer.
10*a58d3d2aSXin Li
11*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
12*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
13*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
14*a58d3d2aSXin Li
15*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*a58d3d2aSXin Li ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*a58d3d2aSXin Li LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18*a58d3d2aSXin Li A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
19*a58d3d2aSXin Li CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20*a58d3d2aSXin Li EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21*a58d3d2aSXin Li PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22*a58d3d2aSXin Li PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23*a58d3d2aSXin Li LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24*a58d3d2aSXin Li NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*a58d3d2aSXin Li SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li */
27*a58d3d2aSXin Li
28*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
29*a58d3d2aSXin Li #include "config.h"
30*a58d3d2aSXin Li #endif
31*a58d3d2aSXin Li
32*a58d3d2aSXin Li #include <math.h>
33*a58d3d2aSXin Li #include <stdio.h>
34*a58d3d2aSXin Li #include "freq.h"
35*a58d3d2aSXin Li #include "kiss_fft.h"
36*a58d3d2aSXin Li
37*a58d3d2aSXin Li
main(void)38*a58d3d2aSXin Li int main(void) {
39*a58d3d2aSXin Li int i;
40*a58d3d2aSXin Li FILE *file;
41*a58d3d2aSXin Li kiss_fft_state *kfft;
42*a58d3d2aSXin Li float half_window[OVERLAP_SIZE];
43*a58d3d2aSXin Li float dct_table[NB_BANDS*NB_BANDS];
44*a58d3d2aSXin Li
45*a58d3d2aSXin Li file=fopen("lpcnet_tables.c", "wb");
46*a58d3d2aSXin Li fprintf(file, "/* The contents of this file was automatically generated by dump_lpcnet_tables.c*/\n\n");
47*a58d3d2aSXin Li fprintf(file, "#ifdef HAVE_CONFIG_H\n");
48*a58d3d2aSXin Li fprintf(file, "#include \"config.h\"\n");
49*a58d3d2aSXin Li fprintf(file, "#endif\n");
50*a58d3d2aSXin Li
51*a58d3d2aSXin Li fprintf(file, "#include \"kiss_fft.h\"\n\n");
52*a58d3d2aSXin Li
53*a58d3d2aSXin Li kfft = opus_fft_alloc_twiddles(WINDOW_SIZE, NULL, NULL, NULL, 0);
54*a58d3d2aSXin Li
55*a58d3d2aSXin Li fprintf(file, "static const arch_fft_state arch_fft = {0, NULL};\n\n");
56*a58d3d2aSXin Li
57*a58d3d2aSXin Li fprintf (file, "static const opus_int16 fft_bitrev[%d] = {\n", kfft->nfft);
58*a58d3d2aSXin Li for (i=0;i<kfft->nfft;i++)
59*a58d3d2aSXin Li fprintf (file, "%d,%c", kfft->bitrev[i],(i+16)%15==0?'\n':' ');
60*a58d3d2aSXin Li fprintf (file, "};\n\n");
61*a58d3d2aSXin Li
62*a58d3d2aSXin Li fprintf (file, "static const kiss_twiddle_cpx fft_twiddles[%d] = {\n", kfft->nfft);
63*a58d3d2aSXin Li for (i=0;i<kfft->nfft;i++)
64*a58d3d2aSXin Li fprintf (file, "{%#0.9gf, %#0.9gf},%c", kfft->twiddles[i].r, kfft->twiddles[i].i,(i+3)%2==0?'\n':' ');
65*a58d3d2aSXin Li fprintf (file, "};\n\n");
66*a58d3d2aSXin Li
67*a58d3d2aSXin Li
68*a58d3d2aSXin Li fprintf(file, "const kiss_fft_state kfft = {\n");
69*a58d3d2aSXin Li fprintf(file, "%d, /* nfft */\n", kfft->nfft);
70*a58d3d2aSXin Li fprintf(file, "%#0.8gf, /* scale */\n", kfft->scale);
71*a58d3d2aSXin Li fprintf(file, "%d, /* shift */\n", kfft->shift);
72*a58d3d2aSXin Li fprintf(file, "{");
73*a58d3d2aSXin Li for (i=0;i<2*MAXFACTORS;i++) {
74*a58d3d2aSXin Li fprintf(file, "%d, ", kfft->factors[i]);
75*a58d3d2aSXin Li }
76*a58d3d2aSXin Li fprintf(file, "}, /* factors */\n");
77*a58d3d2aSXin Li fprintf(file, "fft_bitrev, /* bitrev*/\n");
78*a58d3d2aSXin Li fprintf(file, "fft_twiddles, /* twiddles*/\n");
79*a58d3d2aSXin Li fprintf(file, "(arch_fft_state *)&arch_fft, /* arch_fft*/\n");
80*a58d3d2aSXin Li
81*a58d3d2aSXin Li fprintf(file, "};\n\n");
82*a58d3d2aSXin Li
83*a58d3d2aSXin Li for (i=0;i<OVERLAP_SIZE;i++)
84*a58d3d2aSXin Li half_window[i] = sin(.5*M_PI*sin(.5*M_PI*(i+.5)/OVERLAP_SIZE) * sin(.5*M_PI*(i+.5)/OVERLAP_SIZE));
85*a58d3d2aSXin Li fprintf(file, "const float half_window[] = {\n");
86*a58d3d2aSXin Li for (i=0;i<OVERLAP_SIZE;i++)
87*a58d3d2aSXin Li fprintf (file, "%#0.9gf,%c", half_window[i],(i+6)%5==0?'\n':' ');
88*a58d3d2aSXin Li fprintf(file, "};\n\n");
89*a58d3d2aSXin Li
90*a58d3d2aSXin Li for (i=0;i<NB_BANDS;i++) {
91*a58d3d2aSXin Li int j;
92*a58d3d2aSXin Li for (j=0;j<NB_BANDS;j++) {
93*a58d3d2aSXin Li dct_table[i*NB_BANDS + j] = cos((i+.5)*j*M_PI/NB_BANDS);
94*a58d3d2aSXin Li if (j==0) dct_table[i*NB_BANDS + j] *= sqrt(.5);
95*a58d3d2aSXin Li }
96*a58d3d2aSXin Li }
97*a58d3d2aSXin Li fprintf(file, "const float dct_table[] = {\n");
98*a58d3d2aSXin Li for (i=0;i<NB_BANDS*NB_BANDS;i++)
99*a58d3d2aSXin Li fprintf (file, "%#0.9gf,%c", dct_table[i],(i+6)%5==0?'\n':' ');
100*a58d3d2aSXin Li fprintf(file, "};\n");
101*a58d3d2aSXin Li
102*a58d3d2aSXin Li fclose(file);
103*a58d3d2aSXin Li return 0;
104*a58d3d2aSXin Li }
105