[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r4192 - gnuradio/branches/developers/trondeau/digital-
From: |
trondeau |
Subject: |
[Commit-gnuradio] r4192 - gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general |
Date: |
Tue, 26 Dec 2006 09:28:27 -0700 (MST) |
Author: trondeau
Date: 2006-12-26 09:28:27 -0700 (Tue, 26 Dec 2006)
New Revision: 4192
Modified:
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.cc
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.h
Log:
ugly fix for speed improvement in M&M block
Modified:
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.cc
===================================================================
---
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.cc
2006-12-25 23:44:16 UTC (rev 4191)
+++
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.cc
2006-12-26 16:28:27 UTC (rev 4192)
@@ -133,47 +133,90 @@
float mm_val=0;
gr_complex u, x, y;
- while(oo < noutput_items && ii < ni) {
- d_p_2T = d_p_1T;
- d_p_1T = d_p_0T;
- d_p_0T = d_interp->interpolate (&in[ii], d_mu);
+ // This loop writes the error to the second output, if it exists
+ if (write_foptr) {
+ while(oo < noutput_items && ii < ni) {
+ d_p_2T = d_p_1T;
+ d_p_1T = d_p_0T;
+ d_p_0T = d_interp->interpolate (&in[ii], d_mu);
- d_c_2T = d_c_1T;
- d_c_1T = d_c_0T;
- d_c_0T = slicer_0deg(d_p_0T);
-
- x = (d_c_0T - d_c_2T) * conj(d_p_1T);
- y = (d_p_0T - d_p_2T) * conj(d_c_1T);
- u = y - x;
- mm_val = u.real();
- out[oo++] = d_p_0T;
-
- // limit mm_val
- if (mm_val > 1.0)
- mm_val = 1.0;
- else if (mm_val < -1.0)
- mm_val = -1.0;
-
- d_omega = d_omega + d_gain_omega * mm_val;
- if (d_omega > d_max_omega)
- d_omega = d_max_omega;
- else if (d_omega < d_min_omega)
- d_omega = d_min_omega;
-
- d_mu = d_mu + d_omega + d_gain_mu * mm_val;
- ii += (int)floor(d_mu);
- d_mu -= floor(d_mu);
-
- if(d_verbose) {
+ d_c_2T = d_c_1T;
+ d_c_1T = d_c_0T;
+ d_c_0T = slicer_0deg(d_p_0T);
+
+ x = (d_c_0T - d_c_2T) * conj(d_p_1T);
+ y = (d_p_0T - d_p_2T) * conj(d_c_1T);
+ u = y - x;
+ mm_val = u.real();
+ out[oo++] = d_p_0T;
+
+ // limit mm_val
+ if (mm_val > 1.0)
+ mm_val = 1.0;
+ else if (mm_val < -1.0)
+ mm_val = -1.0;
+
+ d_omega = d_omega + d_gain_omega * mm_val;
+ if (d_omega > d_max_omega)
+ d_omega = d_max_omega;
+ else if (d_omega < d_min_omega)
+ d_omega = d_min_omega;
+
+ d_mu = d_mu + d_omega + d_gain_mu * mm_val;
+ ii += (int)floor(d_mu);
+ d_mu -= floor(d_mu);
+
+ #if 0
printf("%f\t%f\n", d_omega, d_mu);
+ #endif
+
+ // write the error signal to the second output
+ foptr[oo-1] = gr_complex(d_mu,0);
+
+ if (ii < 0) // clamp it. This should only happen with bogus input
+ ii = 0;
}
+ }
+ // This loop does not write to the second output (ugly, but faster)
+ else {
+ while(oo < noutput_items && ii < ni) {
+ d_p_2T = d_p_1T;
+ d_p_1T = d_p_0T;
+ d_p_0T = d_interp->interpolate (&in[ii], d_mu);
- // write the error signal to the second output
- if (write_foptr)
- foptr[oo-1] = gr_complex(d_mu,0);
-
- if (ii < 0) // clamp it. This should only happen with bogus input
- ii = 0;
+ d_c_2T = d_c_1T;
+ d_c_1T = d_c_0T;
+ d_c_0T = slicer_0deg(d_p_0T);
+
+ x = (d_c_0T - d_c_2T) * conj(d_p_1T);
+ y = (d_p_0T - d_p_2T) * conj(d_c_1T);
+ u = y - x;
+ mm_val = u.real();
+ out[oo++] = d_p_0T;
+
+ // limit mm_val
+ if (mm_val > 1.0)
+ mm_val = 1.0;
+ else if (mm_val < -1.0)
+ mm_val = -1.0;
+
+ d_omega = d_omega + d_gain_omega * mm_val;
+ if (d_omega > d_max_omega)
+ d_omega = d_max_omega;
+ else if (d_omega < d_min_omega)
+ d_omega = d_min_omega;
+
+ d_mu = d_mu + d_omega + d_gain_mu * mm_val;
+ ii += (int)floor(d_mu);
+ d_mu -= floor(d_mu);
+
+ if(d_verbose) {
+ printf("%f\t%f\n", d_omega, d_mu);
+ }
+
+ if (ii < 0) // clamp it. This should only happen with bogus input
+ ii = 0;
+ }
}
if (ii > 0){
Modified:
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.h
===================================================================
---
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.h
2006-12-25 23:44:16 UTC (rev 4191)
+++
gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general/gr_clock_recovery_mm_cc.h
2006-12-26 16:28:27 UTC (rev 4192)
@@ -41,10 +41,11 @@
* \ingroup block
*
* This implements the Mueller and Müller (M&M) discrete-time error-tracking
synchronizer.
- *
- * See "Digital Communication Receivers: Synchronization, Channel
- * Estimation and Signal Processing" by Heinrich Meyr, Marc Moeneclaey, &
Stefan Fechtel.
- * ISBN 0-471-50275-8.
+ * The complex version here is based on:
+ * Modified Mueller and Muller clock recovery circuit
+ * Based:
+ * G. R. Danesfahani, T.G. Jeans, "Optimisation of modified Mueller and
Muller
+ * algorithm," Electronics Letters, Vol. 31, no. 13, 22 June 1995, pp.
1032 - 1033.
*/
class gr_clock_recovery_mm_cc : public gr_block
{
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r4192 - gnuradio/branches/developers/trondeau/digital-wip/gnuradio-core/src/lib/general,
trondeau <=