• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  *
10  */
11 #include "dl/api/omxtypes.h"
12 #include <stdbool.h>
13 
14 extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_fs(
15     const OMX_F32 *in,
16     OMX_F32 *out,
17     OMX_INT n);
18 
19 extern void x86SP_FFT_CToC_FC32_Inv_Radix4_fs(
20     const OMX_F32 *in,
21     OMX_F32 *out,
22     OMX_INT n);
23 
24 extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_fs_sse(
25     const OMX_F32 *in,
26     OMX_F32 *out,
27     OMX_INT n);
28 
29 extern void x86SP_FFT_CToC_FC32_Inv_Radix4_fs_sse(
30     const OMX_F32 *in,
31     OMX_F32 *out,
32     OMX_INT n);
33 
34 extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ms(
35     const OMX_F32 *in,
36     OMX_F32 *out,
37     const OMX_F32 *twiddle,
38     OMX_INT n,
39     OMX_INT sub_size,
40     OMX_INT sub_num);
41 
42 extern void x86SP_FFT_CToC_FC32_Inv_Radix4_ms(
43     const OMX_F32 *in,
44     OMX_F32 *out,
45     const OMX_F32 *twiddle,
46     OMX_INT n,
47     OMX_INT sub_size,
48     OMX_INT sub_num);
49 
50 extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ms_sse(
51     const OMX_F32 *in,
52     OMX_F32 *out,
53     const OMX_F32 *twiddle,
54     OMX_INT n,
55     OMX_INT sub_size,
56     OMX_INT sub_num);
57 
58 extern void x86SP_FFT_CToC_FC32_Inv_Radix4_ms_sse(
59     const OMX_F32 *in,
60     OMX_F32 *out,
61     const OMX_F32 *twiddle,
62     OMX_INT n,
63     OMX_INT sub_size,
64     OMX_INT sub_num);
65 
66 extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ls(
67     const OMX_F32 *in,
68     OMX_F32 *out,
69     const OMX_F32 *twiddle,
70     OMX_INT n);
71 
72 extern void x86SP_FFT_CToC_FC32_Inv_Radix4_ls(
73     const OMX_F32 *in,
74     OMX_F32 *out,
75     const OMX_F32 *twiddle,
76     OMX_INT n);
77 
78 extern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ls_sse(
79     const OMX_F32 *in,
80     OMX_F32 *out,
81     const OMX_F32 *twiddle,
82     OMX_INT n);
83 
84 extern void x86SP_FFT_CToC_FC32_Inv_Radix4_ls_sse(
85     const OMX_F32 *in,
86     OMX_F32 *out,
87     const OMX_F32 *twiddle,
88     OMX_INT n);
89 
90 extern void x86SP_FFT_CToC_FC32_Fwd_Radix2_ls(
91     const OMX_F32 *in,
92     OMX_F32 *out,
93     const OMX_F32 *twiddle,
94     OMX_INT n);
95 
96 extern void x86SP_FFT_CToC_FC32_Inv_Radix2_ls(
97     const OMX_F32 *in,
98     OMX_F32 *out,
99     const OMX_F32 *twiddle,
100     OMX_INT n);
101 
102 extern void x86SP_FFT_CToC_FC32_Fwd_Radix2_ls_sse(
103     const OMX_F32 *in,
104     OMX_F32 *out,
105     const OMX_F32 *twiddle,
106     OMX_INT n);
107 
108 extern void x86SP_FFT_CToC_FC32_Inv_Radix2_ls_sse(
109     const OMX_F32 *in,
110     OMX_F32 *out,
111     const OMX_F32 *twiddle,
112     OMX_INT n);
113 
x86SP_F32_radix4_kernel_OutOfPlace(const OMX_F32 * src,OMX_F32 * buf1,OMX_F32 * buf2,const OMX_F32 * twiddle,OMX_INT n,bool forward_fft)114 OMX_F32* x86SP_F32_radix4_kernel_OutOfPlace(
115     const OMX_F32 *src,
116     OMX_F32 *buf1,
117     OMX_F32 *buf2,
118     const OMX_F32 *twiddle,
119     OMX_INT n,
120     bool forward_fft) {
121   OMX_INT sub_size;
122   OMX_INT sub_num;
123   OMX_INT n_by_4 = n >> 2;
124   OMX_F32 *in = buf1;
125   OMX_F32 *out = buf2;
126 
127   if (forward_fft)
128     x86SP_FFT_CToC_FC32_Fwd_Radix4_fs(src, in, n);
129   else
130     x86SP_FFT_CToC_FC32_Inv_Radix4_fs(src, in, n);
131 
132   for (sub_size = 4, sub_num = n_by_4;
133        sub_size < n_by_4;
134        sub_size = sub_size << 2, sub_num = sub_num >> 2) {
135 
136     if (forward_fft) {
137       x86SP_FFT_CToC_FC32_Fwd_Radix4_ms(in, out, twiddle,
138                                         n, sub_size, sub_num);
139     } else {
140       x86SP_FFT_CToC_FC32_Inv_Radix4_ms(in, out, twiddle,
141                                         n, sub_size, sub_num);
142     }
143 
144     OMX_F32 *temp = out;
145     out = in;
146     in = temp;
147   }
148 
149   if (forward_fft) {
150     if (sub_num == 2)
151       x86SP_FFT_CToC_FC32_Fwd_Radix2_ls(in, out, twiddle, n);
152     else
153       x86SP_FFT_CToC_FC32_Fwd_Radix4_ls(in, out, twiddle, n);
154   } else {
155     if (sub_num == 2)
156       x86SP_FFT_CToC_FC32_Inv_Radix2_ls(in, out, twiddle, n);
157     else
158       x86SP_FFT_CToC_FC32_Inv_Radix4_ls(in, out, twiddle, n);
159   }
160 
161   return out;
162 }
163 
x86SP_F32_radix4_kernel_OutOfPlace_sse(const OMX_F32 * src,OMX_F32 * buf1,OMX_F32 * buf2,const OMX_F32 * twiddle,OMX_INT n,bool forward_fft)164 OMX_F32* x86SP_F32_radix4_kernel_OutOfPlace_sse(
165     const OMX_F32 *src,
166     OMX_F32 *buf1,
167     OMX_F32 *buf2,
168     const OMX_F32 *twiddle,
169     OMX_INT n,
170     // true for forward, false for inverse.
171     bool forward_fft) {
172   OMX_INT sub_size, sub_num;
173   OMX_INT n_by_4 = n >> 2;
174   OMX_F32 *in, *out;
175   in = buf1;
176   out = buf2;
177 
178   if (forward_fft)
179     x86SP_FFT_CToC_FC32_Fwd_Radix4_fs_sse(src, in, n);
180   else
181     x86SP_FFT_CToC_FC32_Inv_Radix4_fs_sse(src, in, n);
182 
183   for (sub_size = 4, sub_num = n_by_4;
184        sub_size < n_by_4;
185        sub_size = sub_size << 2, sub_num = sub_num >> 2) {
186 
187     if (forward_fft) {
188       x86SP_FFT_CToC_FC32_Fwd_Radix4_ms_sse(in, out, twiddle,
189                                             n, sub_size, sub_num);
190     } else {
191       x86SP_FFT_CToC_FC32_Inv_Radix4_ms_sse(in, out, twiddle,
192                                             n, sub_size, sub_num);
193     }
194 
195     OMX_F32 *temp = out;
196     out = in;
197     in = temp;
198   }
199 
200   // If n is not power of 4, sub_num == 2.
201   if (forward_fft) {
202     if (sub_num == 2)
203       x86SP_FFT_CToC_FC32_Fwd_Radix2_ls_sse(in, out, twiddle, n);
204     else
205       x86SP_FFT_CToC_FC32_Fwd_Radix4_ls_sse(in, out, twiddle, n);
206   } else {
207     if (sub_num == 2)
208       x86SP_FFT_CToC_FC32_Inv_Radix2_ls_sse(in, out, twiddle, n);
209     else
210       x86SP_FFT_CToC_FC32_Inv_Radix4_ls_sse(in, out, twiddle, n);
211   }
212 
213   return out;
214 }
215