<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
	
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
<<importTiddlers>>
* (11 Jan 2009) All those who have registered for the class are required to attend the first class, as we will be finalizing the class schedule during that time.
* (09 Feb 2009) The class hours have been shifted to MWF 6:30-8pm.
* (09 Feb 2009) Mid-term 1 will be this Friday, Feb. 13th, 6:30-8pm, in class. One 8.5 x 11 inch cheat sheet is allowed.
* (18 Feb 2009) Next week, we will have classes on Monday and Friday, i.e., on 23rd and 27th Feb.
<<clearOtherTiddlers>>
{{borderlessL{
|bgcolor:#500;<html><img src="./Images/Picture_050_medium.jpg" style="height: 275px; "/></html><br>|bgcolor:#500;width:70em;[[Chandra R. Murthy|Contact]] received the B. Tech degree in Electrical Engineering from the [[Indian Institute of Technology, Madras|http://www.iitm.ac.in]] in 1998 and the M.S. degree in Electrical and Computer Engineering from [[Purdue University|http://www.purdue.edu]] in 2000. In 2006, he obtained the Ph.D. degree in Electrical and Computer Engineering from the [[University of California, San Diego|http://www.ucsd.edu]], and the title of his thesis was ''Channel Estimation and Feedback for Multiple Antenna Communication''.|
|>|



From Aug. 2000 to Aug. 2002, he worked on WCDMA baseband transceiver design and 802.11b baseband receivers at [[Qualcomm, Inc|http://www.qualcomm.com]]; and from Aug. 2006 to Aug. 2007, he worked on advanced receiver algorithms for the 802.16e mobile ~WiMAX system at [[Beceem Communications|http://www.beceem.com]]. Currently, he is working as an Assistant Professor in the department of [[Electrical Communication Engineering|http://ece.iisc.ernet.in]] at the [[Indian Institute of Science|http://iisc.ernet.in/]], Bangalore, India. 

His [[research|Research]] interests are primarily in the areas of digital signal processing, information theory, estimation theory, and their applications in the optimization of MIMO, OFDM and CDMA wireless communication systems.
 
 
 
//{{{
config.macros.clearOtherTiddlers = {};

config.macros.clearOtherTiddlers.handler =
function(place,macroName,params,wikifier,paramString,tiddler)
{
        // get the title of the tiddler the macro is being rendered in...
        var title=story.findContainingTiddler(place).getAttribute("tiddler");
        // close all tiddlers, EXCLUDING current tiddler title
        story.closeAllTiddlers(title);
        return false;
} 
//}}}
Dr. Chandra R. Murthy
Assistant Professor
Electrical Communication Engineering Dept.
Indian Institute of Science, Bangalore 560 012
India

Office: @@color(brown):Signal Processing Building, West Wing, Room ~SPW103.@@

Phone: +91-80-2293-2464 extn. 21.
Fax    : +91-80-2360-0563

e-mail address: 
[img[mail me!|http://ece.iisc.ernet.in/~cmurthy/Images/iiscemail1.jpg][http://ece.iisc.ernet.in/~cmurthy/Images/iiscemail1.jpg]]
[[News]]
[[Biography]]
Welcome! This page contains information about ''E1-231: Digital Array Signal Processing'', during Fall 2009.

''Instructor:'' Chandra R. Murthy
''Class hours:'' MW 4:15-5:45pm, Room ~EC1.07.

''Textbook:''  Harry L. Van Trees, //Optimum Array Processing//, John Wiley & Sons, 2002.

''Syllabus:'' Chapters 2, 3, 4, 6 and 7.
''Prerequisites:'' probability and statistics, linear algebra, Fourier transforms.

|!S. No.|!Topic|!Num. Lectures|
|1.|Arrays and Spatial Filters| 3|
|2.|Linear arrays and apertures| 5|
|3.|Planar arrays and apertures| 3|
|4.|Optimum waveform estimation| 9|
|5.|Adaptive beamformers| 6|
||Total:| 26|

Project presentations will be separate lectures, at 5:30pm on the third Thursday of every month. 

''Grading:''

>Homeworks: 15%
>Midterm: Wednesday Sept 23, 2009, in class: 25%
>Project: Due Third Thursday of each month, 5-6:30pm at ~EC1.07: 20%
>Final: Wednesday, Nov 25, 2009, 4-7pm: 40%

Click for ''[[E9-231 Lecture notes]]''

Click for ''[[E9-231 Homeworks]]''

Click for ''[[E9-231 Announcements]]''
* ''Aug. 05, 2009, 4pm'': first class at ~EC1.08.
* @@color(white):Project Description (Aug. 05, 2009): click [[here|E9_231/Class_Notes/Project.pdf]].@@
* ''Aug. 05'': ~HW1 online. Due: Aug. 19.
* ''Aug. 17'': ~HW2 online. Due: Sep. 02.
* ''Aug. 24'': There is a TA for the course: @@color(brown):Nissar K. E.@@ He can be contacted at x@y where x = ke.nissar and y = gmail.com
* ''Aug. 30'': Project presentations will be on the @@color(seagreen):third Thursday@@ of the month, starting at 5pm. The first set of presentations will be on Sep. 17th. Two groups will make the presentation, for about 45 mins each.
* ''Sep. 16'': Just for this month, the project presentations have been postponed by 1 week, i.e., to Sep. 24th. This will not be possible from the next month, so you are advised to prepare well in advance.
* ''Sep. 22'': Last year's exam is [[here|E9_231/Class_Notes/exam1_2008.pdf]] and the solution is [[here|E9_231/Class_Notes/exam1_sol_2008.pdf]].
* ''Oct 05'': Exam 1 results: Mean = 13.7, Standard deviation = 3, Highest = 19, Lowest = 8, out of 25.
* ''Homework 1 (Due Aug. 19):'' 
> Problems 2.4.1 and 2.4.6 from the text. 
> Click  [[here|E9_231/Class_Notes/hw1sol.pdf]] for Kalyan and Srinivas' solution. 
* ''Homework 2 (Due Sep. 02):'' 
> Problems 2.6.2, 2.6.6 and 3.2.6 from the text. 
> Click  [[here|E9_231/Class_Notes/hw2sol.pdf]] for Ajay, Mahesh and Neeraj's solution. 
* ''Homework 3 (Due Sep. 16):'' 
> Problems 3.5.5 a, c, e and 3.7.2 from the text. Also, list at least 6 properties of //P~~c~~ = C (C^^H^^ C)^^-1^^ C^^H^^//
> Click  [[here|E9_231/Class_Notes/hw3sol.pdf]] for Kalyan and Srinivas' solution. 
* ''Homework 4 (Due Sep. 30):'' 
> Problems 4.1.5 and 4.1.11 from the text.
> Click  [[here|E9_231/Class_Notes/hw4sol.pdf]] for Ajay, Mahesh and Neeraj's solution. 
* ''Homework 5 (Due Oct. 06):''
> Problems 4.2.1 and 4.2.7 from the text.
> Click  [[here|E9_231/Class_Notes/hw5sol.pdf]] for Ajay and Mahesh's solution. 
* ''Homework 6 (Due Oct. 14):''
> Problems 5.2.2, 5.2.3 and 5.2.4 from the text.
> Click  [[here|E9_231/Class_Notes/hw6sol.pdf]] for Kalyan and Srinivas' solution. 
* ''Homework 7 (Due Oct. 28):''
> Problems 6.2.4 and 6.3.3 from the text.
* ''Homework 8 (Due Nov. 9):''
> Problems 6.5.3, 6.7.9(a) and 6.9.1(a) from the text.




# @@color(white):Lecture 0 (Aug. 05, 2009): click [[here|E9_231/Class_Notes/Lec0.pdf]]. Scribe: Chandra Murthy@@
# @@color(white):Lecture  1 (Aug. 10, 2009): click [[here|E9_231/Class_Notes/Lec1.pdf]]. Scribe: K. G. Nagananda@@
# @@color(white):Lecture  2 (Aug. 12, 2009): click [[here|E9_231/Class_Notes/Lec2.pdf]]. Scribe: Bharath B. N.@@
# @@color(white):Lecture  3 (Aug. 17, 2009): click [[here|E9_231/Class_Notes/Lec3.pdf]]. Scribe: Chandrasekhar J.@@
# @@color(white):Lecture  4 (Aug. 19, 2009): click [[here|E9_231/Class_Notes/Lec4.pdf]]. Scribe: Deepa B.@@
# @@color(white):Lecture  5 (Aug. 24, 2009): click [[here|E9_231/Class_Notes/Lec5.pdf]]. Scribe: Manasa Mandala@@
# @@color(white):Lecture  6 (Aug. 26, 2009): click [[here|E9_231/Class_Notes/Lec6.pdf]]. Scribe: K. Murali Krishna@@
# @@color(white):Lecture  7 (Aug. 31, 2009): click [[here|E9_231/Class_Notes/Lec7.pdf]]. Scribe: Nadir Cazi@@
# @@color(white):Lecture  8 (Sep. 07, 2009): click [[here|E9_231/Class_Notes/Lec8.pdf]]. Scribe: Nissar N. E.@@
# @@color(white):Lecture  9 (Sep. 09, 2009): click [[here|E9_231/Class_Notes/Lec9.pdf]]. Scribe: Nishkam Jain@@
# @@color(white):Lecture 10 (Sep. 14, 2009): click [[here|E9_231/Class_Notes/Lec10.pdf]]. Scribe: Vinod Jaiswal@@
# @@color(white):Lecture 11 (Sep. 16, 2009): click [[here|E9_231/Class_Notes/Lec11.pdf]]. Scribe: Nithya V. S.@@
# @@color(white):Lecture 12 (Sep. 30, 2009): click [[here|E9_231/Class_Notes/Lec12.pdf]]. Scribe: Chandrasekhar J.@@
# @@color(white):Lecture 13 (Oct. 05, 2009): click [[here|E9_231/Class_Notes/Lec13.pdf]]. Scribe: Deepa B.@@
# @@color(white):Lecture 14 (Oct. 07, 2009): click [[here|E9_231/Class_Notes/Lec14.pdf]]. Scribe: Mansasa Mandala@@
# @@color(white):Lecture 15 (Oct. 12, 2009): click [[here|E9_231/Class_Notes/Lec15.pdf]]. Scribe: K. Murali Krishna@@
# @@color(white):Lecture 16 (Oct. 14, 2009): click [[here|E9_231/Class_Notes/Lec16.pdf]]. Scribe: Nadir Cazi@@
# @@color(white):Lecture 17 (Oct. 19, 2009): click [[here|E9_231/Class_Notes/Lec17.pdf]]. Scribe: Nissar N. E.@@
# @@color(white):Lecture 18 (Oct. 21, 2009): click [[here|E9_231/Class_Notes/Lec18.pdf]]. Scribe: Nithya V. S.@@
# @@color(white):Lecture 19 (Oct. 26, 2009): click [[here|E9_231/Class_Notes/Lec19.pdf]]. Scribe: Vinod Jaiswal@@
# @@color(white):Lecture 20 (Oct. 28, 2009): click [[here|E9_231/Class_Notes/Lec20.pdf]]. Scribe: Nishkam Jain@@
# @@color(white):Lecture 21 (Nov. 02, 2009): click [[here|E9_231/Class_Notes/Lec21.pdf]]. Scribe: Chandrasekhar J.@@
# @@color(white):Lecture 22 (Nov. 04, 2009): click [[here|E9_231/Class_Notes/Lec22.pdf]]. Scribe: Deepa B.@@
# @@color(white):Lecture 23 (Nov. 09, 2009): click [[here|E9_231/Class_Notes/Lec23.pdf]]. Scribe: Manasa Mandala@@
# @@color(white):Lecture 24 (Nov. 11, 2009): click [[here|E9_231/Class_Notes/Lec24.pdf]]. Scribe: K. Murali Krishna@@

To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
* Homeworks will be in the form of problem sets that are given out periodically and also as isolated problems that occur during lectures. 
*You are encouraged to do the homeworks either in teams or on your own. Either is fine so long as you understand what's going on. 
*Some homeworks will be in the form of Matlab programming assignments. You can complete them either using SERC's computational resources (make sure you have a working account) or using your or your advisor's computational resources. 
*Homeworks will not be graded, but it is very likely that a similar problem will show up in the tests/exams.

# Homework 1: click [[here|E1_244/Homeworks/hw1.pdf]].
# Homework 2: click [[here|E1_244/Homeworks/hw2.pdf]].
# Homework 3: click [[here|E1_244/Homeworks/hw3.pdf]].
# Homework 4: click [[here|E1_244/Homeworks/hw4.pdf]].
# Homework 5: click [[here|E1_244/Homeworks/hw5.pdf]].
# Homework 6: click [[here|E1_244/Homeworks/hw6.pdf]].
# Homework 7: click [[here|E1_244/Homeworks/hw7.pdf]].
# Homework 8: click [[here|E1_244/Homeworks/hw8.pdf]].


<<clearOtherTiddlers>>
''Timing''
* ''Lectures:'' Tuesdays and Thursdays: 8:00am to 9:30am in Room ECE 1.07
* ''Help sessions:'' Friday: 5:00pm to 6:00pm in room EC 1.07 or EC 1.08 (whichever is free). 

''Instructors''
* Chandra R. Murthy (Lecture 5 - onwards)
* Neelesh B. Mehta (Lectures 1 through 4)

''Grading''
* 1st midterm: 25%
* 2nd midterm: 25%
* Final: 50%

''Text book(s)''
# ''Detection, Estimation and Modulation Theory'',  Van Trees, Parts 1 and 2, John Wiley ~Inter-Science.
# ''Testing Statistical Hypothesis'', E.L. Lehmann, John Wiley, 1986. 
# ''An Introduction to Signal Detection and Estimation'', H. V. Poor, 2nd Ed., ~Springer-Verlag, 1994.
# ''Introduction to Statistical Signal Processing with Applications'', M.D. Srinath, P.K.Rajasekaran, R. Viswanathan, ~Prentice-Hall, 1996.
# To review probability: ''Probability, random variables, and stochastic processes'', A. Papoulis, ~McGraw-Hill International Edition. 

''List of students'' 
* Please check your email ids, names, etc., and make sure that they are correct.  E-mail me if there are any corrections.
* We will send out occasional broadcast emails to communicate with the class when needed.



<<clearOtherTiddlers>>
''Timings''
* ''Lectures:'' MWF: 6:30-8pm in Room ECE 1.07

''Instructor''
* Chandra R. Murthy

''Grading''
* 1st midterm: Friday, 13th Feb. 2009, 6:30-8pm: 20%. Solutions click [[here|E1_244/Homeworks/test1_sol.pdf]]
* 2nd midterm: Friday, 13th Mar. 2009, 6:30-8pm: 40%. Solutions click [[here|E1_244/Homeworks/test2_sol.pdf]]
* Final: Thursday, 23rd Apr. 2009, 2pm-5pm: 40%. Last year's exam [[here|E1_244/Homeworks/final_2008.pdf]], and solution [[here|E1_244/Homeworks/final_2008_sol.pdf]]. The solution to this year's exam is [[here|E1_244/Homeworks/final_2009_sol.pdf]].

''Text books''
# ''An Introduction to Signal Detection and Estimation'', H. V. Poor, 2nd Ed., ~Springer-Verlag, 1994.
# ''Detection, Estimation and Modulation Theory'',  Van Trees, Parts 1 and 2, John Wiley ~Inter-Science.
# ''Testing Statistical Hypothesis'', E.L. Lehmann, John Wiley, 1986. 
# ''Introduction to Statistical Signal Processing with Applications'', M.D. Srinath, P.K.Rajasekaran, R. Viswanathan, ~Prentice-Hall, 1996.
# To review probability: ''Probability, random variables, and stochastic processes'', A. Papoulis, ~McGraw-Hill International Edition. 

''List of students'' 
* Please check your email ids, names, etc., and make sure that they are correct.  E-mail me if there are any corrections.
* We will send out occasional broadcast emails to communicate with the class when needed.

Click for ''[[Syllabus and Lecture Schedule]]''

Click for ''[[Homeworks]]''

Click for ''[[Announcements]]''
/***
|''Name:''|LegacyStrikeThroughPlugin|
|''Description:''|Support for legacy (pre 2.1) strike through formatting|
|''Version:''|1.0.2|
|''Date:''|Jul 21, 2006|
|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|
|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.0|
***/

//{{{
// Ensure that the LegacyStrikeThrough Plugin is only installed once.
if(!version.extensions.LegacyStrikeThroughPlugin) {
version.extensions.LegacyStrikeThroughPlugin = {installed:true};

config.formatters.push(
{
	name: "legacyStrikeByChar",
	match: "==",
	termRegExp: /(==)/mg,
	element: "strike",
	handler: config.formatterHelpers.createElementAndWikify
});

} //# end of "install only once"
//}}}
* [[Signal Processing for Communications Lab|http://ece.iisc.ernet.in/~cmurthy/SPCLab.html]]
* My Ph.D. adviser: [[Prof. Bhaskar Rao|http://dsp.ucsd.edu/~brao]], at the [[University of California, San Diego|http://www.ucsd.edu]]!
* [[NCSI|http://www.ncsi.iisc.ernet.in]]
[[Biography]]
[[Research]]
[[Publications]]
[[Students]]
[[Teaching]]
[[Openings]]
[[News]]
[[Links]]
[[Contact]]
[[E9 231: Digital Array Signal Processing.]]
<<today>>

<<minesweeper>>
* Click [[here|http://www.ece.iisc.ernet.in/~spcom]] for information about the Signal Processing and Communications Conference to be held here in Bangalore in 2010.
* ''C. R. Murthy'' and B. D. Rao, "High-rate analysis of channel-optimized vector quantization", //IEEE Int. Conf. on Acoustics, Speech and Sig. Proc.//, Hawaii, U.S.A., April 2007.
* ''C. R. Murthy'', E. R. Duni and B. D. Rao, "High-rate analysis of vector quantization for noisy channels", //IEEE Int. Conf. on Acoustics, Speech and Sig. Proc.//, Tolouse, France, May 2006.
* ''C. R. Murthy'' and B. D. Rao, "Effect of feedback errors on quantized equal gain transmission", //IEEE Int. Conf. on Communications (ICC)//, Istanbul, Turkey, Jun. 2006.
* ''C. R. Murthy'' and B. D. Rao, "High-rate analysis of source coding for symmetric error channels", //Proc. Data Compression Conference (DCC)//, Snowbird, UT, Mar. 2006. 
* ''C. R. Murthy'' and B. D. Rao,"A vector quantization based approach for equal gain transmission", //Proc. IEEE Global Commun. Conf., (Globecom)//, St. Louis, MO, Nov. 2005.
* ''C. R. Murthy'', J. Zheng and B. D. Rao, "Multiple Antenna Systems with Finite Rate Feedback," //Invited paper, Proc. IEEE MILCOM//, Atlantic City, NJ, Oct. 2005. 
* A. K. Jagannatham, ''C. R. Murthy'' and B. D. Rao, "A semi-blind MIMO channel estimation scheme for MRT," //IEEE Int. Conf. on Acoustics, Speech and Sig. Proc.//, Philadelphia, PA, USA, Mar. 2005.
* ''C. R. Murthy'', J. C. Roh and B. D. Rao, "Optimality of extended maximum ratio transmission," //6th Baiona Workshop on Signal Processing in Communications//, Baiona, Spain, Sept. 2003, pp. 47-50.
I have the following job openings/opportunities for research in my group:

* @@color(green):''Project Assistantships:''@@ As a //project assistant//, you will be responsible for all aspects of the execution of a selected project. The project will be focussed, so you can expect to get a comprehensive experience on all aspects of implementing a significant research project, starting from setting up equipment, to conducting extensive literature survey, deriving new results, programming and setting up simulations, writing research papers and technical reports and making detailed technical presentations to expert committees. The only limitation on what can be done is how much energy and interest you have. The pay will be as per the Institute norms and I expect you to be willing to commit to working on the project for at least an year (it won't work out for either of us if it is for a shorter duration). People with B.Tech or M.Tech in ECE/CS/EE with experience in Matlab programming are welcome to @@color(olive):apply by sending me an e-mail with your CV@@. 

> @@color(darkred):''Unfortunately, I currently do not have any openings for project assistantships.''@@

* @@color(green):''Masters Students:''@@ As a //Masters' student//, if you sign up for doing your project with me, I will try to give you the flavor of the thrill of discovering something new. However, since the time duration of the project is short, this will be possible only if you start working on a specific problem from the first day you start here. Some example areas in which you could work (in any old order) include:
> @@color(crimson):Energy budget calculations for low-power and energy harvesting sensors@@
> @@color(green):Synchronization aspects of cognitive radio@@
> @@color(crimson):MIMO channel estimation and its impact on communication system performance@@
> @@color(green):Limits of communication with channel feedback@@
And the list goes on. If you wish to work with me, just @@color(olive):send me an e-mail.@@

* @@color(green):''~PhD Students:''@@ The //~PhD// is a journey, but the end goal is twofold: (a) for you to get to the point where you know a lot more than me on the topic you choose to specialize in, and (b) for you to gain the confidence that you can do research at the same level as any academic around the world. There's loads to discuss about doing a ~PhD with me, so if you are interested, do send me an @@color(olive):e-mail and lets find a mutually convenient time to chat.@@

<div class='header' macro='gradient vert #390108 #900'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu'>
<div refresh='content' tiddler='MainMenu'></div>
</div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
''Journal''

* K. G. Nagananda and ''C. R. Murthy'', @@color(skyblue):"Asymmetric Transmitter Cooperation in Multiuser Wireless Networks: Achievable Rate Regions,"@@ submitted to the //IEEE Transactions on Info. Theory//, Aug. 2009. Extended version available on [[arXiv|http://arxiv.org/abs/0908.1490]].
* ''C. R. Murthy'', @@color(skyblue):"Power Management and Data Rate Maximization in Wireless Energy Harvesting Sensors,"@@ //International Journal of Wireless Information Networks//, DOI: 10.1007/s10776-009-0104-2, July 2009.
* ''C. R. Murthy'', E. R. Duni and B. D. Rao, @@color(skyblue):"High-rate vector quantization for noisy channels with random index assignment,"@@ Submitted to //IEEE Transactions on Info. Theory//, 2008.
* ''C. R. Murthy'', J. Zheng and B. D. Rao, @@color(skyblue):Performance of quantized equal gain transmission with noisy feedback channels@@, //IEEE Transactions on Sig. Proc.//, vol. 56, no. 6, pp. 2451-2460, June 2008.
* ''C. R. Murthy'' and B. D. Rao, @@color(skyblue):"Quantization methods for equal gain transmission with finite rate feedback,"@@ //IEEE Transactions on Sig. Proc.//, vol. 55, pp. 233-245, Jan. 2007.
* ''C. R. Murthy'', A. K. Jagannatham and B. D. Rao, @@color(skyblue):"Training-only and semi-blind channel estimation for maximum ratio  transmission based MIMO systems,"@@ //IEEE Transactions on Sig. Proc.//, vol. 54, pp. 2546-2558, July 2006. 

''Recent Conference Papers''

* T. Ganesan and ''C. R. Murthy'', @@color(skyblue):"Receiver only Optimized ~Semi-Hard Decision VQ For Noisy Channels,"@@ //Proc. IEEE Global Commun. Conf., (Globecom)//, Honolulu, Hawaii, USA, Nov. 2009.
* K. G. Nagananda and ''C. R. Murthy'', @@color(skyblue):"Information Theoretic Results for ~Three-User Cognitive Radio Channels,"@@ //Proc. IEEE Global Commun. Conf., (Globecom)//, Honolulu, Hawaii, USA, Nov. 2009.
* B. Medepally, N. B. Mehta and ''C. R. Murthy'', @@color(skyblue):"Implications of Energy Profile and Storage on Energy Harvesting Sensor Link Performance,"@@ //Proc. IEEE Global Commun. Conf., (Globecom)//, Honolulu, Hawaii, USA, Nov. 2009.
* R. Annavajjala and ''C. R. Murthy'', @@color(skyblue):Pilot-assisted distributed co-phasing for wireless sensor networks,"@@ //Proc. IEEE Comm. Conf. on Sensor, Mesh, and Ad Hoc Communications and Networks (SECON)//, Rome, Italy, Jun. 2009. 
* K. G. Nagananda and ''C. R. Murthy'', @@color(skyblue):"Three User Cognitive Channels with Cumulative Message Sharing: An achievable rate region,"@@ //Proc. IEEE Information Theory Workshop (ITW 2009)//, Volos, Greece, Jun. 2009.
* B. N. Bharath and ''C. R. Murthy'', @@color(skyblue):"Reverse channel training for reciprocal MIMO systems with spatial multiplexing,"@@ //IEEE Int. Conf. on Acoustics, Speech and Sig. Proc.//, Taiwan, Taipei (Republic of China), Apr. 2009.
* Ganesan T. and ''C. R. Murthy'', @@color(skyblue):"Trellis Coded Block Codes and Applications,"@@ //Proc. National Conference on Communications//, Guwahati, India, Jan. 2009.
* ''C. R. Murthy'', A. K. Jagannatham and B. D. Rao, @@color(skyblue):"Robust semi-blind estimation for beamforming based MIMO wireless communication,"@@ //Proc. IEEE Global Commun. Conf., (Globecom)//, New Orleans, LA, USA, Nov. 2008.
* ''C. R. Murthy'', @@color(skyblue):"Power management and data rate maximization in wireless energy harvesting sensors,"@@  //IEEE Int. Symp. on Personal, Indoor and Mobile Radio Commn. (PIMRC)//, Cannes, France, Sept. 2008.
* ''C. R. Murthy'', @@color(skyblue):"Receiver-only optimized vector quantization for noisy channels",@@ //IEEE Int. Symp. on Personal, Indoor and Mobile Radio Commn. (PIMRC)//, Cannes, France, Sept. 2008.



Click for selected OlderConferencePapers

''Patent''
* ''C. R. Murthy'', S. A. Glazko, C. C. Riddle and A. Wong, "Demodulating encoded data", US patent 6,999,533 granted Feb. 14, 2006.
My research interests are broadly in the areas of digital signal processing, information theory, estimation theory, and their applications in the optimization of MIMO wireless communication systems. Some of the projects I have worked on in the past are:

* @@color(seagreen):Transmit optimization/precoding in MIMO systems@@
* @@color(seagreen):CSI feedback schemes in MISO/MIMO systems@@
* @@color(seagreen):MIMO (semi-blind) channel estimation techniques@@
* @@color(seagreen):Channel feedback for OFDM@@
* @@color(seagreen):Tracking time varying channels in feedback based systems@@
* @@color(seagreen):Effect of estimation errors, feedback delay and channel errors on communication systems@@
* @@color(seagreen):Robust channel estimation in time division duplex (TDD) systems@@

Currently, I am interested in problems in:

* @@color(brown):Source coding and joint source-channel coding@@
* @@color(brown):MIMO/OFDM channel estimation@@
* @@color(brown):Cognitive radio@@
* @@color(brown):Machine learning@@
* @@color(brown):Cooperative communications@@
* @@color(brown):Scheduling and resource allocation@@
* @@color(brown):Compressive sensing@@
* @@color(brown):Interference management@@

You can find more information at the lab web-site : [[SPC Lab|http://ece.iisc.ernet.in/~cmurthy/SPCLab.html]]
Assistant Professor, Indian Institute of Science, Bangalore 560 012, India.
Dr. Chandra R. Murthy
The most foolish thoughts you ever heard.
''Prospective Students''
> If you are ''//not yet//'' a student at ~IISc, please visit the [[IISc homepage|http://www.iisc.ernet.in]] and the [[ECE Department homepage|http://ece.iisc.ernet.in/]] for more information on how to become one.
> If you are ''currently'' a student at ~IISc and would like to work with me, please feel free to stop by my office for a quick chat. My office is on the ground floor, in the West Wing of the Signal Processing building. It is room 103, the third room to the left when you enter the building.

''Current Students''
> ''Bharath Bettagere'' 
> ''Sanjeev Gopinath''
> ''Ganesan T''
> ''Chandrasekhar J''
> ''Krishna Chaythanya K. V.''
> ''Prashant N''
> ''K. E. Nissar''
> ''S. Kumar Reddy''
> ''Parthajit Mohapatra''
> ''Venugopalakrishna Y. R.''
> ''Ranga Prakash D.''

For more information, please see the [[Signal Processing for Communications Lab|http://ece.iisc.ernet.in/~cmurthy/SPCLab.html]]
/***
http://tiddlystyles.com/#theme:DevFire
Author: Clint Checketts
***/

/*{{{*/
body {
background: #000;
}
/*}}}*/
/***
!Link styles /% ============================================================= %/
***/
/*{{{*/
a,
a.button,
#mainMenu a.button,
#sidebarOptions .sliderPanel a{
 color: #ffbf00;
 border: 0;
 background: transparent;
}

a:hover,
a.button:hover,
#mainMenu a.button:hover,
#sidebarOptions .sliderPanel a:hover
#sidebarOptions .sliderPanel a:active{
 color: #ff7f00;
 border: 0;
 border-bottom: #ff7f00 1px dashed;
 background: transparent;
 text-decoration: none;
}

#displayArea .button.highlight{
 color: #ffbf00;
 background: #4c4c4c;
}
/*}}}*/
/***
!Header styles /% ============================================================= %/
***/
/*{{{*/
.header{
 border-bottom: 2px solid #ffbf00;
 color: #fff;
}

.headerForeground a {
 color: #fff;
}

.header a:hover {
 border-bottom: 1px dashed #fff;
}
/*}}}*/
/***
!Main menu styles /% ============================================================= %/
***/
/*{{{*/
#mainMenu {color: #fff;}
#mainMenu h1{
 font-size: 1.1em;
}
#mainMenu li,#mainMenu ul{
 list-style: none;
 margin: 0;
 padding: 0;
}
/*}}}*/
/***
!Sidebar styles /% ============================================================= %/
***/
/*{{{*/
#sidebar {
 right: 0;
 color: #fff;
 border: 2px solid #ffbf00;
 border-width: 0 0 2px 2px;
}
#sidebarOptions {
 background-color: #4c4c4c;
 padding: 0;
}

#sidebarOptions a{
 margin: 0;
 color: #ffbf00;
 border: 0;
}
#sidebarOptions a:hover {
 color: #4c4c4c;
 background-color: #ffbf00;

}

#sidebarOptions a:active {
 color: #ffbf00;
 background-color: transparent;
}

#sidebarOptions .sliderPanel {
 background-color: #333;
 margin: 0;
}

#sidebarTabs {background-color: #4c4c4c;}
#sidebarTabs .tabSelected {
 padding: 3px 3px;
 cursor: default;
 color: #ffbf00;
 background-color: #666;
}
#sidebarTabs .tabUnselected {
 color: #ffbf00;
 background-color: #5f5f5f;
 padding: 0 4px;
}

#sidebarTabs .tabUnselected:hover,
#sidebarTabs .tabContents {
 background-color: #666;
}

.listTitle{color: #FFF;}
#sidebarTabs .tabContents a{
 color: #ffbf00;
}

#sidebarTabs .tabContents a:hover{
 color: #ff7f00;
 background: transparent;
}

#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tab:hover,
#sidebarTabs .txtMoreTab .tabContents{
 color: #ffbf00;
 background: #4c4c4c;
}

#sidebarTabs .txtMoreTab .tabUnselected {
 color: #ffbf00;
 background: #5f5f5f;
}

.tab.tabSelected, .tab.tabSelected:hover{color: #ffbf00; border: 0; background-color: #4c4c4c;cursor:default;}
.tab.tabUnselected {background-color: #666;}
.tab.tabUnselected:hover{color:#ffbf00; border: 0;background-color: #4c4c4c;}
.tabContents {
 background-color: #4c4c4c;
 border: 0;
}
.tabContents .tabContents{background: #666;}
.tabContents .tabSelected{background: #666;}
.tabContents .tabUnselected{background: #5f5f5f;}
.tabContents .tab:hover{background: #666;}
/*}}}*/
/***
!Message area styles /% ============================================================= %/
***/
/*{{{*/
#messageArea {background-color: #666; color: #fff; border: 2px solid #ffbf00;}
#messageArea a:link, #messageArea a:visited {color: #ffbf00; text-decoration:none;}
#messageArea a:hover {color: #ff7f00;}
#messageArea a:active {color: #ff7f00;}
#messageArea .messageToolbar a{
 border: 1px solid #ffbf00;
 background: #4c4c4c;
}
/*}}}*/
/***
!Popup styles /% ============================================================= %/
***/
/*{{{*/
.popup {color: #fff; background-color: #4c4c4c; border: 1px solid #ffbf00;}
.popup li.disabled{color: #fff;}
.popup a {color: #ffbf00; }
.popup a:hover { background: transparent; color: #ff7f00; border: 0;}
.popup hr {color: #ffbf00; background: #ffbf00;}
/*}}}*/
/***
!Tiddler Display styles /% ============================================================= %/
***/
/*{{{*/
.title{color: #fff;}
h1, h2, h3, h4, h5 {
 color: #fff;
 background-color: transparent;
 border-bottom: 1px solid #333;
}

.subtitle{
 color: #666;
}

.viewer {color: #fff; }

.viewer table{background: #666; color: #fff;}

.viewer th {background-color: #996; color: #fff;}

.viewer pre, .viewer code {color: #ddd; background-color: #4c4c4c; border: 1px solid #ffbf00;}

.viewer hr {color: #666;}

.tiddler .button {color: #4c4c4c;}
.tiddler .button:hover { color: #ffbf00; background-color: #4c4c4c;}
.tiddler .button:active {color: #ffbf00; background-color: #4c4c4c;}

.toolbar {
 color: #4c4c4c;
}

.toolbar a.button,
.toolbar a.button:hover,
.toolbar a.button:active,
.editorFooter a{
 border: 0;
}

.footer {
 color: #ddd;
}

.selected .footer {
 color: #888;
}

.highlight, .marked {
 color: #000;
 background-color: #ffe72f;
}
.editorFooter {
 color: #aaa;
}

.tab{
-moz-border-radius-topleft: 3px;
-moz-border-radius-topright: 3px;
}

.tagging,
.tagged{
 background: #4c4c4c;
 border: 1px solid #4c4c4c; 
}

.selected .tagging,
.selected .tagged{
 background-color: #333;
 border: 1px solid #ffbf00;
}

.tagging .listTitle,
.tagged .listTitle{
 color: #fff;
}

.tagging .button,
.tagged .button{
 color: #ffbf00;
 border: 0;
 padding: 0;
}

.tagging .button:hover,
.tagged .button:hover{
background: transparent;
}

.selected .isTag .tagging.simple,
.selected .tagged.simple,
.isTag .tagging.simple,
.tagged.simple {
 float: none;
 display: inline;
 border: 0;
 background: transparent;
 color: #fff;
 margin: 0;
}

.cascade {
 background: #4c4c4c;
 color: #ddd;
 border: 1px solid #ffbf00;
}
/*}}}*/
|sortable|k
| S. No.|Topics | Num. Lectures |h
| 1|Background and probability review | 2 |
| 2|Bayesian, ~Neyman-Pearson & Minimax detection | 2 |
| 3|Composite hypothesis testing, Generalized LRT | 1 |
| 4|Sequential and distributed detection | 2 |
| 5|Performance analysis | 1 |
| 6|Nonparametric detection | 1 |
| 7|Signal detection in continuous time, KL theorem | 1 |
| 8|Detection in Gaussian noise | 2 |
| 9|Estimation theory: Bayesian, MMSE and MAP estimation | 2 |
| 10|~Fischer-Neyman factorization theorem, ~Rao-Blackwell theorem | 2 |
| 11|~Maximum-Likelihood estimation | 2 |
| 12|Exponential families and the ~Cramer-Rao Bound | 2 |
| 13|Consistency, efficiency and asymptotics | 2 |
| 14|Kalman filtering | 2 |
| 15|Linear estimation of signals, Weiner filtering | 2 |
/***
|''Name:''|TableSortingPlugin|
|''Description:''|Dynamically sort tables by clicking on column headers|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#TableSortingPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.02|
|''Date:''|25-01-2008|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|
!!Usage:
* Make sure your table has a header row
** {{{|Name|Phone Number|Address|h}}}<br> Note the /h/ that denote a header row 
* Give the table a class of 'sortable'
** {{{
|sortable|k
|Name|Phone Number|Address|h
}}}<br>Note the /k/ that denotes a class name being assigned to the table.
* To disallow sorting by a column, place {{{<<nosort>>}}} in it's header
* To automatically sort a table by a column, place {{{<<autosort>>}}} in the header for that column
** Or to sort automatically but in reverse order, use {{{<<autosort reverse>>}}}

!!Example:
|sortable|k
|Name |Salary |Extension |Performance |File Size |Start date |h
|ZBloggs, Fred |$12000.00 |1353 |+1.2 |74.2Kb |Aug 19, 2003 21:34:00 |
|ABloggs, Fred |$12000.00 |1353 |1.2 |3350b |09/18/2003 |
|CBloggs, Fred |$12000 |1353 |1.200 |55.2Kb |August 18, 2003 |
|DBloggs, Fred |$12000.00 |1353 |1.2 |2100b |07/18/2003 |
|Bloggs, Fred |$12000.00 |1353 |01.20 |6.156Mb |08/17/2003 05:43 |
|Turvey, Kevin |$191200.00 |2342 |-33 |1b |02/05/1979 |
|Mbogo, Arnold |$32010.12 |2755 |-21.673 |1.2Gb |09/08/1998 |
|Shakespeare, Bill |£122000.00|3211 |6 |33.22Gb |12/11/1961 |
|Shakespeare, Hamlet |£9000 |9005 |-8 |3Gb |01/01/2002 |
|Fitz, Marvin |€3300.30 |5554 |+5 |4Kb |05/22/1995 |

***/
// /%
//!BEGIN-PLUGIN-CODE
config.tableSorting = {
	
	darrow: "\u2193",
	
	uarrow: "\u2191",
	
	getText : function (o) {
		var p = o.cells[SORT_INDEX];
		return p.innerText || p.textContent || '';
	},
	
	sortTable : function (o,rev) {
		SORT_INDEX = o.getAttribute("index");
		var c = config.tableSorting;
		var T = findRelated(o.parentNode,"TABLE");
		if(T.tBodies[0].rows.length<=1) 
			return;
		var itm = "";
		var i = 0;
		while (itm == "" && i < T.tBodies[0].rows.length) {
			itm = c.getText(T.tBodies[0].rows[i]).trim();
			i++;
		}
		if (itm == "") 
			return; 	
		var r = [];
		var S = o.getElementsByTagName("span")[0];		
		c.fn = c.sortAlpha; 
		if(!isNaN(Date.parse(itm)))
			c.fn = c.sortDate; 
		else if(itm.match(/^[$|£|€|\+|\-]{0,1}\d*\.{0,1}\d+$/)) 
			c.fn = c.sortNumber; 
		else if(itm.match(/^\d*\.{0,1}\d+[K|M|G]{0,1}b$/)) 
			c.fn = c.sortFile; 
		for(i=0; i<T.tBodies[0].rows.length; i++) {
			 r[i]=T.tBodies[0].rows[i]; 
		} 
		r.sort(c.reSort);
		if(S.firstChild.nodeValue==c.darrow || rev) {
			r.reverse();
			S.firstChild.nodeValue=c.uarrow;
		} 
		else 
			S.firstChild.nodeValue=c.darrow;
		var thead = T.getElementsByTagName('thead')[0]; 
		var headers = thead.rows[thead.rows.length-1].cells;
		for(var k=0; k<headers.length; k++) {
			if(!hasClass(headers[k],"nosort"))
				addClass(headers[k].getElementsByTagName("span")[0],"hidden");
		}
		removeClass(S,"hidden");
		for(i=0; i<r.length; i++) { 
			T.tBodies[0].appendChild(r[i]);
			c.stripe(r[i],i);
			for(var j=0; j<r[i].cells.length;j++){
				removeClass(r[i].cells[j],"sortedCol");
			}
			addClass(r[i].cells[SORT_INDEX],"sortedCol");
		}
	},
	
	stripe : function (e,i){
		var cl = ["oddRow","evenRow"];
		i&1? cl.reverse() : cl;
		removeClass(e,cl[1]);
		addClass(e,cl[0]);
	},
	
	sortNumber : function(v) {
		var x = parseFloat(this.getText(v).replace(/[^0-9.-]/g,''));
		return isNaN(x)? 0: x;
	},
	
	sortDate : function(v) {
		return Date.parse(this.getText(v));
	},

	sortAlpha : function(v) {
		return this.getText(v).toLowerCase();
	},
	
	sortFile : function(v) { 		
		var j, q = config.messages.sizeTemplates, s = this.getText(v);
		for (var i=0; i<q.length; i++) {
			if ((j = s.toLowerCase().indexOf(q[i].template.replace("%0\u00a0","").toLowerCase())) != -1)
				return q[i].unit * s.substr(0,j);
		}
		return parseFloat(s);
	},
	
	reSort : function(a,b){
		var c = config.tableSorting;
		var aa = c.fn(a);
		var bb = c.fn(b);
		return ((aa==bb)? 0 : ((aa<bb)? -1:1));
	}
};

Story.prototype.tSort_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText){
	var elem = this.tSort_refreshTiddler.apply(this,arguments);
	if(elem){
		var tables = elem.getElementsByTagName("TABLE");
		var c = config.tableSorting;
		for(var i=0; i<tables.length; i++){
			if(hasClass(tables[i],"sortable")){
				var x = null, rev, table = tables[i], thead = table.getElementsByTagName('thead')[0], headers = thead.rows[thead.rows.length-1].cells;
				for (var j=0; j<headers.length; j++){
					var h = headers[j];
					if (hasClass(h,"nosort"))
						continue;
					h.setAttribute("index",j);
					h.onclick = function(){c.sortTable(this); return false;};
					h.ondblclick = stopEvent;
					if(h.getElementsByTagName("span").length == 0)
						createTiddlyElement(h,"span",null,"hidden",c.uarrow); 
					if(!x && hasClass(h,"autosort")) {
						x = j;
						rev = hasClass(h,"reverse");
					}
				}
				if(x)
					c.sortTable(headers[x],rev);		
			}
		}
	}
	return elem; 
};

setStylesheet("table.sortable span.hidden {visibility:hidden;}\n"+
	"table.sortable thead {cursor:pointer;}\n"+
	"table.sortable .nosort {cursor:default;}\n"+
	"table.sortable td.sortedCol {background:#ffc;}","TableSortingPluginStyles");

function stopEvent(e){
	var ev = e? e : window.event;
	ev.cancelBubble = true;
	if (ev.stopPropagation) ev.stopPropagation();
	return false;	
}	

config.macros.nosort={
	handler : function(place){
		addClass(place,"nosort");
	}	
};

config.macros.autosort={
	handler : function(place,m,p,w,pS){
		addClass(place,"autosort"+" "+pS);		
	}	
};
//!END-PLUGIN-CODE
// %/
This section contains information about teaching and my professional activities other than research!

* ''~Aug-Dec 2009:'' [[E9 231: Digital Array Signal Processing.]]

* ''Aug. 2009:'' TPC activities: UKIWCWS 2009 and SPCOM 2010.
* ''July 2009:'' Taught a refresher course on Linear Algebra to the incoming students.
* TPC activities: IEEE Vehicular Technology Conference 2009 (Transmission Technologies track) and IEEE Broadband Wireless Access workshop (to be held in conjunction with Globecom 2009) 
* ''[[Jan-May 2009:  E1 244: Detection and Estimation]]''
* ''Mar. 24th, 2009:'' tutorial lecture on [[Multiple Antenna Communication Techniques|Talks/mimo_ppt_chandra_murthy.pdf]] delivered at the R.V. College of Engineering, Bangalore. 
* ''Feb. 21st, 2009:'' Delivered a keynote lecture on Cognitive Radio at the National Conference on Computer Networks, held at the Reva Institute of Technology and Management, Bangalore.
* ''Dec. 10th-11th, 2008:'' Offered a two-day //Baseband Training// course to ARM Embedded Systems, Inc.
* ''Oct. 25, 2008:'' semi-tutorial lecture on //How to Pursue Research in Wireless Sensor Networks// at Sri Siddartha Institute of Technology, Tumkur. 
* ''~Aug-Dec 2008:'' Taught E9 231: Digital Array Signal Processing.
* ''July 31, 2008:'' tutorial lecture on [[Multiple Antenna Communication Techniques|Talks/mimo_ppt_chandra_murthy.pdf]] at the Advanced technology program of AICTE on //Recent trends in Communication Engg., Systems, Networks and Services// held between July 28th and August 8th 2008 at [[NIT-K Surathkal|http://www.nitk.ac.in/]].
* ''July 21-28, 2008:'' Refresher course on Probability Theory at the ECE dept, ~IISc.
* ''May 10, 2008:'' tutorial lecture at the [[JNN College of Engineering, Shimoga|http://www.jnnce.ac.in/]] on [[Wireless Sensor Networks|Talks/wsn_10may2008.pdf]].
* ''Apr. 12, 2008:'' As part of the @@color(DarkViolet):~DRDO-IISc Workshop on Wireless Communications@@, I conducted an overview tutorial on [[Cognitive Radio|Talks/CognitiveRadioOverview.pdf]]. 
* ''Mar. 23, 2008'': I helped organize @@color(DarkViolet):SP Connect@@: a premier signal processing networking event conducted by the [[IEEE Signal Processing Society, Bangalore Chapter|http://www.ieeesp-blr.org/]].
* [[Jan-May 2008: E1 244: Estimation and Detection.]]
* ''Dec. 12th and 13th, 2007:'' I conducted a short course on //Signal Processing for Communications// at the Govt. College of Engg., Trivandrum, under the ''Technical Education Quality Improvement Program''. The topics covered included baseband and passband communications (from a filtering perspective) and equalization. 
version.extensions.minesweeper = {major: 0, minor: 7, revision: 2};

config.macros.minesweeper = {};

config.macros.minesweeper.handler = function(place,macroName,params) {
    var width = params[0];
    var height = params[1];
    var bombs = params[2];

    if (width == undefined) width = 9;
    if (height == undefined) height = width;
    if (bombs == undefined) bombs = Math.round(width * height /  8)
    if (bombs > width * height) bombs = width * height;

    var aGame = new MinesweeperGame();

    createTiddlyElement(place,'div',aGame.id,null,'If you see this, Minesweeper is broken.  Let Daniel know (DanielBaird at gmail dot com).');
    aGame.newGame(width, height, bombs);
}
// =======================================================================
function MinesweeperGame() {
    this.idprefix = 'mines';
    this.version = '0.72 beta';
    this.id = this.idprefix + MinesweeperGame.prototype.nextid;
    MinesweeperGame.prototype.nextid++;
    return this;
}
// -----------------------------------------------------------------------
MinesweeperGame.prototype.nextid = 0;
// -----------------------------------------------------------------------
MinesweeperGame.prototype.newGame = function(height, width, mines) {
    this.height = height;
    this.width = width;
    this.mines = mines;
    this.total = height * width;
    this.markMode = false;

    this.startGame();
}
// -----------------------------------------------------------------------
MinesweeperGame.prototype.startGame = function() {

    this.gamestate = 'ready';
    this.clicks = 0;
    this.marks = 0;
    this.message = 'click on the board to begin';

    this.starttime = null;
    this.wintime = null;
    this.board = new Array();

    // create the squares
    for (var x = 0; x < this.height; x++) {
        var row = new Array();
        for (var y = 0; y < this.width; y++) {
            row.push( {count: 0, mine: false, clicked: false, marked: false} );
        }
        this.board.push(row);
    }

    // add mines
    for (var m = 0; m < this.mines; m++) {
        var mx = Math.round((this.height-1)*Math.random());
        var my = Math.round((this.width-1)*Math.random());
        if (this.board[mx][my].mine) {
            m--;
        } else {
            this.board[mx][my].mine = true;
        }
    }

    // work out counts
    for (var cx = 0; cx < this.height; cx++) {
        for (var cy = 0; cy < this.width; cy++) {
            var count = 0;
            for (var dx = -1; dx < 2; dx++) {
                for (var dy = -1; dy < 2; dy++) {
                    var nx = cx + dx;
                    var ny = cy + dy;
                    if ( (!(dx==0 && dy==0))
                            && (nx >= 0) && (nx < this.height)
                            && (ny >= 0) && (ny < this.width)
                            && this.board[nx][ny].mine) {
                        count++;
                    }
                }
            }
            this.board[cx][cy].count = count;
        }
    }
    this.showBoard();
}
// -----------------------------------------------------------------------
MinesweeperGame.prototype.showBoard = function() {
    var node = document.getElementById(this.id);
    var html = new Array();
    html.push('<table class="minefield" cellspacing="2">');
    html.push('<tr><td class="info" colspan="'+this.width+'">');
    html.push('Minesweeper '+this.version+'<br /><b>'+this.gamestate+'</b>');
    if (this.gamestate == 'playing') {
        this.message = (this.mines - this.marks)+' mines unmarked';
    }
    html.push('</td></tr>');
    for (var x = 0; x < this.height; x++) {
        html.push('<tr>');
        for (var y = 0; y < this.width; y++) {
            html.push( this.makeSquare(x,y) );
        }
        html.push('</tr>');
    }
    var cls = 'un';
    if (this.markMode) cls = '';
    html.push('<tr><td id="'+this.id+'_markbtn" class="'+cls+'clicked widebtn" colspan="'+this.width+'">mark / unmark mines</td></tr>');
    html.push('<tr><td class="info" colspan="'+this.width+'">'+this.message);
    html.push('<small>');
    html.push('<br /><span class="minesweeper' + cls + 'show">ctrl- shift- or alt-</span>click to reveal a square');
    html.push('<br /><span class="minesweeper' + cls + 'hide">ctrl- shift- or alt-</span>click to mark a mine');
    html.push('</small>');
    html.push('</td></tr>');
    html.push('</table>');
    node.innerHTML = html.join('');
    node.onclick = this.getClickHandler();
}
// -----------------------------------------------------------------------
MinesweeperGame.prototype.makeSquare = function(x,y) {
    var sq = this.board[x][y];
    var reveal = (this.gamestate != 'playing' && this.gamestate != 'ready');
    var html = new Array();
    if (sq.clicked) {
        html.push('<td class="clicked" id="'+this.id+'_x-'+x+'_y-'+y+'">');
        if (!sq.marked && reveal && sq.mine) {
            html.push('B!');
        } else if (!sq.marked && reveal && sq.mine) {
            html.push('B!');
        } else if (sq.count > 0){
            html.push(sq.count);
        } else {
            html.push('&nbsp;');
        }
    } else {
        html.push('<td class="unclicked" id="'+this.id+'_x-'+x+'_y-'+y+'">');
        if (sq.marked && !reveal) {
            html.push('B?');
        } else if (sq.marked && sq.mine && reveal) {
            html.push('B');
        } else if (sq.marked && !sq.mine && reveal) {
            html.push('X');
        } else if (sq.mine && reveal) {
            html.push('B!');
        } else {
            html.push('&nbsp;');
        }
    }
    html.push('</td>');
    return html.join('');
}
// -------------------------------------------------------------------
MinesweeperGame.prototype.clickSquare = function(cx,cy,modifier) {
    if (this.gamestate == 'ready') {
        this.starttime = new Date();
        this.gamestate = 'playing';
    }
    if (this.gamestate == 'playing') {
        if (!this.board[cx][cy].clicked) {
            if ( (modifier && !this.markMode) || (!modifier && this.markMode) ) {
                if (this.board[cx][cy].marked) {
                    this.marks--;
                    this.board[cx][cy].marked = false;
                } else {
                    this.marks++;
                    this.board[cx][cy].marked = true;
                }
            } else if (!this.board[cx][cy].clicked && !this.board[cx][cy].marked) {
                this.revealSquare(cx,cy);
            }
            this.markMode = false;
        }
        this.checkWin();
        this.showBoard();
    } else {
        // clicked when we're not playing..
        this.startGame();
    }
}
// -------------------------------------------------------------------
MinesweeperGame.prototype.revealSquare = function(x,y) {
    if (this.board[x][y].clicked == false && this.board[x][y].marked == false) {
        this.board[x][y].clicked = true;
        this.clicks++;
        if (this.board[x][y].mine) {
            this.gamestate = 'boom!';
            this.message = 'click board to play again';
        } else if (this.board[x][y].count == 0) {
            // if it's a zero, we might have to reveal some other squares..
            for (var dx = -1; dx < 2; dx++) {
                for (var dy = -1; dy < 2; dy++) {
                    var nx = x + dx;
                    var ny = y + dy;
                    if ( (!(dx==0 && dy==0)) && (nx >= 0) && (nx < this.height) && (ny >= 0) && (ny < this.width) ) {
                        this.revealSquare(nx,ny);
                    }
                }
            }
        }
    }
}
// -------------------------------------------------------------------
MinesweeperGame.prototype.handleClick = function(e) {
    // work out which cell was clicked
    if (!e) var e = window.event;
    var str = resolveTarget(e).id;
    if (str && str != undefined) {
        if (str == this.id + '_markbtn') {
            this.markMode = !this.markMode;
            this.showBoard();
        } else {
            var cx = parseInt(str.substr( str.indexOf('x-')+2 ));
            var cy = parseInt(str.substr( str.indexOf('y-')+2 ));
            if ( !isNaN(cx) && !isNaN(cy) ) {
                this.clickSquare(cx,cy,(e.altKey || e.shiftKey || e.ctrlKey));
            }
        }
    }
}
// -------------------------------------------------------------------
MinesweeperGame.prototype.getClickHandler = function() {
    var thisGame = this;
    return function(e) {
        thisGame.handleClick(e);
    }
}
// -------------------------------------------------------------------
MinesweeperGame.prototype.checkWin = function() {
    if (this.clicks == this.total - this.mines && this.gamestate !='boom!') {
        this.gamestate = 'win';
        this.wintime = new Date();
        this.message = 'You won in '+Math.round(((this.wintime - this.starttime)/100))/10+' seconds';
        this.message = this.message + '<br />click board to play again';
    }
}
// -----------------------------------------------------------------------

setStylesheet(
	".viewer .minefield { "+
		"background: #ddd; "+
		"border: double 3px black; "+
		"border-collapse: separate; "+
		"border-spacing: 2px; "+
	"} \n"+

	".viewer .minefield td { "+
		"cursor: default; "+
		"width: 1.3em; "+
		"height: 1.1em; "+
		"text-align: center; "+
		"vertical-align: center; "+
		"background: #ddd; "+
		"border: 1px solid #ccc; "+
	"} \n"+

	".viewer .minefield td.info, .viewer .minefield td.widebtn { "+
		"width: auto; "+
	"} \n"+

	".minesweeperhide, .minesweeperunshow { "+
		"display: none; "+
	"} \n"+

	".viewer .minefield td.unclicked { "+
		"cursor: pointer; "+
		"border-color: #fff; "+
		"border-right-color: #999; "+
		"border-bottom-color: #999; "+
	"} \n"+
	"",
	"MinesweeperGame");