Précis of Danesfahani and Jeans, Optimisation of modified Mueller and Müller algorithm

This post is a summary of the main content of G. R. Danesfahani and T. G. Jeans, Optimisation of modified Mueller and Müller algorithm, Electronics Letters 31(13), 22nd June 1995, pages 1032-1033 (DOI 10.1049/el:19950711). The original paper is copyright IEE, and is available from IEEE or your local library. The algorithm described in that paper is the one used in GNU Radio‘s gr_clock_recovery_mm block.

The paper first recalls the modified Mueller and Müller algorithm: given

  • data symbols a(i)
  • received signal p(k) with real part p_r(k),
  • the receiver’s decision on the data symbol \hat{a}(k)

then the modified Mueller and Müller algorithm (mM&M) computes an error

\mu_1(k) = (\hat{a}(k-1) - \hat{a}(k+1))p_r(k).

The paper then observes that this algorithm contains a self-noise term which can be cancelled by adding

\mu_2(k) = \hat{a}(k)(p_r(k+1) - p_r(k-1)).

The resulting algorithm, the optimised modified Mueller and Müller algorithm for real symbols (e.g., BPSK), outputs a timing error

\tau = 0.5(\mu_1(k) + \mu_2(k)).

This can be generalised to the complex domain (e.g., for QPSK) as

\mu(k) = {\bf R}((\hat{c}(k) - \hat{c}(k-2))p^*(k-1) + \hat{c}^*(k-1)(p(k)-p(k-2))),


  • \hat{c}(k) is the receiver’s decision on the (complex) data symbol, and
  • p^*(k) is the complex conjugate of p(k).

Figure 1 presents this equation in the form of a block diagram, including a combined filter and interpolator (and presumably sampler) betweeen the input signal and p(k), a decision block between p(k) and \hat{c}(k), and a loop filter driven from the real output of the equation via \beta which influences the filter/interpolator/sampler.

The paper then presents simulation results (using a gain factor of \beta = 0.18) which show that while the mM&M algorithm has fast acquisition it has lots of jitter and some symbol slips; by contrast the optimised mM&M algorithm exhibits much less jitter and no symbol slips, while preserving the same fast acquisition characteristics.

SDR and weather stations

I’ve been having fun recently learning about software defined radio (SDR). The impetus is this weather station, which Aidan got for Christmas.

We’ve all very much enjoyed the information it provides, and it’s been a great talking point with the receiver on the family dining table.

But when we’re at work or on holiday, wouldn’t it be nice to know what the weather’s like back home? Is it raining? Has the fence blown over? For that reason, in May I bought one of these:


NooElec R820T SDR

The mast transmits the weather data to the display by radio in the 433 MHz band. This NooElec NESDR Mini is a software-controlled digital radio receiver which covers 25MHz to 1750MHz. So it should work!
Since I got it, I’ve been busy learning how to make it go. This has turned out to be more complex than I realised – I finally got it all working in October! – so expect a series of follow-up blog posts.

plink port forwarding works but PuTTy’s doesn’t

Bizarrely, the answer is “fonts”!

Spent ages last night trying to work out why on my new PC forwarding 9418 to localhost port 9418 wasn’t working:


Curiously, X11 forwarding worked, and plink -L 9418:localhost:9418 … worked too – but the above didn’t. Can you see it?

The new PC has lots of pixels and the text was small. I first typed this


but it looked to me like I’d missed the colon, so I added one – see above. Turns out localhost::9418 is not a valid port forwarding destination, but there’s no error. It just silently failed.

Changing it to localhost:9418 (as I originally had it) of course made it work. PEBKAC again 🙁 .

WordPress upgrade 500 Internal Server Error

I used the auto-upgrade in wp-admin to upgrade to the latest version of WordPress on one of my WordPress-hosted blogs.

It downloaded, and then presented me with a 500 Internal Server Error.

Tediously, I don’t have easy/immediate access to my error logs, so I was working blind. The WordPress site wasn’t much use. After much fiddling about and (unnecessarily) manually reinstalling, I realised the problem (thanks to Unison, my file sync tool): all the files had their eXecute permissions removed! A quick chmod -R a+x later and everything was back up again! Whew!

Android recovery

I had to back up C’s HTC Desire phone today, with a broken screen. A bit challenging – how to start random applications on Android without any feedback? adb to the rescue, plus my identical phone. Going through the sequences in parallel on both phones helped me know where to touch.

First, make sure USB debugging mode is turned on. Unlock, make sure you’re at the home screen, and press Menu, then Settings. Scroll to the top of the list (it comes up at the last place you were at, which caught me out), then down to reveal Applications. Press it, and then Development, then USB Debugging, then OK.

Now fire up adb. Thanks to Bhayangkara for the recipe!

am start -a android.intent.action.MAIN -n com.riteshsahu.SMSBackupRestore/.FreeMain starts up the SMS backup/restore program (make sure you installed it already!). Press Backup, etc.

am start -a android.intent.action.MAIN -n starts up the Notes program. Press Menu, Backup.

In general, start the app on the working phone, then use your favourite log viewer to look for “Starting activity: Intent…” to figure out the right activity to pass to am start.

Now all you want is on the SD card – back it up.

Phew! Now all we need to do is send it off for repair. Fingers crossed!