xref: /aosp_15_r20/external/pffft/pf_mixer.h (revision 3f1979aa0d7ad34fcf3763de7b7b8f8cd67e5bdd)
1*3f1979aaSAndroid Build Coastguard Worker /*
2*3f1979aaSAndroid Build Coastguard Worker This software is part of pffft/pfdsp, a set of simple DSP routines.
3*3f1979aaSAndroid Build Coastguard Worker 
4*3f1979aaSAndroid Build Coastguard Worker Copyright (c) 2014, Andras Retzler <[email protected]>
5*3f1979aaSAndroid Build Coastguard Worker Copyright (c) 2020  Hayati Ayguen <[email protected]>
6*3f1979aaSAndroid Build Coastguard Worker All rights reserved.
7*3f1979aaSAndroid Build Coastguard Worker 
8*3f1979aaSAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without
9*3f1979aaSAndroid Build Coastguard Worker modification, are permitted provided that the following conditions are met:
10*3f1979aaSAndroid Build Coastguard Worker     * Redistributions of source code must retain the above copyright
11*3f1979aaSAndroid Build Coastguard Worker       notice, this list of conditions and the following disclaimer.
12*3f1979aaSAndroid Build Coastguard Worker     * Redistributions in binary form must reproduce the above copyright
13*3f1979aaSAndroid Build Coastguard Worker       notice, this list of conditions and the following disclaimer in the
14*3f1979aaSAndroid Build Coastguard Worker       documentation and/or other materials provided with the distribution.
15*3f1979aaSAndroid Build Coastguard Worker     * Neither the name of the copyright holder nor the
16*3f1979aaSAndroid Build Coastguard Worker       names of its contributors may be used to endorse or promote products
17*3f1979aaSAndroid Build Coastguard Worker       derived from this software without specific prior written permission.
18*3f1979aaSAndroid Build Coastguard Worker 
19*3f1979aaSAndroid Build Coastguard Worker THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20*3f1979aaSAndroid Build Coastguard Worker ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21*3f1979aaSAndroid Build Coastguard Worker WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22*3f1979aaSAndroid Build Coastguard Worker DISCLAIMED. IN NO EVENT SHALL ANDRAS RETZLER BE LIABLE FOR ANY
23*3f1979aaSAndroid Build Coastguard Worker DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24*3f1979aaSAndroid Build Coastguard Worker (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*3f1979aaSAndroid Build Coastguard Worker LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26*3f1979aaSAndroid Build Coastguard Worker ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*3f1979aaSAndroid Build Coastguard Worker (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28*3f1979aaSAndroid Build Coastguard Worker SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*3f1979aaSAndroid Build Coastguard Worker */
30*3f1979aaSAndroid Build Coastguard Worker 
31*3f1979aaSAndroid Build Coastguard Worker #pragma once
32*3f1979aaSAndroid Build Coastguard Worker 
33*3f1979aaSAndroid Build Coastguard Worker #include <stdio.h>
34*3f1979aaSAndroid Build Coastguard Worker #include <stdint.h>
35*3f1979aaSAndroid Build Coastguard Worker 
36*3f1979aaSAndroid Build Coastguard Worker #ifdef __cplusplus
37*3f1979aaSAndroid Build Coastguard Worker extern "C" {
38*3f1979aaSAndroid Build Coastguard Worker #endif
39*3f1979aaSAndroid Build Coastguard Worker 
40*3f1979aaSAndroid Build Coastguard Worker 
41*3f1979aaSAndroid Build Coastguard Worker /*
42*3f1979aaSAndroid Build Coastguard Worker    _____                      _
43*3f1979aaSAndroid Build Coastguard Worker   / ____|                    | |
44*3f1979aaSAndroid Build Coastguard Worker  | |     ___  _ __ ___  _ __ | | _____  __
45*3f1979aaSAndroid Build Coastguard Worker  | |    / _ \| '_ ` _ \| '_ \| |/ _ \ \/ /
46*3f1979aaSAndroid Build Coastguard Worker  | |___| (_) | | | | | | |_) | |  __/>  <
47*3f1979aaSAndroid Build Coastguard Worker   \_____\___/|_| |_| |_| .__/|_|\___/_/\_\
48*3f1979aaSAndroid Build Coastguard Worker                        | |
49*3f1979aaSAndroid Build Coastguard Worker                        |_|
50*3f1979aaSAndroid Build Coastguard Worker */
51*3f1979aaSAndroid Build Coastguard Worker 
52*3f1979aaSAndroid Build Coastguard Worker typedef struct complexf_s { float i; float q; } complexf;
53*3f1979aaSAndroid Build Coastguard Worker 
54*3f1979aaSAndroid Build Coastguard Worker // =================================================================================
55*3f1979aaSAndroid Build Coastguard Worker 
56*3f1979aaSAndroid Build Coastguard Worker int have_sse_shift_mixer_impl();
57*3f1979aaSAndroid Build Coastguard Worker 
58*3f1979aaSAndroid Build Coastguard Worker 
59*3f1979aaSAndroid Build Coastguard Worker /*********************************************************************/
60*3f1979aaSAndroid Build Coastguard Worker 
61*3f1979aaSAndroid Build Coastguard Worker /**************/
62*3f1979aaSAndroid Build Coastguard Worker /*** ALGO A ***/
63*3f1979aaSAndroid Build Coastguard Worker /**************/
64*3f1979aaSAndroid Build Coastguard Worker 
65*3f1979aaSAndroid Build Coastguard Worker float shift_math_cc(complexf *input, complexf* output, int input_size, float rate, float starting_phase);
66*3f1979aaSAndroid Build Coastguard Worker 
67*3f1979aaSAndroid Build Coastguard Worker 
68*3f1979aaSAndroid Build Coastguard Worker /*********************************************************************/
69*3f1979aaSAndroid Build Coastguard Worker 
70*3f1979aaSAndroid Build Coastguard Worker /**************/
71*3f1979aaSAndroid Build Coastguard Worker /*** ALGO B ***/
72*3f1979aaSAndroid Build Coastguard Worker /**************/
73*3f1979aaSAndroid Build Coastguard Worker 
74*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_table_data_s
75*3f1979aaSAndroid Build Coastguard Worker {
76*3f1979aaSAndroid Build Coastguard Worker     float* table;
77*3f1979aaSAndroid Build Coastguard Worker     int table_size;
78*3f1979aaSAndroid Build Coastguard Worker } shift_table_data_t;
79*3f1979aaSAndroid Build Coastguard Worker 
80*3f1979aaSAndroid Build Coastguard Worker void shift_table_deinit(shift_table_data_t table_data);
81*3f1979aaSAndroid Build Coastguard Worker shift_table_data_t shift_table_init(int table_size);
82*3f1979aaSAndroid Build Coastguard Worker float shift_table_cc(complexf* input, complexf* output, int input_size, float rate, shift_table_data_t table_data, float starting_phase);
83*3f1979aaSAndroid Build Coastguard Worker 
84*3f1979aaSAndroid Build Coastguard Worker /*********************************************************************/
85*3f1979aaSAndroid Build Coastguard Worker 
86*3f1979aaSAndroid Build Coastguard Worker /**************/
87*3f1979aaSAndroid Build Coastguard Worker /*** ALGO C ***/
88*3f1979aaSAndroid Build Coastguard Worker /**************/
89*3f1979aaSAndroid Build Coastguard Worker 
90*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_addfast_data_s
91*3f1979aaSAndroid Build Coastguard Worker {
92*3f1979aaSAndroid Build Coastguard Worker     float dsin[4];
93*3f1979aaSAndroid Build Coastguard Worker     float dcos[4];
94*3f1979aaSAndroid Build Coastguard Worker     float phase_increment;
95*3f1979aaSAndroid Build Coastguard Worker } shift_addfast_data_t;
96*3f1979aaSAndroid Build Coastguard Worker 
97*3f1979aaSAndroid Build Coastguard Worker shift_addfast_data_t shift_addfast_init(float rate);
98*3f1979aaSAndroid Build Coastguard Worker float shift_addfast_cc(complexf *input, complexf* output, int input_size, shift_addfast_data_t* d, float starting_phase);
99*3f1979aaSAndroid Build Coastguard Worker float shift_addfast_inp_c(complexf *in_out, int N_cplx, shift_addfast_data_t* d, float starting_phase);
100*3f1979aaSAndroid Build Coastguard Worker 
101*3f1979aaSAndroid Build Coastguard Worker 
102*3f1979aaSAndroid Build Coastguard Worker /*********************************************************************/
103*3f1979aaSAndroid Build Coastguard Worker 
104*3f1979aaSAndroid Build Coastguard Worker /**************/
105*3f1979aaSAndroid Build Coastguard Worker /*** ALGO D ***/
106*3f1979aaSAndroid Build Coastguard Worker /**************/
107*3f1979aaSAndroid Build Coastguard Worker 
108*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_unroll_data_s
109*3f1979aaSAndroid Build Coastguard Worker {
110*3f1979aaSAndroid Build Coastguard Worker     float* dsin;
111*3f1979aaSAndroid Build Coastguard Worker     float* dcos;
112*3f1979aaSAndroid Build Coastguard Worker     float phase_increment;
113*3f1979aaSAndroid Build Coastguard Worker     int size;
114*3f1979aaSAndroid Build Coastguard Worker } shift_unroll_data_t;
115*3f1979aaSAndroid Build Coastguard Worker 
116*3f1979aaSAndroid Build Coastguard Worker shift_unroll_data_t shift_unroll_init(float rate, int size);
117*3f1979aaSAndroid Build Coastguard Worker void shift_unroll_deinit(shift_unroll_data_t* d);
118*3f1979aaSAndroid Build Coastguard Worker float shift_unroll_cc(complexf *input, complexf* output, int size, shift_unroll_data_t* d, float starting_phase);
119*3f1979aaSAndroid Build Coastguard Worker float shift_unroll_inp_c(complexf* in_out, int size, shift_unroll_data_t* d, float starting_phase);
120*3f1979aaSAndroid Build Coastguard Worker 
121*3f1979aaSAndroid Build Coastguard Worker 
122*3f1979aaSAndroid Build Coastguard Worker /*********************************************************************/
123*3f1979aaSAndroid Build Coastguard Worker 
124*3f1979aaSAndroid Build Coastguard Worker /**************/
125*3f1979aaSAndroid Build Coastguard Worker /*** ALGO E ***/
126*3f1979aaSAndroid Build Coastguard Worker /**************/
127*3f1979aaSAndroid Build Coastguard Worker 
128*3f1979aaSAndroid Build Coastguard Worker /* similar to shift_unroll_cc() - but, have fixed and limited precalc size
129*3f1979aaSAndroid Build Coastguard Worker  * idea: smaller cache usage by table
130*3f1979aaSAndroid Build Coastguard Worker  * size must be multiple of CSDR_SHIFT_LIMITED_SIMD (= 4)
131*3f1979aaSAndroid Build Coastguard Worker  */
132*3f1979aaSAndroid Build Coastguard Worker #define PF_SHIFT_LIMITED_UNROLL_SIZE  128
133*3f1979aaSAndroid Build Coastguard Worker #define PF_SHIFT_LIMITED_SIMD_SZ  4
134*3f1979aaSAndroid Build Coastguard Worker 
135*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_limited_unroll_data_s
136*3f1979aaSAndroid Build Coastguard Worker {
137*3f1979aaSAndroid Build Coastguard Worker     float dcos[PF_SHIFT_LIMITED_UNROLL_SIZE];
138*3f1979aaSAndroid Build Coastguard Worker     float dsin[PF_SHIFT_LIMITED_UNROLL_SIZE];
139*3f1979aaSAndroid Build Coastguard Worker     complexf complex_phase;
140*3f1979aaSAndroid Build Coastguard Worker     float phase_increment;
141*3f1979aaSAndroid Build Coastguard Worker } shift_limited_unroll_data_t;
142*3f1979aaSAndroid Build Coastguard Worker 
143*3f1979aaSAndroid Build Coastguard Worker shift_limited_unroll_data_t shift_limited_unroll_init(float rate);
144*3f1979aaSAndroid Build Coastguard Worker /* size must be multiple of PF_SHIFT_LIMITED_SIMD_SZ */
145*3f1979aaSAndroid Build Coastguard Worker /* starting_phase for next call is kept internal in state */
146*3f1979aaSAndroid Build Coastguard Worker void shift_limited_unroll_cc(const complexf *input, complexf* output, int size, shift_limited_unroll_data_t* d);
147*3f1979aaSAndroid Build Coastguard Worker void shift_limited_unroll_inp_c(complexf* in_out, int size, shift_limited_unroll_data_t* d);
148*3f1979aaSAndroid Build Coastguard Worker 
149*3f1979aaSAndroid Build Coastguard Worker 
150*3f1979aaSAndroid Build Coastguard Worker /*********************************************************************/
151*3f1979aaSAndroid Build Coastguard Worker 
152*3f1979aaSAndroid Build Coastguard Worker /**************/
153*3f1979aaSAndroid Build Coastguard Worker /*** ALGO F ***/
154*3f1979aaSAndroid Build Coastguard Worker /**************/
155*3f1979aaSAndroid Build Coastguard Worker 
156*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_limited_unroll_A_sse_data_s
157*3f1979aaSAndroid Build Coastguard Worker {
158*3f1979aaSAndroid Build Coastguard Worker     /* small/limited trig table */
159*3f1979aaSAndroid Build Coastguard Worker     float dcos[PF_SHIFT_LIMITED_UNROLL_SIZE+PF_SHIFT_LIMITED_SIMD_SZ];
160*3f1979aaSAndroid Build Coastguard Worker     float dsin[PF_SHIFT_LIMITED_UNROLL_SIZE+PF_SHIFT_LIMITED_SIMD_SZ];
161*3f1979aaSAndroid Build Coastguard Worker     /* 4 times complex phase */
162*3f1979aaSAndroid Build Coastguard Worker     float phase_state_i[PF_SHIFT_LIMITED_SIMD_SZ];
163*3f1979aaSAndroid Build Coastguard Worker     float phase_state_q[PF_SHIFT_LIMITED_SIMD_SZ];
164*3f1979aaSAndroid Build Coastguard Worker     /* N_cplx_per_block times increment - for future parallel variants */
165*3f1979aaSAndroid Build Coastguard Worker     float dcos_blk;
166*3f1979aaSAndroid Build Coastguard Worker     float dsin_blk;
167*3f1979aaSAndroid Build Coastguard Worker     /* */
168*3f1979aaSAndroid Build Coastguard Worker     float phase_increment;
169*3f1979aaSAndroid Build Coastguard Worker } shift_limited_unroll_A_sse_data_t;
170*3f1979aaSAndroid Build Coastguard Worker 
171*3f1979aaSAndroid Build Coastguard Worker shift_limited_unroll_A_sse_data_t shift_limited_unroll_A_sse_init(float relative_freq, float phase_start_rad);
172*3f1979aaSAndroid Build Coastguard Worker void shift_limited_unroll_A_sse_inp_c(complexf* in_out, int N_cplx, shift_limited_unroll_A_sse_data_t* d);
173*3f1979aaSAndroid Build Coastguard Worker 
174*3f1979aaSAndroid Build Coastguard Worker 
175*3f1979aaSAndroid Build Coastguard Worker /*********************************************************************/
176*3f1979aaSAndroid Build Coastguard Worker 
177*3f1979aaSAndroid Build Coastguard Worker /**************/
178*3f1979aaSAndroid Build Coastguard Worker /*** ALGO G ***/
179*3f1979aaSAndroid Build Coastguard Worker /**************/
180*3f1979aaSAndroid Build Coastguard Worker 
181*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_limited_unroll_B_sse_data_s
182*3f1979aaSAndroid Build Coastguard Worker {
183*3f1979aaSAndroid Build Coastguard Worker     /* small/limited trig table */
184*3f1979aaSAndroid Build Coastguard Worker     float dtrig[PF_SHIFT_LIMITED_UNROLL_SIZE+PF_SHIFT_LIMITED_SIMD_SZ];
185*3f1979aaSAndroid Build Coastguard Worker     /* 4 times complex phase */
186*3f1979aaSAndroid Build Coastguard Worker     float phase_state_i[PF_SHIFT_LIMITED_SIMD_SZ];
187*3f1979aaSAndroid Build Coastguard Worker     float phase_state_q[PF_SHIFT_LIMITED_SIMD_SZ];
188*3f1979aaSAndroid Build Coastguard Worker     /* N_cplx_per_block times increment - for future parallel variants */
189*3f1979aaSAndroid Build Coastguard Worker     float dcos_blk;
190*3f1979aaSAndroid Build Coastguard Worker     float dsin_blk;
191*3f1979aaSAndroid Build Coastguard Worker     /* */
192*3f1979aaSAndroid Build Coastguard Worker     float phase_increment;
193*3f1979aaSAndroid Build Coastguard Worker } shift_limited_unroll_B_sse_data_t;
194*3f1979aaSAndroid Build Coastguard Worker 
195*3f1979aaSAndroid Build Coastguard Worker shift_limited_unroll_B_sse_data_t shift_limited_unroll_B_sse_init(float relative_freq, float phase_start_rad);
196*3f1979aaSAndroid Build Coastguard Worker void shift_limited_unroll_B_sse_inp_c(complexf* in_out, int N_cplx, shift_limited_unroll_B_sse_data_t* d);
197*3f1979aaSAndroid Build Coastguard Worker 
198*3f1979aaSAndroid Build Coastguard Worker /*********************************************************************/
199*3f1979aaSAndroid Build Coastguard Worker 
200*3f1979aaSAndroid Build Coastguard Worker /**************/
201*3f1979aaSAndroid Build Coastguard Worker /*** ALGO H ***/
202*3f1979aaSAndroid Build Coastguard Worker /**************/
203*3f1979aaSAndroid Build Coastguard Worker 
204*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_limited_unroll_C_sse_data_s
205*3f1979aaSAndroid Build Coastguard Worker {
206*3f1979aaSAndroid Build Coastguard Worker     /* small/limited trig table - interleaved: 4 cos, 4 sin, 4 cos, .. */
207*3f1979aaSAndroid Build Coastguard Worker     float dinterl_trig[2*(PF_SHIFT_LIMITED_UNROLL_SIZE+PF_SHIFT_LIMITED_SIMD_SZ)];
208*3f1979aaSAndroid Build Coastguard Worker     /* 4 times complex phase */
209*3f1979aaSAndroid Build Coastguard Worker     float phase_state_i[PF_SHIFT_LIMITED_SIMD_SZ];
210*3f1979aaSAndroid Build Coastguard Worker     float phase_state_q[PF_SHIFT_LIMITED_SIMD_SZ];
211*3f1979aaSAndroid Build Coastguard Worker     /* N_cplx_per_block times increment - for future parallel variants */
212*3f1979aaSAndroid Build Coastguard Worker     float dcos_blk;
213*3f1979aaSAndroid Build Coastguard Worker     float dsin_blk;
214*3f1979aaSAndroid Build Coastguard Worker     /* */
215*3f1979aaSAndroid Build Coastguard Worker     float phase_increment;
216*3f1979aaSAndroid Build Coastguard Worker } shift_limited_unroll_C_sse_data_t;
217*3f1979aaSAndroid Build Coastguard Worker 
218*3f1979aaSAndroid Build Coastguard Worker shift_limited_unroll_C_sse_data_t shift_limited_unroll_C_sse_init(float relative_freq, float phase_start_rad);
219*3f1979aaSAndroid Build Coastguard Worker void shift_limited_unroll_C_sse_inp_c(complexf* in_out, int N_cplx, shift_limited_unroll_C_sse_data_t* d);
220*3f1979aaSAndroid Build Coastguard Worker 
221*3f1979aaSAndroid Build Coastguard Worker 
222*3f1979aaSAndroid Build Coastguard Worker 
223*3f1979aaSAndroid Build Coastguard Worker /*********************************************************************/
224*3f1979aaSAndroid Build Coastguard Worker 
225*3f1979aaSAndroid Build Coastguard Worker /**************/
226*3f1979aaSAndroid Build Coastguard Worker /*** ALGO I ***/
227*3f1979aaSAndroid Build Coastguard Worker /**************/
228*3f1979aaSAndroid Build Coastguard Worker 
229*3f1979aaSAndroid Build Coastguard Worker /* Recursive Quadrature Oscillator functions "recursive_osc"
230*3f1979aaSAndroid Build Coastguard Worker  * see https://www.vicanek.de/articles/QuadOsc.pdf
231*3f1979aaSAndroid Build Coastguard Worker  */
232*3f1979aaSAndroid Build Coastguard Worker #define PF_SHIFT_RECURSIVE_SIMD_SZ  8
233*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_recursive_osc_s
234*3f1979aaSAndroid Build Coastguard Worker {
235*3f1979aaSAndroid Build Coastguard Worker     float u_cos[PF_SHIFT_RECURSIVE_SIMD_SZ];
236*3f1979aaSAndroid Build Coastguard Worker     float v_sin[PF_SHIFT_RECURSIVE_SIMD_SZ];
237*3f1979aaSAndroid Build Coastguard Worker } shift_recursive_osc_t;
238*3f1979aaSAndroid Build Coastguard Worker 
239*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_recursive_osc_conf_s
240*3f1979aaSAndroid Build Coastguard Worker {
241*3f1979aaSAndroid Build Coastguard Worker     float k1;
242*3f1979aaSAndroid Build Coastguard Worker     float k2;
243*3f1979aaSAndroid Build Coastguard Worker } shift_recursive_osc_conf_t;
244*3f1979aaSAndroid Build Coastguard Worker 
245*3f1979aaSAndroid Build Coastguard Worker void shift_recursive_osc_init(float rate, float starting_phase, shift_recursive_osc_conf_t *conf, shift_recursive_osc_t *state);
246*3f1979aaSAndroid Build Coastguard Worker void shift_recursive_osc_update_rate(float rate, shift_recursive_osc_conf_t *conf, shift_recursive_osc_t* state);
247*3f1979aaSAndroid Build Coastguard Worker 
248*3f1979aaSAndroid Build Coastguard Worker /* size must be multiple of PF_SHIFT_LIMITED_SIMD_SZ */
249*3f1979aaSAndroid Build Coastguard Worker /* starting_phase for next call is kept internal in state */
250*3f1979aaSAndroid Build Coastguard Worker void shift_recursive_osc_cc(const complexf *input, complexf* output, int size, const shift_recursive_osc_conf_t *conf, shift_recursive_osc_t* state);
251*3f1979aaSAndroid Build Coastguard Worker void shift_recursive_osc_inp_c(complexf* output, int size, const shift_recursive_osc_conf_t *conf, shift_recursive_osc_t* state);
252*3f1979aaSAndroid Build Coastguard Worker void gen_recursive_osc_c(complexf* output, int size, const shift_recursive_osc_conf_t *conf, shift_recursive_osc_t* state);
253*3f1979aaSAndroid Build Coastguard Worker 
254*3f1979aaSAndroid Build Coastguard Worker /*********************************************************************/
255*3f1979aaSAndroid Build Coastguard Worker 
256*3f1979aaSAndroid Build Coastguard Worker /**************/
257*3f1979aaSAndroid Build Coastguard Worker /*** ALGO J ***/
258*3f1979aaSAndroid Build Coastguard Worker /**************/
259*3f1979aaSAndroid Build Coastguard Worker 
260*3f1979aaSAndroid Build Coastguard Worker #define PF_SHIFT_RECURSIVE_SIMD_SSE_SZ  4
261*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_recursive_osc_sse_s
262*3f1979aaSAndroid Build Coastguard Worker {
263*3f1979aaSAndroid Build Coastguard Worker     float u_cos[PF_SHIFT_RECURSIVE_SIMD_SSE_SZ];
264*3f1979aaSAndroid Build Coastguard Worker     float v_sin[PF_SHIFT_RECURSIVE_SIMD_SSE_SZ];
265*3f1979aaSAndroid Build Coastguard Worker } shift_recursive_osc_sse_t;
266*3f1979aaSAndroid Build Coastguard Worker 
267*3f1979aaSAndroid Build Coastguard Worker typedef struct shift_recursive_osc_sse_conf_s
268*3f1979aaSAndroid Build Coastguard Worker {
269*3f1979aaSAndroid Build Coastguard Worker     float k1;
270*3f1979aaSAndroid Build Coastguard Worker     float k2;
271*3f1979aaSAndroid Build Coastguard Worker } shift_recursive_osc_sse_conf_t;
272*3f1979aaSAndroid Build Coastguard Worker 
273*3f1979aaSAndroid Build Coastguard Worker void shift_recursive_osc_sse_init(float rate, float starting_phase, shift_recursive_osc_sse_conf_t *conf, shift_recursive_osc_sse_t *state);
274*3f1979aaSAndroid Build Coastguard Worker void shift_recursive_osc_sse_update_rate(float rate, shift_recursive_osc_sse_conf_t *conf, shift_recursive_osc_sse_t* state);
275*3f1979aaSAndroid Build Coastguard Worker void shift_recursive_osc_sse_inp_c(complexf* in_out, int N_cplx, const shift_recursive_osc_sse_conf_t *conf, shift_recursive_osc_sse_t* state_ext);
276*3f1979aaSAndroid Build Coastguard Worker 
277*3f1979aaSAndroid Build Coastguard Worker 
278*3f1979aaSAndroid Build Coastguard Worker #ifdef __cplusplus
279*3f1979aaSAndroid Build Coastguard Worker }
280*3f1979aaSAndroid Build Coastguard Worker #endif
281*3f1979aaSAndroid Build Coastguard Worker 
282