[Top][All Lists]
[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
}