<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE document PUBLIC "-//CNX//DTD CNXML 0.5 plus MathML//EN" "http://cnx.rice.edu/cnxml/0.5/DTD/cnxml_mathml.dtd">
<document xmlns="http://cnx.rice.edu/cnxml" xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/" id="None">
  <name>DFT-Based Filterbanks</name>
  <metadata>
  <md:version>1.1</md:version>
  <md:created>2005/02/04 09:35:40 US/Central</md:created>
  <md:revised>2005/04/28 14:43:51 GMT-5</md:revised>
  <md:authorlist>
      <md:author id="dljones">
      <md:firstname>Douglas</md:firstname>
      <md:othername>L.</md:othername>
      <md:surname>Jones</md:surname>
      <md:email>dl-jones@uiuc.edu</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist>
    <md:maintainer id="dljones">
      <md:firstname>Douglas</md:firstname>
      <md:othername>L.</md:othername>
      <md:surname>Jones</md:surname>
      <md:email>dl-jones@uiuc.edu</md:email>
    </md:maintainer>
    <md:maintainer id="charlet">
      <md:firstname>Charlet</md:firstname>
      
      <md:surname>Reedstrom</md:surname>
      <md:email>charlet@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer id="kclarks">
      <md:firstname>Kyle</md:firstname>
      
      <md:surname>Clarkson</md:surname>
      <md:email>kclarks@rice.edu</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  <md:keywordlist>
    <md:keyword>Multirate Signal Processing</md:keyword>
  </md:keywordlist>

  <md:abstract/>
</metadata>

  <content>
    <para id="para1">
      One common application of multirate processing arises in
      multirate, multi-channel filter banks (<cnxn target="fig1"/>).  

      <figure id="fig1">
	<media type="image/png" src="imag001.png"/>
      </figure>

      One application is separating frequency-division-multiplexed
      channels.  If the filters are narrowband, the output channels
      can be decimated without significant aliasing.
    </para>

    <para id="para2">
      Such structures are especially attractive when they can be
      implemented efficiently.  For example, if the filters are simply
      frequency modulated (by 
      <m:math>
	<m:apply>
	  <m:exp/>
	  <m:apply>
	    <m:minus/>
	    <m:apply>
	      <m:times/>
	      <m:imaginaryi/>
	      <m:apply>
		<m:divide/>
		<m:apply>
		  <m:times/>
		  <m:cn>2</m:cn>
		  <m:pi/>
		  <m:ci>k</m:ci>
		</m:apply>
		<m:ci>L</m:ci>
	      </m:apply>
	      <m:ci>n</m:ci>
	    </m:apply>
	  </m:apply>
	</m:apply>
      </m:math>) versions of each other, they can be efficiently
      implemented using FFTs!
    </para>

    <para id="para3">
      Furthermore, there are classes of filters called <term>perfect
      reconstruction filters</term> <!-- good place for a cnxn-->
      which are of finite length but from which the signal can be
      reconstructed exactly (using all <m:math><m:ci>M</m:ci></m:math>
      channels), even though the output of each channel experiences
      aliasing in the decimation step.  These types of filterbanks
      have received a lot of research attention, culminating in
      wavelet theory and techniques.
    </para>

    <section id="sec1">
      <name>Uniform DFT Filter Banks</name>
      <para id="para4">
	Suppose we wish to split a digital input signal into
	<m:math><m:ci>N</m:ci></m:math> frequency bands, uniformly
	spaced at center frequencies
	<m:math>
	  <m:apply>
	    <m:eq/>
	    <m:ci><m:msub>
		<m:mi>ω</m:mi>
		<m:mi>k</m:mi>
	      </m:msub></m:ci>
	    <m:apply>
	      <m:divide/>
	      <m:apply>
		<m:times/>
		<m:cn>2</m:cn>
		<m:pi/>
		<m:ci>k</m:ci>
	      </m:apply>
	      <m:ci>N</m:ci>
	    </m:apply>
	  </m:apply>
	</m:math>, for 
	<m:math>
	  <m:apply>
	    <m:leq/>
	    <m:cn>0</m:cn>
	    <m:ci>k</m:ci>
	    <m:apply>
	      <m:minus/>
	      <m:ci>N</m:ci>
	      <m:cn>1</m:cn>
	    </m:apply>
	  </m:apply>
	</m:math>.  Consider also a lowpass filter 
	<m:math>
	  <m:apply>
	    <m:ci type="fn">h</m:ci>
	    <m:ci>n</m:ci>
	  </m:apply>
	</m:math>, 
	<m:math>
	  <m:apply>
	    <m:approx/>
	    <m:apply>
	      <m:ci type="fn">H</m:ci>
	      <m:ci>ω</m:ci>
	    </m:apply>
	    <m:piecewise>
	      <m:piece>
		<m:cn>1</m:cn>
		<m:apply>
		  <m:lt/>
		  <m:apply>
		    <m:abs/>
		    <m:ci>ω</m:ci>
		  </m:apply>
		  <m:apply>
		    <m:divide/>
		    <m:pi/>
		    <m:ci>N</m:ci>
		  </m:apply>
		</m:apply>
	      </m:piece>
	      <m:otherwise>
		<m:cn>0</m:cn>
	      </m:otherwise>
	    </m:piecewise>
	  </m:apply>
	</m:math>.  Bandpass filters can be constructed which have the
	frequency response 
	<m:math display="block">
	  <m:apply>
	    <m:eq/>
	    <m:apply>
	      <m:ci type="fn"><m:msub>
		  <m:mi>H</m:mi>
		  <m:mi>k</m:mi>
		</m:msub></m:ci>
	      <m:ci>ω</m:ci>
	    </m:apply>
	    <m:apply>
	      <m:ci type="fn">H</m:ci>
	      <m:apply>
		<m:plus/>
		<m:ci>ω</m:ci>
		<m:apply>
		  <m:divide/>
		  <m:apply>
		    <m:times/>
		    <m:cn>2</m:cn>
		    <m:pi/>
		    <m:ci>k</m:ci>
		  </m:apply>
		  <m:ci>N</m:ci>
		</m:apply>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	</m:math>
	from
	<m:math display="block">
	  <m:apply>
	    <m:eq/>
	    <m:apply>
	      <m:ci type="fn"><m:msub>
		  <m:mi>h</m:mi>
		  <m:mi>k</m:mi>
		</m:msub></m:ci>
	      <m:ci>n</m:ci>
	    </m:apply>
	    <m:apply>
	      <m:times/>
	      <m:apply>
		<m:ci type="fn">h</m:ci>
		<m:ci>n</m:ci>
	      </m:apply>
	      <m:apply>
		<m:exp/>
		<m:apply>
		  <m:minus/>
		  <m:apply>
		    <m:times/>
		    <m:imaginaryi/>
		    <m:apply>
		      <m:divide/>
		      <m:apply>
			<m:times/>
			<m:cn>2</m:cn>
			<m:pi/>
			<m:ci>k</m:ci>
			<m:ci>n</m:ci>
		      </m:apply>
		      <m:ci>N</m:ci>
		    </m:apply>
		  </m:apply>
		</m:apply>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	</m:math>
	The output of the <m:math><m:ci>k</m:ci></m:math>th bandpass
	filter is simply (assume
	<m:math>
	  <m:apply>
	    <m:ci type="fn">h</m:ci>
	    <m:ci>n</m:ci>
	  </m:apply>
	</m:math> are FIR) 

	<equation id="eqn1">
	  <m:math>
	    <m:apply>
	      <m:eq/>
	      <m:apply>
		<m:csymbol definitionURL="http://cnx.rice.edu/cd/cnxmath.ocd#convolve"/>
		<m:apply>
		  <m:ci type="fn">x</m:ci>
		  <m:ci>n</m:ci>
		</m:apply>
		<m:apply>
		  <m:ci type="fn"><m:msub>
		      <m:mi>h</m:mi>
		      <m:mi>k</m:mi>
		    </m:msub></m:ci>
		  <m:ci>n</m:ci>
		</m:apply>
	      </m:apply>

	      <m:apply>
		<m:sum/>
		<m:bvar><m:ci>m</m:ci></m:bvar>
		<m:lowlimit><m:cn>0</m:cn></m:lowlimit>
		<m:uplimit>
		  <m:apply>
		    <m:minus/>
		    <m:ci>M</m:ci>
		    <m:cn>1</m:cn>
		  </m:apply>
		</m:uplimit>
		<m:apply>
		  <m:times/>
		  <m:apply>
		    <m:ci type="fn">x</m:ci>
		    <m:apply>
		      <m:minus/>
		      <m:ci>n</m:ci>
		      <m:ci>m</m:ci>
		    </m:apply>
		  </m:apply>
		  <m:apply>
		    <m:ci type="fn">h</m:ci>
		    <m:ci>m</m:ci>
		  </m:apply>
		  <m:apply>
		    <m:exp/>
		    <m:apply>
		      <m:minus/>
		      <m:apply>
			<m:times/>
			<m:imaginaryi/>
			<m:apply>
			  <m:divide/>
			  <m:apply>
			    <m:times/>
			    <m:cn>2</m:cn>
			    <m:pi/>
			    <m:ci>k</m:ci>
			    <m:ci>m</m:ci>
			  </m:apply>
			  <m:ci>N</m:ci>
			</m:apply>
		      </m:apply>
		    </m:apply>
		  </m:apply>
		</m:apply>
	      </m:apply>

	      <m:apply>
		<m:ci type="fn"><m:msub>
		    <m:mi>y</m:mi>
		    <m:mi>k</m:mi>
		  </m:msub></m:ci>
		<m:ci>n</m:ci>
	      </m:apply>
	    </m:apply>
	  </m:math>
	</equation>
	This looks suspiciously like a DFT, except that 
	<m:math>
	  <m:apply>
	    <m:neq/>
	    <m:ci>M</m:ci>
	    <m:ci>N</m:ci>
	  </m:apply>
	</m:math>, in general.  However, if we fix 
	<m:math>
	  <m:apply>
	    <m:eq/>
	    <m:ci>M</m:ci>
	    <m:ci>N</m:ci>
	  </m:apply>
	</m:math>, then we can compute <emphasis>all</emphasis> 
	<m:math>
	  <m:apply>
	    <m:ci type="fn"><m:msub>
		<m:mi>y</m:mi>
		<m:mi>k</m:mi>
	      </m:msub></m:ci>
	    <m:ci>n</m:ci>
	  </m:apply>
	</m:math> outputs simultaneously using an FFT of 
	<m:math>
	  <m:apply>
	    <m:times/>
	    <m:apply>
	      <m:ci type="fn">x</m:ci>
	      <m:apply>
		<m:minus/>
		<m:ci>n</m:ci>
		<m:ci>m</m:ci>
	      </m:apply>
	    </m:apply>
	    <m:apply>
	      <m:ci type="fn">h</m:ci>
	      <m:ci>m</m:ci>
	    </m:apply>
	  </m:apply>
	</m:math>:  The 
	<m:math>
	  <m:apply>
	    <m:eq/>
	    <m:mtext>kth FFT frequency output</m:mtext>
	    <m:apply>
	      <m:ci type="fn"><m:msub>
		  <m:mi>y</m:mi>
		  <m:mi>k</m:mi>
		</m:msub></m:ci>
	      <m:ci>n</m:ci>
	    </m:apply>
	  </m:apply>
	</m:math>!  So the cost of computing all of these filter banks
	outputs is 
	<m:math>
	  <m:apply>
	    <m:ci type="fn" class="discrete">O</m:ci>
	    <m:apply>
	      <m:times/>
	      <m:ci>N</m:ci>
	      <m:apply>
		<m:log/>
		<m:ci>N</m:ci>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	</m:math>, rather than 
	<m:math>
	  <m:apply>
	    <m:power/>
	    <m:ci>N</m:ci>
	    <m:cn>2</m:cn>
	  </m:apply>
	</m:math>, per a given <m:math><m:ci>n</m:ci></m:math>.  This
	is very useful for efficient implementation of
	<term>transmultiplexors</term> (FDM to TDM).
      </para>

      <exercise id="ex1">
	<problem>
	  <para id="paraex1a">
	    How would we implement this efficiently if we wanted to
	    decimate the individual channels 
	    <m:math>
	      <m:apply>
		<m:ci type="fn"><m:msub>
		    <m:mi>y</m:mi>
		    <m:mi>k</m:mi>
		  </m:msub></m:ci>
		<m:mi>n</m:mi>
	      </m:apply>
	    </m:math> by a factor of <m:math><m:ci>N</m:ci></m:math>,
	    to their approximate Nyquist bandwidth?
	  </para>
	</problem>
	<solution>
	  <para id="ex1sol">
	    Simply step by <m:math><m:ci>N</m:ci></m:math> time
	    samples between FFTs.
	  </para>
	</solution>
      </exercise>

      <exercise id="ex2">
	<problem>
	  <para id="ex2prob">
	    Do you expect significant aliasing?  If so, how do you
	    propose to combat it?  Efficiently?
	  </para>
	</problem>
	<solution>
	  <para id="ex2sol">
	    Aliasing should be expected.  There are two ways to reduce
	    it: 
	    <list id="ex2list" type="enumerated">
	      <item>
		Decimate by less ("oversample" the individual
		channels) such as decimating by a factor of 
		<m:math>
		  <m:apply>
		    <m:divide/>
		    <m:ci>N</m:ci>
		    <m:cn>2</m:cn>
		  </m:apply>
		</m:math>.  This is efficiently done by time-stepping
		by the appropriate factor.
	      </item>
	      <item>
		Design better (and thus longer) filters, say of length 
		<m:math>
		  <m:apply>
		    <m:times/>
		    <m:ci>L</m:ci>
		    <m:ci>N</m:ci>
		  </m:apply>
		</m:math>.  These can be efficiently computed by
		producing only <m:math><m:ci>N</m:ci></m:math> (every
		<m:math><m:ci>L</m:ci></m:math>th) FFT outputs using
		simplified FFTs.
	      </item>
	    </list>
	  </para>
	</solution>
      </exercise>

      <exercise id="ex3">
	<problem>
	  <para id="ex3prob">
	    How might one convert from <m:math><m:ci>N</m:ci></m:math>
	    input channels into an FDM signal efficiently?  (<cnxn target="fig2"/>)

	    <figure id="fig2">
	      <media type="image/png" src="imag002.png"/>
	    </figure>

	    <note type="note">
	      Such systems are used throughout the telephone system,
	      satellite communication links,
	      <foreign>etc.</foreign></note>
	  </para>
	</problem>
	<solution>
	  <para id="ex3sol">
	    Use an FFT and an inverse FFT for the modulation (TDM to
	    FDM) and demodulation (FDM to TDM), respectively.
	  </para>
	</solution>
      </exercise>

    </section>
  </content>
  
</document>
