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