FreeCalypso > hg > gsm-codec-lib
annotate libtwamr/r_fft.c @ 581:e2d5cad04cbf
libgsmhr1 RxFE: store CN R0+LPC separately from speech
In the original GSM 06.06 code the ECU for speech mode is entirely
separate from the CN generator, maintaining separate state. (The
main intertie between them is the speech vs CN state variable,
distinguishing between speech and CN BFIs, in addition to the
CN-specific function of distinguishing between initial and update
SIDs.)
In the present RxFE implementation I initially thought that we could
use the same saved_frame buffer for both ECU and CN, overwriting
just the first 4 params (R0 and LPC) when a valid SID comes in.
However, I now realize it was a bad idea: the original code has a
corner case (long sequence of speech-mode BFIs to put the ECU in
state 6, then SID and CN-mode BFIs, then a good speech frame) that
would be broken by that buffer reuse approach. We could eliminate
this corner case by resetting the ECU state when passing through
a CN insertion period, but doing so would needlessly increase
the behavioral diffs between GSM 06.06 and our version.
Solution: use a separate CN-specific buffer for CN R0+LPC parameters,
and match the behavior of GSM 06.06 code in this regard.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Feb 2025 10:02:45 +0000 |
parents | 810ac4b99025 |
children |
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 () */ |