annotate libtwamr/r_fft.c @ 548:583dc4cbee95

efrtest: new program gsmefr-decode-tw5-r
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 04 Oct 2024 20:40:42 +0000
parents 810ac4b99025
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
412
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 *****************************************************************************
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * R99 Version 3.3.0
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * REL-4 Version 4.1.0
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 *****************************************************************************
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * File : r_fft.c
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 * Purpose : Fast Fourier Transform (FFT) algorithm
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 *****************************************************************************
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 /*****************************************************************
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 * This is an implementation of decimation-in-time FFT algorithm for
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 * real sequences. The techniques used here can be found in several
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 * books, e.g., i) Proakis and Manolakis, "Digital Signal Processing",
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 * 2nd Edition, Chapter 9, and ii) W.H. Press et. al., "Numerical
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 * Recipes in C", 2nd Ediiton, Chapter 12.
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 * Input - There is one input to this function:
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 * 1) An integer pointer to the input data array
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 * Output - There is no return value.
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 * The input data are replaced with transformed data. If the
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 * input is a real time domain sequence, it is replaced with
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 * the complex FFT for positive frequencies. The FFT value
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 * for DC and the foldover frequency are combined to form the
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 * first complex number in the array. The remaining complex
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 * numbers correspond to increasing frequencies. If the input
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 * is a complex frequency domain sequence arranged as above,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 * it is replaced with the corresponding time domain sequence.
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 * Notes:
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 * 1) This function is designed to be a part of a VAD
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 * algorithm that requires 128-point FFT of real
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 * sequences. This is achieved here through a 64-point
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 * complex FFT. Consequently, the FFT size information is
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 * not transmitted explicitly. However, some flexibility
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 * is provided in the function to change the size of the
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 * FFT by specifying the size information through "define"
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 * statements.
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 * 2) The values of the complex sinusoids used in the FFT
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 * algorithm are stored in a ROM table.
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 * 3) In the c_fft function, the FFT values are divided by
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 * 2 after each stage of computation thus dividing the
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 * final FFT values by 64. This is somewhat different
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 * from the usual definition of FFT where the factor 1/N,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 * i.e., 1/64, used for the IFFT and not the FFT. No factor
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 * is used in the r_fft function.
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 *
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 *****************************************************************/
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 #include "tw_amr.h"
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 #include "namespace.h"
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 #include "typedef.h"
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 #include "cnst.h"
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 #include "basic_op.h"
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 #include "oper_32b.h"
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 #include "no_count.h"
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 #include "vad2.h"
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 #define SIZE 128
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 #define SIZE_BY_TWO 64
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 #define NUM_STAGE 6
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 #define TRUE 1
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 #define FALSE 0
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 static const Word16 phs_tbl[] =
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 {
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 32767, 0, 32729, -1608, 32610, -3212, 32413, -4808,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 32138, -6393, 31786, -7962, 31357, -9512, 30853, -11039,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 30274, -12540, 29622, -14010, 28899, -15447, 28106, -16846,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 27246, -18205, 26320, -19520, 25330, -20788, 24279, -22006,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 23170, -23170, 22006, -24279, 20788, -25330, 19520, -26320,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 18205, -27246, 16846, -28106, 15447, -28899, 14010, -29622,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 12540, -30274, 11039, -30853, 9512, -31357, 7962, -31786,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 6393, -32138, 4808, -32413, 3212, -32610, 1608, -32729,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 0, -32768, -1608, -32729, -3212, -32610, -4808, -32413,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 -6393, -32138, -7962, -31786, -9512, -31357, -11039, -30853,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 -12540, -30274, -14010, -29622, -15447, -28899, -16846, -28106,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 -18205, -27246, -19520, -26320, -20788, -25330, -22006, -24279,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 -23170, -23170, -24279, -22006, -25330, -20788, -26320, -19520,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 -27246, -18205, -28106, -16846, -28899, -15447, -29622, -14010,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 -30274, -12540, -30853, -11039, -31357, -9512, -31786, -7962,
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 -32138, -6393, -32413, -4808, -32610, -3212, -32729, -1608
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 };
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 static const Word16 ii_table[] =
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 {SIZE / 2, SIZE / 4, SIZE / 8, SIZE / 16, SIZE / 32, SIZE / 64};
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 /* FFT function for complex sequences */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 /*
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 * The decimation-in-time complex FFT is implemented below.
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 * The input complex numbers are presented as real part followed by
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 * imaginary part for each sample. The counters are therefore
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 * incremented by two to access the complex valued samples.
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 static void c_fft(Word16 * farray_ptr)
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 {
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 Word16 i, j, k, ii, jj, kk, ji, kj, ii2;
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 Word32 ftmp, ftmp_real, ftmp_imag;
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 Word16 tmp, tmp1, tmp2;
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 /* Rearrange the input array in bit reversed order */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 for (i = 0, j = 0; i < SIZE - 2; i = i + 2)
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 { test();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 if (sub(j, i) > 0)
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 {
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 ftmp = *(farray_ptr + i); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 *(farray_ptr + i) = *(farray_ptr + j); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 *(farray_ptr + j) = ftmp; move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 ftmp = *(farray_ptr + i + 1); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 *(farray_ptr + i + 1) = *(farray_ptr + j + 1); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 *(farray_ptr + j + 1) = ftmp; move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 }
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 k = SIZE_BY_TWO; move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 test();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 while (sub(j, k) >= 0)
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 {
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 j = sub(j, k);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 k = shr(k, 1);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 }
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 j = add(j, k);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 }
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 /* The FFT part */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 for (i = 0; i < NUM_STAGE; i++)
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 { /* i is stage counter */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 jj = shl(2, i); /* FFT size */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 kk = shl(jj, 1); /* 2 * FFT size */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 ii = ii_table[i]; /* 2 * number of FFT's */ move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 ii2 = shl(ii, 1);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 ji = 0; /* ji is phase table index */ move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 for (j = 0; j < jj; j = j + 2)
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 { /* j is sample counter */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 for (k = j; k < SIZE; k = k + kk)
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 { /* k is butterfly top */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 kj = add(k, jj); /* kj is butterfly bottom */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 /* Butterfly computations */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 ftmp_real = L_mult(*(farray_ptr + kj), phs_tbl[ji]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 ftmp_real = L_msu(ftmp_real, *(farray_ptr + kj + 1), phs_tbl[ji + 1]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 ftmp_imag = L_mult(*(farray_ptr + kj + 1), phs_tbl[ji]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 ftmp_imag = L_mac(ftmp_imag, *(farray_ptr + kj), phs_tbl[ji + 1]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 tmp1 = round(ftmp_real);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 tmp2 = round(ftmp_imag);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 tmp = sub(*(farray_ptr + k), tmp1);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 *(farray_ptr + kj) = shr(tmp, 1); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 tmp = sub(*(farray_ptr + k + 1), tmp2);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 *(farray_ptr + kj + 1) = shr(tmp, 1); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 tmp = add(*(farray_ptr + k), tmp1);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 *(farray_ptr + k) = shr(tmp, 1); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 tmp = add(*(farray_ptr + k + 1), tmp2);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 *(farray_ptr + k + 1) = shr(tmp, 1); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 }
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 ji = add(ji, ii2);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 }
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 }
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 } /* end of c_fft () */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 void r_fft(Word16 * farray_ptr)
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 {
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 Word16 ftmp1_real, ftmp1_imag, ftmp2_real, ftmp2_imag;
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 Word32 Lftmp1_real, Lftmp1_imag;
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 Word16 i, j;
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 Word32 Ltmp1;
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 /* Perform the complex FFT */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 c_fft(farray_ptr);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 /* First, handle the DC and foldover frequencies */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 ftmp1_real = *farray_ptr; move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 ftmp2_real = *(farray_ptr + 1); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 *farray_ptr = add(ftmp1_real, ftmp2_real); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 *(farray_ptr + 1) = sub(ftmp1_real, ftmp2_real); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 /* Now, handle the remaining positive frequencies */
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 for (i = 2, j = SIZE - i; i <= SIZE_BY_TWO; i = i + 2, j = SIZE - i)
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 {
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 ftmp1_real = add(*(farray_ptr + i), *(farray_ptr + j));
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 ftmp1_imag = sub(*(farray_ptr + i + 1), *(farray_ptr + j + 1));
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 ftmp2_real = add(*(farray_ptr + i + 1), *(farray_ptr + j + 1));
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 ftmp2_imag = sub(*(farray_ptr + j), *(farray_ptr + i));
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 Lftmp1_real = L_deposit_h(ftmp1_real);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 Lftmp1_imag = L_deposit_h(ftmp1_imag);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 Ltmp1 = L_mac(Lftmp1_real, ftmp2_real, phs_tbl[i]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 Ltmp1 = L_msu(Ltmp1, ftmp2_imag, phs_tbl[i + 1]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 *(farray_ptr + i) = round(L_shr(Ltmp1, 1)); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 Ltmp1 = L_mac(Lftmp1_imag, ftmp2_imag, phs_tbl[i]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 Ltmp1 = L_mac(Ltmp1, ftmp2_real, phs_tbl[i + 1]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 *(farray_ptr + i + 1) = round(L_shr(Ltmp1, 1)); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 Ltmp1 = L_mac(Lftmp1_real, ftmp2_real, phs_tbl[j]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 Ltmp1 = L_mac(Ltmp1, ftmp2_imag, phs_tbl[j + 1]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 *(farray_ptr + j) = round(L_shr(Ltmp1, 1)); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 Ltmp1 = L_negate(Lftmp1_imag);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 Ltmp1 = L_msu(Ltmp1, ftmp2_imag, phs_tbl[j]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 Ltmp1 = L_mac(Ltmp1, ftmp2_real, phs_tbl[j + 1]);
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 *(farray_ptr + j + 1) = round(L_shr(Ltmp1, 1)); move16();
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 }
810ac4b99025 libtwamr: integrate VAD2 r_fft.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 } /* end r_fft () */