Sound Open Firmware
Loading...
Searching...
No Matches
trig.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2016 Intel Corporation. All rights reserved.
4 *
5 * Author: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
6 * Liam Girdwood <liam.r.girdwood@linux.intel.com>
7 * Keyon Jie <yang.jie@linux.intel.com>
8 * Shriram Shastry <malladi.sastry@linux.intel.com>
9 */
10
17#ifndef __SOF_MATH_TRIG_H__
18#define __SOF_MATH_TRIG_H__
19
20#include <stdint.h>
21
22#define PI_Q4_28 843314857 /* int32(pi * 2^28) */
23#define PI_MUL2_Q4_28 1686629713 /* int32(2 * pi * 2^28) */
24#define PI_DIV2_Q3_29 843314857 /* int32(pi / 2 * 2^29) */
25#define PI_Q3_29 1686629713 /* int32(pi * 2^29) */
26
27#define CORDIC_31B_TABLE_SIZE 31
28#define CORDIC_15B_TABLE_SIZE 15
29#define CORDIC_30B_ITABLE_SIZE 30
30#define CORDIC_16B_ITABLE_SIZE 16
31#define CORDIC_31B_ITERATIONS (CORDIC_31B_TABLE_SIZE - 1)
32#define CORDIC_16B_ITERATIONS (CORDIC_16B_ITABLE_SIZE - 1)
33
42
44 int32_t re;
45 int32_t im;
46};
47
57void cordic_approx(int32_t th_rad_fxp, int32_t a_idx, int32_t *sign, int32_t *b_yn, int32_t *xn,
58 int32_t *th_cdc_fxp);
59
66int32_t is_scalar_cordic_acos(int32_t realvalue, int numiters_minus_one);
67
74int32_t is_scalar_cordic_asin(int32_t realvalue, int numiters_minus_one);
75
84void cmpx_cexp(int32_t sign, int32_t b_yn, int32_t xn, cordic_cfg type, struct cordic_cmpx *cexp);
85
105static inline int32_t sin_fixed_32b(int32_t th_rad_fxp)
106{
107 int32_t th_cdc_fxp;
108 int32_t sign;
109 int32_t b_yn;
110 int32_t xn;
111 cordic_approx(th_rad_fxp, CORDIC_31B_TABLE_SIZE, &sign, &b_yn, &xn, &th_cdc_fxp);
112
113 th_cdc_fxp = sign * b_yn;
114 /*convert Q2.30 to Q1.31 format*/
115 return sat_int32(Q_SHIFT_LEFT((int64_t)th_cdc_fxp, 30, 31));
116}
117
137static inline int32_t cos_fixed_32b(int32_t th_rad_fxp)
138{
139 int32_t th_cdc_fxp;
140 int32_t sign;
141 int32_t b_yn;
142 int32_t xn;
143 cordic_approx(th_rad_fxp, CORDIC_31B_TABLE_SIZE, &sign, &b_yn, &xn, &th_cdc_fxp);
144
145 th_cdc_fxp = sign * xn;
146 /*convert Q2.30 to Q1.31 format*/
147 return sat_int32(Q_SHIFT_LEFT((int64_t)th_cdc_fxp, 30, 31));
148}
149
169static inline int16_t sin_fixed_16b(int32_t th_rad_fxp)
170{
171 int32_t th_cdc_fxp;
172 int32_t sign;
173 int32_t b_yn;
174 int32_t xn;
175
176 cordic_approx(th_rad_fxp, CORDIC_15B_TABLE_SIZE, &sign, &b_yn, &xn, &th_cdc_fxp);
177
178 th_cdc_fxp = sign * b_yn;
179 /*convert Q2.30 to Q1.15 format*/
180 return sat_int16(Q_SHIFT_RND(th_cdc_fxp, 30, 15));
181}
182
202static inline int16_t cos_fixed_16b(int32_t th_rad_fxp)
203{
204 int32_t th_cdc_fxp;
205 int32_t sign;
206 int32_t b_yn;
207 int32_t xn;
208
209 cordic_approx(th_rad_fxp, CORDIC_15B_TABLE_SIZE, &sign, &b_yn, &xn, &th_cdc_fxp);
210
211 th_cdc_fxp = sign * xn;
212 /*convert Q2.30 to Q1.15 format*/
213 return sat_int16(Q_SHIFT_RND(th_cdc_fxp, 30, 15));
214}
215
239static inline void cmpx_exp_32b(int32_t th_rad_fxp, struct cordic_cmpx *cexp)
240{
241 int32_t th_cdc_fxp;
242 int32_t sign;
243 int32_t b_yn;
244 int32_t xn;
245
246 cordic_approx(th_rad_fxp, CORDIC_31B_TABLE_SIZE, &sign, &b_yn, &xn, &th_cdc_fxp);
247 cmpx_cexp(sign, b_yn, xn, EN_32B_CORDIC_CEXP, cexp);
248 /* return the complex(re & im) result in Q2.30*/
249}
250
274static inline void cmpx_exp_16b(int32_t th_rad_fxp, struct cordic_cmpx *cexp)
275{
276 int32_t th_cdc_fxp;
277 int32_t sign;
278 int32_t b_yn;
279 int32_t xn;
280
281 /* compute coeff from angles */
282 cordic_approx(th_rad_fxp, CORDIC_15B_TABLE_SIZE, &sign, &b_yn, &xn, &th_cdc_fxp);
283 cmpx_cexp(sign, b_yn, xn, EN_16B_CORDIC_CEXP, cexp);
284 /* return the complex(re & im) result in Q1.15*/
285}
286
301static inline int32_t asin_fixed_32b(int32_t cdc_asin_th)
302{
303 int32_t th_asin_fxp;
304
305 if (cdc_asin_th >= 0)
306 th_asin_fxp = is_scalar_cordic_asin(cdc_asin_th, CORDIC_31B_ITERATIONS);
307 else
308 th_asin_fxp = -is_scalar_cordic_asin(-cdc_asin_th, CORDIC_31B_ITERATIONS);
309
310 return th_asin_fxp; /* Q2.30 */
311}
312
326static inline int32_t acos_fixed_32b(int32_t cdc_acos_th)
327{
328 int32_t th_acos_fxp;
329
330 if (cdc_acos_th >= 0)
331 th_acos_fxp = is_scalar_cordic_acos(cdc_acos_th, CORDIC_31B_ITERATIONS);
332 else
333 th_acos_fxp = PI_Q3_29 - is_scalar_cordic_acos(-cdc_acos_th, CORDIC_31B_ITERATIONS);
334
335 return th_acos_fxp; /* Q3.29 */
336}
337
353static inline int16_t asin_fixed_16b(int32_t cdc_asin_th)
354{
355 int32_t th_asin_fxp;
356
357 if (cdc_asin_th >= 0)
358 th_asin_fxp = is_scalar_cordic_asin(cdc_asin_th, CORDIC_16B_ITERATIONS);
359 else
360 th_asin_fxp = -is_scalar_cordic_asin(-cdc_asin_th, CORDIC_16B_ITERATIONS);
361 /*convert Q2.30 to Q2.14 format*/
362 return sat_int16(Q_SHIFT_RND(th_asin_fxp, 30, 14));
363}
364
379static inline int16_t acos_fixed_16b(int32_t cdc_acos_th)
380{
381 int32_t th_acos_fxp;
382
383 if (cdc_acos_th >= 0)
384 th_acos_fxp = is_scalar_cordic_acos(cdc_acos_th, CORDIC_16B_ITERATIONS);
385 else
386 th_acos_fxp = PI_Q3_29 - is_scalar_cordic_acos(-cdc_acos_th, CORDIC_16B_ITERATIONS);
387
388 /*convert Q3.29 to Q3.13 format*/
389 return sat_int16(Q_SHIFT_RND(th_acos_fxp, 29, 13));
390}
391
404int32_t sofm_atan2_32b(int32_t y, int32_t x);
405
406#endif /* __SOF_MATH_TRIG_H__ */
static int16_t sat_int16(int32_t x)
Saturate a 32-bit integer to signed 16-bit integer range.
Definition format_generic.h:56
static int32_t sat_int32(int64_t x)
Saturate a 64-bit integer to signed 32-bit integer range.
Definition format_generic.h:26
uint32_t type
Message type, symmetric to the incoming request.
Definition header.h:8
#define Q_SHIFT_LEFT(x, src_q, dst_q)
Definition format.h:82
#define Q_SHIFT_RND(x, src_q, dst_q)
Definition format.h:78
Definition trig.h:43
int32_t im
Definition trig.h:45
int32_t re
Definition trig.h:44
static void cmpx_exp_16b(int32_t th_rad_fxp, struct cordic_cmpx *cexp)
cmpx_exp_16b() - CORDIC-based approximation of complex exponential e^(j*THETA).
Definition trig.h:274
#define CORDIC_16B_ITERATIONS
Definition trig.h:32
static int16_t cos_fixed_16b(int32_t th_rad_fxp)
cos_fixed_16b() - Cosine function using CORDIC algorithm
Definition trig.h:202
cordic_cfg
Definition trig.h:34
@ EN_32B_CORDIC_SINE
Definition trig.h:35
@ EN_16B_CORDIC_CEXP
Definition trig.h:40
@ EN_16B_CORDIC_COSINE
Definition trig.h:39
@ EN_32B_CORDIC_COSINE
Definition trig.h:36
@ EN_32B_CORDIC_CEXP
Definition trig.h:37
@ EN_16B_CORDIC_SINE
Definition trig.h:38
int32_t sofm_atan2_32b(int32_t y, int32_t x)
sofm_atan2_32b() - Four-quadrant arctangent using degree-9 Remez minimax polynomial
int32_t is_scalar_cordic_asin(int32_t realvalue, int numiters_minus_one)
is_scalar_cordic_asin() - CORDIC-based approximation for inverse sine
#define CORDIC_31B_ITERATIONS
Definition trig.h:31
static int32_t cos_fixed_32b(int32_t th_rad_fxp)
cos_fixed_32b() - Cosine function using CORDIC algorithm
Definition trig.h:137
static void cmpx_exp_32b(int32_t th_rad_fxp, struct cordic_cmpx *cexp)
cmpx_exp_32b() - CORDIC-based approximation of complex exponential e^(j*THETA).
Definition trig.h:239
#define CORDIC_15B_TABLE_SIZE
Definition trig.h:28
int32_t is_scalar_cordic_acos(int32_t realvalue, int numiters_minus_one)
is_scalar_cordic_acos() - CORDIC-based approximation for inverse cosine
void cordic_approx(int32_t th_rad_fxp, int32_t a_idx, int32_t *sign, int32_t *b_yn, int32_t *xn, int32_t *th_cdc_fxp)
cordic_approx() - CORDIC-based approximation of sine and cosine
static int32_t sin_fixed_32b(int32_t th_rad_fxp)
sin_fixed_32b() - Sine function using CORDIC algorithm
Definition trig.h:105
#define PI_Q3_29
Definition trig.h:25
static int32_t acos_fixed_32b(int32_t cdc_acos_th)
acos_fixed_32b() - CORDIC-based approximation of inverse cosine
Definition trig.h:326
#define CORDIC_31B_TABLE_SIZE
Definition trig.h:27
static int16_t acos_fixed_16b(int32_t cdc_acos_th)
acos_fixed_16b() - CORDIC-based approximation of inverse cosine
Definition trig.h:379
void cmpx_cexp(int32_t sign, int32_t b_yn, int32_t xn, cordic_cfg type, struct cordic_cmpx *cexp)
cmpx_cexp() - CORDIC-based approximation of complex exponential e^(j*THETA)
static int32_t asin_fixed_32b(int32_t cdc_asin_th)
asin_fixed_32b() - CORDIC-based approximation of inverse sine
Definition trig.h:301
static int16_t sin_fixed_16b(int32_t th_rad_fxp)
sin_fixed_16b() - Sine function using CORDIC algorithm
Definition trig.h:169
static int16_t asin_fixed_16b(int32_t cdc_asin_th)
asin_fixed_16b() - CORDIC-based approximation of inverse sine
Definition trig.h:353