GNU Radio Manual and C++ API Reference 3.8.5.0
The Free & Open Software Radio Ecosystem
 
Loading...
Searching...
No Matches
fxpt.h
Go to the documentation of this file.
1/* -*- c++ -*- */
2/*
3 * Copyright 2004,2013 Free Software Foundation, Inc.
4 *
5 * This file is part of GNU Radio
6 *
7 * GNU Radio is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3, or (at your option)
10 * any later version.
11 *
12 * GNU Radio is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Radio; see the file COPYING. If not, write to
19 * the Free Software Foundation, Inc., 51 Franklin Street,
20 * Boston, MA 02110-1301, USA.
21 */
22
23#ifndef INCLUDED_GR_FXPT_H
24#define INCLUDED_GR_FXPT_H
25
26#include <gnuradio/api.h>
27#include <gnuradio/types.h>
28#include <stdint.h>
29
30namespace gr {
31
32/*!
33 * \brief fixed point sine and cosine and friends.
34 * \ingroup misc
35 *
36 * fixed pt radians
37 * --------- --------
38 * -2**31 -pi
39 * 0 0
40 * 2**31-1 pi - epsilon
41 */
43{
44 static const int WORDBITS = 32;
45 static const int NBITS = 10;
46 static const float s_sine_table[1 << NBITS][2];
47 static const float PI;
48 static const float TAU;
49 static const float TWO_TO_THE_31;
50
51public:
52 static int32_t float_to_fixed(float x)
53 {
54 // Fold x into -PI to PI.
55 int d = (int)std::floor(x / TAU + 0.5);
56 x -= d * TAU;
57 // And convert to an integer.
58 return (int32_t)((float)x * TWO_TO_THE_31 / PI);
59 }
60
61 static float fixed_to_float(int32_t x) { return x * (PI / TWO_TO_THE_31); }
62
63 /*!
64 * \brief Given a fixed point angle x, return float sine (x)
65 */
66 static float sin(int32_t x)
67 {
68 uint32_t ux = x;
69 int index = ux >> (WORDBITS - NBITS);
70 return s_sine_table[index][0] * (ux >> 1) + s_sine_table[index][1];
71 }
72
73 /*
74 * \brief Given a fixed point angle x, return float cosine (x)
75 */
76 static float cos(int32_t x)
77 {
78 uint32_t ux = x + 0x40000000;
79 int index = ux >> (WORDBITS - NBITS);
80 return s_sine_table[index][0] * (ux >> 1) + s_sine_table[index][1];
81 }
82
83 /*
84 * \brief Given a fixedpoint angle x, return float cos(x) and sin (x)
85 */
86 static void sincos(int32_t x, float* s, float* c)
87 {
88 uint32_t ux = x;
89 int sin_index = ux >> (WORDBITS - NBITS);
90 *s = s_sine_table[sin_index][0] * (ux >> 1) + s_sine_table[sin_index][1];
91
92 ux = x + 0x40000000;
93 int cos_index = ux >> (WORDBITS - NBITS);
94 *c = s_sine_table[cos_index][0] * (ux >> 1) + s_sine_table[cos_index][1];
95
96 return;
97 }
98};
99
100} /* namespace gr */
101
102#endif /* INCLUDED_GR_FXPT_H */
fixed point sine and cosine and friends.
Definition fxpt.h:43
static void sincos(int32_t x, float *s, float *c)
Definition fxpt.h:86
static float cos(int32_t x)
Definition fxpt.h:76
static int32_t float_to_fixed(float x)
Definition fxpt.h:52
static float sin(int32_t x)
Given a fixed point angle x, return float sine (x)
Definition fxpt.h:66
static float fixed_to_float(int32_t x)
Definition fxpt.h:61
#define GR_RUNTIME_API
Definition gnuradio-runtime/include/gnuradio/api.h:30
GNU Radio logging wrapper for log4cpp library (C++ port of log4j)
Definition basic_block.h:46