patch-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Patch-gnuradio] gr_rotator fix/optimization


From: Dan Halperin
Subject: Re: [Patch-gnuradio] gr_rotator fix/optimization
Date: Thu, 06 Sep 2007 20:59:31 -0700
User-agent: Thunderbird 1.5.0.13 (X11/20070824)

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Whoops attached wrong file. patch attached this time.

- -D

Dan Halperin wrote:
> Two changes:
> 
> 1) Default phase increment changed from 1 to 0. This will not cause
> faults and instead do nothing if the rotator phase is not initialized.
> 
> 2) It seems like we can skip (expensive!) normalization of phase vector
> if we simply normalize phase and increment upon setup. I suppose there
> could be some lowest-order-bit precision errors that cause phase to
> degrade over a super-long-running system, but we could surely at least
> replace the current every-time normalization with normalization every K
> calls, for large K (1 million+).
> 
> This change took about 12% off the runtime of my code and the results
> are the same :)
> 
> -Dan

- ------------------------------------------------------------------------

_______________________________________________
Patch-gnuradio mailing list
address@hidden
http://lists.gnu.org/mailman/listinfo/patch-gnuradio

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFG4Myjy9GYuuMoUJ4RAh8jAKDBt16ZxIw3a2jW81eIDyPmmaXnKwCgpzVC
BCEoz+1ewCFuIw6BjqBvK1I=
=rq3q
-----END PGP SIGNATURE-----
Index: gr_rotator.h
===================================================================
--- gr_rotator.h        (revision 6318)
+++ gr_rotator.h        (working copy)
@@ -30,18 +30,14 @@
   gr_complex   d_phase_incr;

  public:
-  gr_rotator () : d_phase (1), d_phase_incr (0) { }
+  gr_rotator () : d_phase (1), d_phase_incr (1) { }

-  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_phase /= abs(d_phase);   // ensure multiplication is rotation
-                               // FIXME.  This is expensive.  Maybe workaround 
using
-                               // double precision complex???
-
     return in * d_phase;       // rotate in by phase
   }


reply via email to

[Prev in Thread] Current Thread [Next in Thread]