http://www.eecs.qmul.ac.uk/~dm303/