From c8f59bae854cccb6897c27424cce1a428c337286 Mon Sep 17 00:00:00 2001
From: Philip Balister <philip@opensdr.com>
Date: Tue, 13 Mar 2012 10:13:06 -0400
Subject: gr_fxpt : Add sincos function to class.

Signed-off-by: Philip Balister <philip@opensdr.com>
---
 gnuradio-core/src/lib/general/gr_fxpt.h     | 16 ++++++++++++++++
 gnuradio-core/src/lib/general/qa_gr_fxpt.cc | 10 ++++++++++
 2 files changed, 26 insertions(+)

(limited to 'gnuradio-core/src/lib/general')

diff --git a/gnuradio-core/src/lib/general/gr_fxpt.h b/gnuradio-core/src/lib/general/gr_fxpt.h
index 5cf736dfbf..6f088769ab 100644
--- a/gnuradio-core/src/lib/general/gr_fxpt.h
+++ b/gnuradio-core/src/lib/general/gr_fxpt.h
@@ -79,6 +79,22 @@ public:
     return s_sine_table[index][0] * (ux >> 1) + s_sine_table[index][1];
   }
 
+  /*
+   * \brief Given a fixedpoint angle x, return float cos(x) and sin (x)
+   */
+  static void sincos(gr_int32 x, float *s, float *c)
+  {
+    gr_uint32 ux = x;
+    int sin_index = ux >> (WORDBITS - NBITS);
+    *s = s_sine_table[sin_index][0] * (ux >> 1) + s_sine_table[sin_index][1];
+
+    ux = x + 0x40000000;
+    int cos_index = ux >> (WORDBITS - NBITS);
+    *c = s_sine_table[cos_index][0] * (ux >> 1) + s_sine_table[cos_index][1];
+
+    return;
+  }
+
 };
 
 #endif /* INCLUDED_GR_FXPT_H */
diff --git a/gnuradio-core/src/lib/general/qa_gr_fxpt.cc b/gnuradio-core/src/lib/general/qa_gr_fxpt.cc
index 83bb05b2d7..45bd3ed2c9 100644
--- a/gnuradio-core/src/lib/general/qa_gr_fxpt.cc
+++ b/gnuradio-core/src/lib/general/qa_gr_fxpt.cc
@@ -91,4 +91,14 @@ qa_gr_fxpt::t2 ()
 void
 qa_gr_fxpt::t3 ()
 {
+std::cout << "In fixed sincos test" << std::endl;
+  for (float p = -M_PI; p < M_PI; p += 2 * M_PI / 3600){
+    float expected_sin = sin (p);
+    float expected_cos = cos (p);
+    float actual_sin;
+    float actual_cos;
+    gr_fxpt::sincos (gr_fxpt::float_to_fixed (p), &actual_sin, &actual_cos);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL (expected_sin, actual_sin, SIN_COS_TOLERANCE);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL (expected_cos, actual_cos, SIN_COS_TOLERANCE);
+  }
 }
-- 
cgit v1.2.3