linux/include/linux/cordic.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2011 Broadcom Corporation
   3 *
   4 * Permission to use, copy, modify, and/or distribute this software for any
   5 * purpose with or without fee is hereby granted, provided that the above
   6 * copyright notice and this permission notice appear in all copies.
   7 *
   8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15 */
  16#ifndef __CORDIC_H_
  17#define __CORDIC_H_
  18
  19#include <linux/types.h>
  20
  21#define CORDIC_ANGLE_GEN        39797
  22#define CORDIC_PRECISION_SHIFT  16
  23#define CORDIC_NUM_ITER (CORDIC_PRECISION_SHIFT + 2)
  24
  25#define CORDIC_FIXED(X) ((s32)((X) << CORDIC_PRECISION_SHIFT))
  26#define CORDIC_FLOAT(X) (((X) >= 0) \
  27                ? ((((X) >> (CORDIC_PRECISION_SHIFT - 1)) + 1) >> 1) \
  28                : -((((-(X)) >> (CORDIC_PRECISION_SHIFT - 1)) + 1) >> 1))
  29
  30/**
  31 * struct cordic_iq - i/q coordinate.
  32 *
  33 * @i: real part of coordinate (in phase).
  34 * @q: imaginary part of coordinate (quadrature).
  35 */
  36struct cordic_iq {
  37        s32 i;
  38        s32 q;
  39};
  40
  41/**
  42 * cordic_calc_iq() - calculates the i/q coordinate for given angle.
  43 *
  44 * @theta: angle in degrees for which i/q coordinate is to be calculated.
  45 * @coord: function output parameter holding the i/q coordinate.
  46 *
  47 * The function calculates the i/q coordinate for a given angle using the
  48 * CORDIC algorithm. The coordinate consists of a real (i) and an
  49 * imaginary (q) part. The real part is essentially the cosine of the
  50 * angle and the imaginary part is the sine of the angle. The returned
  51 * values are scaled by 2^16 for precision. The range for theta is
  52 * for -180 degrees to +180 degrees. Passed values outside this range are
  53 * converted before doing the actual calculation.
  54 */
  55struct cordic_iq cordic_calc_iq(s32 theta);
  56
  57#endif /* __CORDIC_H_ */
  58