<?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="m10704">
  <name xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">Design of Linear-Phase FIR Filters by General Interpolation</name>
  <metadata xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">
  <md:version xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">2.1</md:version>
  <md:created xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">2002/07/01</md:created>
  <md:revised xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">2002/07/01</md:revised>
  <md:authorlist xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">
      <md:author xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/" id="selesi">
      <md:firstname xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">Ivan</md:firstname>
      
      <md:surname xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">Selesnick</md:surname>
      <md:email xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">selesi@taco.poly.edu</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">
    <md:maintainer xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/" id="charlet">
      <md:firstname xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">Charlet</md:firstname>
      
      <md:surname xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">Reedstrom</md:surname>
      <md:email xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">charlet@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/" id="selesi">
      <md:firstname xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">Ivan</md:firstname>
      
      <md:surname xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">Selesnick</md:surname>
      <md:email xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">selesi@taco.poly.edu</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  

  <md:abstract xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">(Blank Abstract)</md:abstract>
</metadata>

  <content xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">
    <section 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="geninterp">
      <name xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">DESIGN OF FIR FILTERS BY GENERAL INTERPOLATION</name>
      <para 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="genint1">
	If the desired interpolation points are not uniformly spaced
	between <m:math><m:cn>0</m:cn></m:math> and
	<m:math><m:pi/></m:math> then we can not use the DFT.  We must
	take a different approach.  Recall that for a Type I FIR
	filter,
	<m:math display="block">
	  <m:apply>
	    <m:eq/>
	    <m:apply>
	      <m:ci>A</m:ci>
	      <m:ci>ω</m:ci>
	    </m:apply>
	    <m:apply>
	      <m:plus/>
	      <m:apply>
		<m:ci type="fn">h</m:ci>
		<m:ci>M</m:ci>
	      </m:apply>
	      <m:apply>
		<m:times/>
		<m:cn>2</m:cn>
		<m:apply>
		  <m:sum/>
		  <m:bvar><m:ci>n</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">h</m:ci>
		    <m:ci>n</m:ci>
		  </m:apply>
		    <m:apply>
		      <m:cos/>
		      <m:apply>
			<m:times/>
			<m:apply>
			  <m:minus/>
			  <m:ci>M</m:ci>
			  <m:ci>n</m:ci>
			</m:apply>
			<m:ci>ω</m:ci>
		      </m:apply>
		    </m:apply>
		  </m:apply>
		</m:apply>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	</m:math>

	For convenience, it is common to write this as


	<m:math display="block">
	  <m:apply>
	    <m:eq/>
	    <m:apply>
	      <m:ci>A</m:ci>
	      <m:ci>ω</m:ci>
	    </m:apply>
	    <m:apply>
	      <m:sum/>
	      <m:bvar><m:ci>n</m:ci></m:bvar>
	      <m:lowlimit><m:cn>0</m:cn></m:lowlimit>
	      <m:uplimit><m:ci>M</m:ci></m:uplimit>
	      <m:apply>
		<m:times/>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:ci>n</m:ci>
		</m:apply>
		<m:apply>
		  <m:cos/>
		  <m:apply>
		    <m:times/>
		    <m:ci>n</m:ci>
		    <m:ci>ω</m:ci>
		  </m:apply>
		</m:apply>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	</m:math> where 

	<m:math>
	  <m:apply>
	    <m:eq/>
	    <m:apply>
	      <m:ci type="fn">h</m:ci>
	      <m:ci>M</m:ci>
	    </m:apply>
	    <m:apply>
	      <m:ci type="fn">a</m:ci>
	      <m:cn>0</m:cn>
	    </m:apply>
	  </m:apply>
	</m:math> and
	<m:math>
	  <m:apply>
	    <m:forall/>
	    <m:bvar><m:ci>n</m:ci></m:bvar>
	    <m:condition>
	      <m:apply>
		<m:leq/>
		<m:cn>1</m:cn>
		<m:ci>n</m:ci>
		<m:apply>
		  <m:minus/>
		  <m:ci>N</m:ci>
		  <m:cn>1</m:cn>
		</m:apply>
	      </m:apply>
	    </m:condition>
	    <m:apply>
	      <m:eq/>
	      <m:apply>
		<m:ci type="fn">h</m:ci>
		<m:ci>n</m:ci>
	      </m:apply>
	      <m:apply>
		<m:divide/>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:apply>
		    <m:minus/>
		    <m:ci>M</m:ci>
		    <m:ci>n</m:ci>
		  </m:apply>
		</m:apply>
		<m:cn>2</m:cn>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	</m:math>.  Note that there are 

	<m:math>
	  <m:apply>
	    <m:plus/>
	    <m:ci>M</m:ci>
	    <m:cn>1</m:cn>
	  </m:apply>
	</m:math> parameters.  Suppose it is desired that
	<m:math>
	  <m:apply>
	    <m:ci type="fn">A</m:ci>
	    <m:ci>ω</m:ci>
	  </m:apply>
	</m:math> interpolates a set of specified values: 
	<m:math display="block">
	  <m:apply>
	    <m:forall/>
	    <m:bvar><m:ci>k</m:ci></m:bvar>
	    <m:condition>
	      <m:apply>
		<m:leq/>
		<m:cn>0</m:cn>
		<m:ci>k</m:ci>
		<m:ci>M</m:ci>
	      </m:apply>
	    </m:condition>
	    <m:apply>
	      <m:eq/>
	      <m:apply>
		<m:ci type="fn">A</m:ci>
		<m:ci><m:msub>
		    <m:mi>ω</m:mi>
		    <m:mi>k</m:mi>
		  </m:msub></m:ci>
	      </m:apply>
	      <m:ci><m:msub>
		  <m:mi>A</m:mi>
		  <m:mi>k</m:mi>
		</m:msub></m:ci>
	    </m:apply>
	  </m:apply>
	</m:math>

	To obtain a Type I FIR filter satisfying these interpolation
	equations, one can set up a linear system of equations.  
	<m:math display="block">
	  <m:apply>
	    <m:forall/>
	    <m:bvar><m:ci>k</m:ci></m:bvar>
	    <m:condition>
	      <m:apply>
		<m:leq/>
		<m:cn>0</m:cn>
		<m:ci>k</m:ci>
		<m:ci>M</m:ci>
	      </m:apply>
	    </m:condition>
	    <m:apply>
	      <m:eq/>
	      <m:apply>
		<m:sum/>
		<m:bvar><m:ci>n</m:ci></m:bvar>
		<m:lowlimit><m:cn>0</m:cn></m:lowlimit>
		<m:uplimit><m:ci>M</m:ci></m:uplimit>
		<m:apply>
		  <m:times/>
		  <m:apply>
		    <m:ci type="fn">a</m:ci>
		    <m:ci>n</m:ci>
		  </m:apply>
		  <m:apply>
		    <m:cos/>
		    <m:apply>
		      <m:times/>
		      <m:ci>n</m:ci>
		      <m:ci><m:msub>
			  <m:mi>ω</m:mi>
			  <m:mi>k</m:mi>
			</m:msub></m:ci>
		    </m:apply>
		  </m:apply>
		</m:apply>
	      </m:apply>
	      <m:ci><m:msub>
		  <m:mi>A</m:mi>
		  <m:mi>k</m:mi>
		</m:msub></m:ci>
	    </m:apply>
	  </m:apply>
	</m:math>

	In matrix form, we have 

	<m:math display="block">
	  <m:apply>
	    <m:eq/>
	    <m:apply>
	      <m:times/>
	      <m:matrix>
		<m:matrixrow>
		  <m:cn>1</m:cn>
		  <m:apply>
		    <m:cos/>
		    <m:ci><m:msub>
			<m:mi>ω</m:mi>
			<m:mn>0</m:mn>
		      </m:msub></m:ci>
		  </m:apply>
		  <m:apply>
		    <m:cos/>
		    <m:apply>
		      <m:times/>
		      <m:cn>2</m:cn>
		      <m:ci><m:msub>
			  <m:mi>ω</m:mi>
			  <m:mn>0</m:mn>
			</m:msub></m:ci>
		    </m:apply>
		  </m:apply>
		  <m:ci>…</m:ci>
		  <m:apply>
		    <m:cos/>
		    <m:apply>
		      <m:times/>
		      <m:ci>M</m:ci>
		      <m:ci><m:msub>
			  <m:mi>ω</m:mi>
			  <m:mn>0</m:mn>
			</m:msub></m:ci>
		    </m:apply>
		  </m:apply>
		</m:matrixrow>
		<m:matrixrow>
		  <m:cn>1</m:cn>
		  <m:apply>
		    <m:cos/>
		    <m:ci><m:msub>
			<m:mi>ω</m:mi>
			<m:mn>1</m:mn>
		      </m:msub></m:ci>
		  </m:apply>
		  <m:apply>
		    <m:cos/>
		    <m:apply>
		      <m:times/>
		      <m:cn>2</m:cn>
		      <m:ci><m:msub>
			  <m:mi>ω</m:mi>
			  <m:mn>1</m:mn>
			</m:msub></m:ci>
		    </m:apply>
		  </m:apply>
		  <m:ci>…</m:ci>
		  <m:apply>
		    <m:cos/>
		    <m:apply>
		      <m:times/>
		      <m:ci>M</m:ci>
		      <m:ci><m:msub>
			  <m:mi>ω</m:mi>
			  <m:mn>1</m:mn>
			</m:msub></m:ci>
		    </m:apply>
		  </m:apply>
		</m:matrixrow>
		<m:matrixrow>
		  <m:ci>⋮</m:ci>
		</m:matrixrow>
		<m:matrixrow>
		  <m:cn>1</m:cn>
		  <m:apply>
		  <m:cos/>
		    <m:ci><m:msub>
			<m:mi>ω</m:mi>
			<m:mi>M</m:mi>
		      </m:msub></m:ci>
		  </m:apply>
		  <m:apply>
		    <m:cos/>
		    <m:apply>
		      <m:times/>
		      <m:cn>2</m:cn>
		      <m:ci><m:msub>
			  <m:mi>ω</m:mi>
			  <m:mi>M</m:mi>
			</m:msub></m:ci>
		    </m:apply>
		  </m:apply>
		  <m:ci>…</m:ci>
		  <m:apply>
		    <m:cos/>
		    <m:apply>
		      <m:times/>
		      <m:ci>M</m:ci>
		      <m:ci><m:msub>
			  <m:mi>ω</m:mi>
			  <m:mi>M</m:mi>
			</m:msub></m:ci>
		    </m:apply>
		  </m:apply>
		</m:matrixrow>
	      </m:matrix>
	      <m:vector>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:cn>0</m:cn>
		</m:apply>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:cn>1</m:cn>
		</m:apply>
		<m:ci>⋮</m:ci>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:ci>M</m:ci>
		</m:apply>
	      </m:vector>
	    </m:apply>
	    <m:vector>
	      <m:apply>
		<m:ci type="fn">A</m:ci>
		<m:cn>0</m:cn>
	      </m:apply>
		<m:apply>
		<m:ci type="fn">A</m:ci>
		<m:cn>1</m:cn>
	      </m:apply>
	      <m:ci>⋮</m:ci>
	      <m:apply>
		<m:ci type="fn">A</m:ci>
		<m:ci>M</m:ci>
	      </m:apply>
	    </m:vector>
	  </m:apply>
	</m:math>

	Once 
	<m:math>
	  <m:apply>
	    <m:ci type="fn">a</m:ci>
	    <m:ci>n</m:ci>
	  </m:apply>
	</m:math> is found, the filter 

	<m:math>
	  <m:apply>
	    <m:ci type="fn">h</m:ci>
	    <m:ci>n</m:ci>
	  </m:apply>
	</m:math> is formed as

	<m:math display="block">
	  <m:apply>
	    <m:eq/>
	    <m:set>
	      <m:apply>
		<m:ci type="fn">h</m:ci>
		<m:ci>n</m:ci>
	      </m:apply>
	    </m:set>
	    <m:apply>
	      <m:times/>
	      <m:cn type="rational">1<m:sep/>2</m:cn>
	      <m:set>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:ci>M</m:ci>
		</m:apply>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:apply>
		    <m:minus/>
		    <m:ci>M</m:ci>
		    <m:cn>1</m:cn>
		  </m:apply>
		</m:apply>
		<m:ci>…</m:ci>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:cn>1</m:cn>
		</m:apply>
		<m:apply>
		  <m:times/>
		  <m:cn>2</m:cn>
		  <m:apply>
		    <m:ci type="fn">a</m:ci>
		    <m:cn>0</m:cn>
		  </m:apply>
		</m:apply>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:cn>1</m:cn>
		</m:apply>
		<m:ci>…</m:ci>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:apply>
		    <m:minus/>
		    <m:ci>M</m:ci>
		    <m:cn>1</m:cn>
		  </m:apply>
		</m:apply>
		<m:apply>
		  <m:ci type="fn">a</m:ci>
		  <m:ci>M</m:ci>
		</m:apply>
	      </m:set>
	    </m:apply>
	  </m:apply>
	</m:math>
      </para>
    </section>

    <section 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="geninterpex">
      <name xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">EXAMPLE</name>
      <para 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="genex">
	In the following example, we design a length 19 Type I FIR.
	Then
	<m:math>
	  <m:apply>
	    <m:eq/>
	    <m:ci>M</m:ci>
	    <m:cn>9</m:cn>
	  </m:apply>
	</m:math> and we have 10 parameters.  We can therefore have 10
	interpolation equations.  We choose: 

	<equation 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="eqn1">
	  <m:math>
	    <m:apply>
	      <m:forall/>
	      <m:bvar><m:ci>k</m:ci></m:bvar>
	      <m:condition>
		<m:apply>
		  <m:eq/>
		  <m:ci><m:msub>
		      <m:mi>ω</m:mi>
		      <m:mi>k</m:mi>
		    </m:msub></m:ci>
		  <m:set>
		    <m:cn>0</m:cn>
		    <m:apply>
		      <m:times/>
		      <m:cn>0.1</m:cn>
		      <m:pi/>
		    </m:apply>
		    <m:apply>
		      <m:times/>
		      <m:cn>0.2</m:cn>
		      <m:pi/>
		    </m:apply>
		    <m:apply>
		      <m:times/>
		      <m:cn>0.3</m:cn>
		      <m:pi/>
		    </m:apply>
		  </m:set>
		</m:apply>
	      </m:condition>
	      <m:condition>
		<m:apply>
		  <m:leq/>
		  <m:cn>0</m:cn>
		  <m:ci>k</m:ci>
		  <m:cn>3</m:cn>
		</m:apply>
	      </m:condition>
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:ci type="fn">A</m:ci>
		  <m:ci><m:msub>
		      <m:mi>ω</m:mi>
		      <m:mi>k</m:mi>
		    </m:msub></m:ci>
		</m:apply>
		<m:cn>1</m:cn>
	      </m:apply>
	    </m:apply>
	  </m:math>
	</equation>

	<equation 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="eqn2">
	  <m:math>
	    <m:apply>
	      <m:forall/>
	      <m:bvar><m:ci>k</m:ci></m:bvar>
	      <m:condition>
		<m:apply>
		  <m:eq/>
		  <m:ci><m:msub>
		      <m:mi>ω</m:mi>
		      <m:mi>k</m:mi>
		    </m:msub></m:ci>
		  <m:set>
		    <m:apply>
		      <m:times/>
		      <m:cn>0.5</m:cn>
		      <m:pi/>
		    </m:apply>
		    <m:apply>
		      <m:times/>
		      <m:cn>0.6</m:cn>
		      <m:pi/>
		    </m:apply>
		    <m:apply>
		      <m:times/>
		      <m:cn>0.7</m:cn>
		      <m:pi/>
		    </m:apply>
		    <m:apply>
		      <m:times/>
		      <m:cn>0.8</m:cn>
		      <m:pi/>
		    </m:apply>
		    <m:apply>
		      <m:times/>
		      <m:cn>0.8</m:cn>
		      <m:pi/>
		    </m:apply>
		    <m:apply>
		      <m:times/>
		      <m:cn>1.0</m:cn>
		      <m:pi/>
		    </m:apply>
		  </m:set>
		</m:apply>
	      </m:condition>
	      <m:condition>
		<m:apply>
		  <m:leq/>
		  <m:cn>4</m:cn>
		  <m:ci>k</m:ci>
		  <m:cn>9</m:cn>
		</m:apply>
	      </m:condition>
	      <m:apply>
		<m:eq/>
		<m:apply>
		  <m:ci type="fn">A</m:ci>
		  <m:ci><m:msub>
		      <m:mi>ω</m:mi>
		      <m:mi>k</m:mi>
		    </m:msub></m:ci>
		</m:apply>
		<m:cn>0</m:cn>
	      </m:apply>
	    </m:apply>
	  </m:math>
	</equation>

	To solve this interpolation problem in Matlab, note that the
	matrix can be generated by a single multiplication of a column
	vector and a row vector.  This is done with the command

	<code xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">C = cos(wk*[0:M]);</code>

	where <code xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">wk</code> is a column vector containing
	the frequency points.  To solve the linear system of
	equations, we can use the Matlab backslash command.
      </para>

      <code xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/" type="block">

	N = 19;
	M = (N-1)/2;
	wk = [0 .1 .2 .3 .5 .6 .7 .8 .9 1]'*pi;
	Ak = [1 1 1 1 0 0 0 0 0 0]';
	C = cos(wk*[0:M]);
	a = C/Ak;
	h = (1/2)*[a([M:-1:1]+1); 2*a([0]+1); a(1:M]+1)];

	[A,w] = firamp(h,1);
	plot(w/pi,A,wk/pi,Ak,'o')
	title('A(\omega)')
	xlabel('\omega/\pi')

      </code>

      <figure 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="geninterpexfig">
	<media xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/" type="image/png" src="genint.png"/>
      </figure>

      <para 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="exlast">
	The general interpolation problem is much more flexible than
	the uniform interpolation problem that the DFT solves.  For
	example, by leaving a gap between the pass-band and stop-band
	as in this example, the ripple near the band edge is reduced
	(but the transition between the pass- and stop-bands is not as
	sharp).  The general interpolation problem also arises as a
	subproblem in the design of optimal minimax (or Chebyshev) FIR
	filters.
      </para>
    </section>

    <section 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="pro-con">
      <name xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">LINEAR-PHASE FIR FILTERS: PROS AND CONS</name>
      <para 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="p-c">
	FIR digital filters have several desirable properties.
	<list 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="prolist">
	  <item xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">They can have exactly linear phase.</item>
	  <item xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">They can not be unstable.</item>
	  <item xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">
	    There are several very effective methods for designing
	    linear-phase FIR digital filters.</item>
	</list>

	On the other hand,
	<list 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="conlist">
	  <item xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">Linear-phase filters can have long delay between input
	    and output.</item>  
	  <item xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:bib="http://bibtexml.sf.net/">
	    If the phase need not be linear, then IIR filters can be
	    more efficient.</item>
	</list>
      </para>
    </section>
  </content>
  
</document>
