Adding a FIR filter implemented with its own internal buffer. This one keeps its...
[debian/gnuradio] / gnuradio-core / src / lib / filter / gr_rotator.h
index 930b1cc24df1102db5c9becf3faaae8283dac9a1..cb8f21a4030955b4d88a178c7bf035647182b616 100644 (file)
@@ -1,12 +1,12 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2003 Free Software Foundation, Inc.
+ * Copyright 2003,2008 Free Software Foundation, Inc.
  * 
  * This file is part of GNU Radio
  * 
  * GNU Radio is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
+ * the Free Software Foundation; either version 3, or (at your option)
  * any later version.
  * 
  * GNU Radio is distributed in the hope that it will be useful,
@@ -16,8 +16,8 @@
  * 
  * You should have received a copy of the GNU General Public License
  * along with GNU Radio; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
  */
 
 #ifndef _GR_ROTATOR_H_
 class gr_rotator {
   gr_complex   d_phase;
   gr_complex   d_phase_incr;
+  unsigned int d_counter;
 
  public:
-  gr_rotator () : d_phase (1), d_phase_incr (0) { }
+  gr_rotator () : d_phase (1), d_phase_incr (1), d_counter(0) { }
 
-  void set_phase (gr_complex phase)     { d_phase = phase; }
-  void set_phase_incr (gr_complex incr) { d_phase_incr = incr; }
+  void set_phase (gr_complex phase)     { d_phase = phase / abs(phase); }
+  void set_phase_incr (gr_complex incr) { d_phase_incr = incr / abs(incr); }
 
   gr_complex rotate (gr_complex in){
-    d_phase *= d_phase_incr;   // incr our phase (complex mult == add phases)
+    d_counter++;
 
-    d_phase /= abs(d_phase);   // ensure multiplication is rotation
-                               // FIXME.  This is expensive.  Maybe workaround using
-                               // double precision complex???
+    gr_complex z = in * d_phase;    // rotate in by phase
+    d_phase *= d_phase_incr;       // incr our phase (complex mult == add phases)
 
-    return in * d_phase;       // rotate in by phase
+    if ((d_counter % 512) == 0)
+      d_phase /= abs(d_phase);     // Normalize to ensure multiplication is rotation
+
+    return z;
   }
 
 };