<?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:m="http://www.w3.org/1998/Math/MathML" xmlns:md="http://cnx.rice.edu/mdml/0.4" xmlns:bib="http://bibtexml.sf.net/" id="m10438">

  <name>A Group-Delay Interpretation of Polyphase Filters</name>

  <metadata>
  <md:version>2.12</md:version>
  <md:created>2002/01/08</md:created>
  <md:revised>2005/09/16 14:30:27.394 GMT-5</md:revised>
  <md:authorlist>
      <md:author id="schniter">
      <md:firstname>Phil</md:firstname>
      
      <md:surname>Schniter</md:surname>
      <md:email>schniter@ee.eng.ohio-state.edu</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist>
    <md:maintainer id="jago">
      <md:firstname>Adan</md:firstname>
      
      <md:surname>Galvan</md:surname>
      <md:email>jago@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer id="emaloney">
      <md:firstname>Erin</md:firstname>
      
      <md:surname>Maloney</md:surname>
      <md:email>emaloney@rice.edu</md:email>
    </md:maintainer>
    <md:maintainer id="schniter">
      <md:firstname>Phil</md:firstname>
      
      <md:surname>Schniter</md:surname>
      <md:email>schniter@ee.eng.ohio-state.edu</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  <md:keywordlist>
    <md:keyword>decimation</md:keyword>
    <md:keyword>group-delay</md:keyword>
    <md:keyword>interpolation</md:keyword>
    <md:keyword>polyphase</md:keyword>
  </md:keywordlist>

  <md:abstract>Discusses how polyphase filters can be used as intersample
      delay filters.</md:abstract>
</metadata>

  <content>
    <para id="para1">
      Previously, <cnxn document="m10431" strength="9">polyphase
	interpolation</cnxn> and <cnxn document="m10433" strength="9">decimation</cnxn> were derived from the Noble
	identities and motivated for reasons of computational
	efficiency. Here we present a different interpretation of the
	(ideal) polyphase filter.
    </para>

    <para id="para1.1">
      Assume that <m:math><m:apply><m:ci type="fn">H</m:ci><m:ci>z</m:ci> </m:apply></m:math> is an ideal
      lowpass filter with gain <m:math><m:ci> L</m:ci></m:math>,
      cutoff <m:math><m:apply><m:divide/><m:pi/><m:ci>
      L</m:ci></m:apply></m:math>, and constant group delay of
      <m:math> <m:ci>d</m:ci></m:math>:

      <m:math display="block">
	<m:apply>
	  <m:eq/>
	  <m:apply>
	    <m:ci type="fn">H</m:ci>
	    <m:apply>
	      <m:exp/>
	      <m:apply>
		<m:times/>
		<m:imaginaryi/>
		<m:ci>ω</m:ci>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	  <m:piecewise>
	    <m:piece>
	      <m:apply>
		<m:times/>
		<m:ci>L</m:ci>
		<m:apply>
		  <m:exp/>
		  <m:apply>
		    <m:minus/>
		    <m:apply>
		      <m:times/>
		      <m:imaginaryi/>
		      <m:ci>d</m:ci>
		      <m:ci>ω</m:ci>
		    </m:apply>
		  </m:apply>
		</m:apply>
	      </m:apply>

	      <m:apply>
		<m:in/>
		<m:ci>ω</m:ci>
		<m:interval closure="closed-open">
		  <m:apply>
		    <m:minus/>
		    <m:apply>
		      <m:divide/>
		      <m:pi/>
		      <m:ci>L</m:ci>
		    </m:apply>
		  </m:apply>
		  <m:apply>
		    <m:divide/>
		    <m:pi/>
		    <m:ci>L</m:ci>
		  </m:apply>
		</m:interval>   
	      </m:apply>
	    </m:piece>

	    <m:piece>
	      <m:cn>0</m:cn>
	      <m:apply>
		<m:in/>
		<m:ci>ω</m:ci>
		<m:apply>
		  <m:and/>
		  <m:interval closure="closed-open">
		    <m:apply>
		      <m:minus/>
		      <m:pi/>
		    </m:apply>
		    <m:apply>
		      <m:minus/>
		      <m:apply>
			<m:divide/>
			<m:pi/>
			<m:ci>L</m:ci>
		      </m:apply>
		    </m:apply>
		  </m:interval>
		  <m:interval closure="closed-open">
		    <m:apply>
		      <m:divide/>
		      <m:pi/>
		      <m:ci>L</m:ci>
		    </m:apply>
		    <m:pi/>
		  </m:interval>    
		</m:apply>
	      </m:apply>
	    </m:piece>
	  </m:piecewise>
	</m:apply>
      </m:math>
    </para>

    <para id="para1.2">
      Recall that the polyphase filters are defined as

      <m:math display="block">
	<m:apply>
	  <m:forall/>
	  <m:bvar><m:ci>p</m:ci></m:bvar>
	  <m:condition>
	    <m:apply>
	      <m:in/>
	      <m:ci>p</m:ci>
	      <m:set>
		<m:cn>0</m:cn>
		<m:ci>…</m:ci>
		<m:apply>
		  <m:minus/>
		  <m:ci>L</m:ci>
		  <m:cn>1</m:cn>
		</m:apply>
	      </m:set>
	    </m:apply>
	  </m:condition>
	  <m:apply>
	    <m:eq/>
	    <m:apply>
	      <m:ci type="fn" class="discrete">
		<m:msub>
		  <m:mi>h</m:mi>
		  <m:mi>p</m:mi>
		</m:msub>
	      </m:ci>
	      <m:ci>k</m:ci>
	    </m:apply>
	    <m:apply>
	      <m:ci type="fn" class="discrete">h</m:ci>
	      <m:apply>
		<m:plus/>
		<m:apply>
		  <m:times/>
		  <m:ci>k</m:ci>
		  <m:ci>L</m:ci>
		</m:apply>
		<m:ci>p</m:ci>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	</m:apply>
      </m:math>

    </para>

    <para id="para1.3">
      In other words, 
      <m:math>    
	<m:apply>
	  <m:ci type="fn" class="discrete">
	    <m:msub>
	      <m:mi>h</m:mi>
	      <m:mi>p</m:mi>
	    </m:msub>
	  </m:ci>
	  <m:ci>k</m:ci>
	</m:apply>
      </m:math> is an advanced 
      (by <m:math><m:ci>p</m:ci></m:math> samples)
      and downsampled (by factor <m:math><m:ci>L</m:ci></m:math>)
      version of 
      <m:math>
	<m:apply>
	  <m:ci type="fn" class="discrete">h</m:ci>
	  <m:ci>n</m:ci>
	</m:apply>
      </m:math> (see <cnxn target="fig1" strength="9"/>).
    </para>

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

    <para id="para1.4">
      The DTFT of the
      <m:math><m:ci><m:msup><m:mi>p</m:mi><m:mi>th</m:mi>
	  </m:msup></m:ci></m:math> polyphase filter impulse response
	  is then

      <equation id="eq1">
	<m:math>
	  <m:apply>
	    <m:eq/>
	    <m:apply>
	      <m:ci type="fn">
		<m:msub>
		  <m:mi>H</m:mi>
		  <m:mi>p</m:mi>
		</m:msub>
	      </m:ci>
	      <m:ci>z</m:ci>
	    </m:apply>

	    <m:apply>
	      <m:times/>
	      <m:apply>
		<m:divide/>
		<m:cn>1</m:cn>
		<m:ci>L</m:ci>
	      </m:apply>
	      <m:apply>
		<m:sum/>
		<m:bvar><m:ci>l</m:ci></m:bvar>
		<m:lowlimit><m:cn>0</m:cn></m:lowlimit>
		<m:uplimit>
		  <m:apply>
		    <m:minus/>
		    <m:ci>L</m:ci>
		    <m:cn>1</m:cn>
		  </m:apply>
		</m:uplimit>
		<m:apply>
		  <m:ci type="fn">V</m:ci>
		  <m:apply>
		    <m:times/>
		    <m:apply>
		      <m:exp/>
		      <m:apply>
			<m:times/>
			<m:apply>
			  <m:minus/>
			  <m:imaginaryi/>
			</m:apply>
			<m:apply>
			  <m:divide/>
			  <m:apply>
			    <m:times/>
			    <m:cn>2</m:cn>
			    <m:pi/>
			  </m:apply>
			  <m:ci>L</m:ci>
			</m:apply>
			<m:ci>l</m:ci>
		      </m:apply>
		    </m:apply>
		    <m:apply>
		      <m:power/>
		      <m:ci>z</m:ci>
		      <m:apply>
			<m:divide/>
			<m:cn>1</m:cn>
			<m:ci>L</m:ci>
		      </m:apply>
		    </m:apply>
		  </m:apply>
		</m:apply>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	</m:math>
      </equation>

      where 
      <m:math>
	<m:apply>
	  <m:eq/>
	  <m:apply>
	    <m:ci type="fn">V</m:ci><m:ci>z</m:ci>
	  </m:apply>
	  <m:apply>
	    <m:times/>
	    <m:apply>
	      <m:ci type="fn">H</m:ci>
	      <m:ci>z</m:ci>
	    </m:apply>
	    <m:apply>
	      <m:power/>
	      <m:ci>z</m:ci>
	      <m:ci>p</m:ci>
	    </m:apply>
	  </m:apply>
	</m:apply>
      </m:math>

      <equation id="eq1.2">
	<m:math>
	  <m:apply>
	    <m:eq/>
	    <m:apply>
	      <m:ci type="fn">
		<m:msub>
		  <m:mi>H</m:mi>
		  <m:mi>p</m:mi>
		</m:msub>
	      </m:ci>
	      <m:ci>z</m:ci>
	    </m:apply>

	    <m:apply>
	      <m:times/>
	      <m:apply>
		<m:divide/>
		<m:cn>1</m:cn>
		<m:ci>L</m:ci>
	      </m:apply>
	      <m:apply>
		<m:sum/>
		<m:bvar><m:ci>l</m:ci></m:bvar>
		<m:lowlimit><m:cn>0</m:cn></m:lowlimit>
		<m:uplimit>
		  <m:apply>
		    <m:minus/>
		    <m:ci>L</m:ci>
		    <m:cn>1</m:cn>
		  </m:apply>
		</m:uplimit>            
		<m:apply>
		  <m:times/>
		  <m:apply>
		    <m:exp/>
		    <m:apply>
		      <m:times/>
		      <m:apply>
			<m:minus/>
			<m:imaginaryi/>
		      </m:apply>
		      <m:apply>
			<m:divide/>
			<m:apply>
			  <m:times/>
			  <m:cn>2</m:cn>
			  <m:pi/>
			</m:apply>
			<m:ci>L</m:ci>
		      </m:apply>
		      <m:ci>l</m:ci>
		      <m:ci>p</m:ci>
		    </m:apply>
		  </m:apply>
		  <m:apply>
		    <m:power/>
		    <m:ci>z</m:ci>
		    <m:apply>
		      <m:divide/>
		      <m:ci>p</m:ci>
		      <m:ci>L</m:ci>
		    </m:apply>
		  </m:apply>
		  <m:apply>
		    <m:ci type="fn">H</m:ci>
		    <m:apply>
		      <m:times/>
		      <m:apply>
			<m:exp/>
			<m:apply>
			  <m:times/>
			  <m:apply>
			    <m:minus/>
			    <m:imaginaryi/>
			  </m:apply>
			  <m:apply>
			    <m:divide/>
			    <m:apply>
			      <m:times/>
			      <m:cn>2</m:cn>
			      <m:pi/>
			    </m:apply>
			    <m:ci>L</m:ci>
			  </m:apply>
			  <m:ci>l</m:ci>
			</m:apply>
		      </m:apply>
		      <m:apply>
			<m:power/>
			<m:ci>z</m:ci>
			<m:apply>
			  <m:divide/>
			  <m:cn>1</m:cn>
			  <m:ci>L</m:ci>
			</m:apply>
		      </m:apply>
		    </m:apply>
		  </m:apply>
		</m:apply>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	</m:math>
      </equation>
      
      <equation id="eq4">
	<m:math>
	  <m:apply>
	    <m:eq/>
	    <m:apply>
	      <m:ci type="fn">
		<m:msub>
		  <m:mi>H</m:mi>
		  <m:mi>p</m:mi>
		</m:msub>
	      </m:ci>
	      <m:apply>
		<m:exp/>
		<m:apply>
		  <m:times/>
		  <m:imaginaryi/>
		  <m:ci>ω</m:ci>
		</m:apply>
	      </m:apply>
	    </m:apply>
	    <m:apply>
	      <m:times/>
	      <m:apply>
		<m:divide/>
		<m:cn>1</m:cn>
		<m:ci>L</m:ci>
	      </m:apply>
	      <m:apply>
		<m:sum/>
		<m:bvar><m:ci>l</m:ci></m:bvar>
		<m:lowlimit><m:ci>0</m:ci></m:lowlimit>
		<m:uplimit>
		  <m:apply>
		    <m:minus/>
		    <m:ci>L</m:ci>
		    <m:cn>1</m:cn>
		  </m:apply>
		</m:uplimit>            
		<m:apply>
		  <m:times/>
		  <m:apply>
		    <m:exp/>
		    <m:apply>
		      <m:times/>
			<m:imaginaryi/>
		      <m:apply>
			<m:divide/>
			<m:apply>
			  <m:minus/>
			  <m:ci>ω</m:ci>
			  <m:apply>
			    <m:times/>
			    <m:cn>2</m:cn>
			    <m:pi/>
			    <m:ci>l</m:ci>
			  </m:apply>
			</m:apply>
			<m:ci>L</m:ci>
		      </m:apply>
		      <m:ci>p</m:ci>
		    </m:apply>
		  </m:apply>
		  <m:apply>
		    <m:ci type="fn">H</m:ci>
		    <m:apply>
		      <m:exp/>
		      <m:apply>
			<m:times/>
			<m:imaginaryi/>
			<m:apply>
			  <m:divide/>
			  <m:apply>
			    <m:minus/>
			    <m:ci>ω</m:ci>
			    <m:apply>
			      <m:times/>
			      <m:cn>2</m:cn>
			      <m:pi/>
			      <m:ci>l</m:ci>
			    </m:apply>
			  </m:apply>
			  <m:ci>L</m:ci>
			</m:apply>
		      </m:apply>
		    </m:apply>
		  </m:apply>
		</m:apply>
	      </m:apply>
	    </m:apply>

	    <m:apply>
	      <m:forall/>
	      <m:bvar><m:ci>ω</m:ci></m:bvar>
	      <m:condition>
		<m:apply>
		  <m:leq/>
		  <m:apply>
		    <m:abs/>
		    <m:ci>ω</m:ci>
		  </m:apply>
		  <m:pi/>
		</m:apply>
	      </m:condition>
	      <m:apply>
		<m:times/>
		<m:apply>
		  <m:divide/>
		  <m:cn>1</m:cn>
		  <m:ci>L</m:ci>
		</m:apply>
		<m:apply>
		  <m:times/>
		  <m:apply>
		    <m:exp/>
		    <m:apply>
		      <m:times/>
		      <m:imaginaryi/>
		      <m:apply>
			<m:divide/>
			<m:ci>ω</m:ci>
			<m:ci>L</m:ci>
		      </m:apply>
		      <m:ci>p</m:ci>
		    </m:apply>
		  </m:apply>
		  <m:apply>
		    <m:ci type="fn">H</m:ci>
		    <m:apply>
		      <m:exp/>
		      <m:apply>
			<m:times/>
			<m:imaginaryi/>
			<m:apply>
			  <m:divide/>
			  <m:ci>ω</m:ci>
			  <m:ci>L</m:ci>
			</m:apply>
		      </m:apply>
		    </m:apply>
		  </m:apply>
		</m:apply>
	      </m:apply>
	    </m:apply>

	    <m:apply>
	      <m:forall/>
	      <m:bvar><m:ci>ω</m:ci></m:bvar>
	      <m:condition>
		<m:apply>
		  <m:leq/>
		  <m:apply>
		    <m:abs/>
		    <m:ci>ω</m:ci>
		  </m:apply>
		  <m:pi/>
		</m:apply>
	      </m:condition>
	      <m:apply>
		<m:exp/>
		<m:apply>
		  <m:times/>
                  <m:apply>
		    <m:minus/>
		    <m:imaginaryi/>
                  </m:apply>
		  <m:apply>
		    <m:divide/>
                    <m:apply>
		      <m:minus/>
                      <m:ci>d</m:ci>
                      <m:ci>p</m:ci>
                    </m:apply>
		    <m:ci>L</m:ci>
		  </m:apply>
		  <m:ci>ω</m:ci>
		</m:apply>
	      </m:apply>
	    </m:apply>
	  </m:apply>
	</m:math>
      </equation>
    </para>     

    <para id="para2">
      Thus, the ideal
<m:math><m:ci><m:msup><m:mi>p</m:mi><m:mi>th</m:mi></m:msup></m:ci></m:math>
      polyphase filter has a constant magnitude response of one and a
      constant group delay of
      <m:math>
	<m:apply>
	  <m:divide/>
	  <m:apply>
	    <m:minus/>
	    <m:ci>d</m:ci>
	    <m:ci>p</m:ci>
	  </m:apply>
	  <m:ci>L</m:ci>
	</m:apply>
      </m:math> samples. The implication is that if the input to the
      <m:math><m:ci><m:msup><m:mi>p</m:mi><m:mi>th</m:mi></m:msup></m:ci></m:math>
      polyphase filter is the unaliased
      <m:math><m:ci>T</m:ci></m:math>-sampled representation
      <m:math>
	<m:apply>
	  <m:eq/>
	  <m:apply>
	    <m:ci type="fn" class="discrete">x</m:ci>
	    <m:ci>n</m:ci>
	  </m:apply>
	  <m:apply>
	    <m:ci type="fn">
	      <m:msub>
		<m:mi>x</m:mi>
		<m:mi>c</m:mi>
	      </m:msub>
	    </m:ci>
	    <m:apply>
	      <m:times/>
	      <m:ci>n</m:ci>
	      <m:ci>T</m:ci>
	    </m:apply>
	  </m:apply>
	</m:apply>
      </m:math>, then the output of the filter would be the unaliased
      <m:math><m:ci>T</m:ci> </m:math>-sampled representation
      <m:math>
	<m:apply>
	  <m:eq/>
	  <m:apply>
	    <m:ci type="fn" class="discrete">
	      <m:msub>
		<m:mi>y</m:mi>
		<m:mi>p</m:mi>
	      </m:msub>
	    </m:ci>
	    <m:ci>n</m:ci>
	  </m:apply>
	  <m:apply>
	    <m:ci type="fn">
	      <m:msub>
		<m:mi>x</m:mi>
		<m:mi>c</m:mi>
	      </m:msub>
	    </m:ci>
	    <m:apply>
	      <m:times/>
	      <m:apply>
		<m:minus/>
		<m:ci>n</m:ci>
		<m:apply>
		  <m:divide/>
		  <m:apply>
		    <m:minus/>
		    <m:ci>d</m:ci>
		    <m:ci>p</m:ci>
		  </m:apply>
		  <m:ci>L</m:ci>
		</m:apply>
	      </m:apply>
	      <m:ci>T</m:ci>
	    </m:apply>
	  </m:apply>
	</m:apply>
      </m:math> (see <cnxn target="fig4" strength="9"/>).
    </para> 

    <figure id="fig4">
     <media type="image/png" src="m10438fig2.png"/>
    </figure>

    <para id="para4">
      <cnxn target="fig5" strength="9"/> shows the role of polyphase
      interpolation filters assume zero-delay
      (<m:math>
	<m:apply>
	  <m:eq/>
	  <m:ci>d</m:ci>
	  <m:cn>0</m:cn>
	</m:apply>
      </m:math>) processing. Essentially, the
      <m:math><m:ci><m:msup><m:mi>p</m:mi><m:mi>th</m:mi></m:msup></m:ci></m:math>
      filter interpolates the waveform
      <m:math>
	<m:apply>
	  <m:divide/>
	  <m:ci>p</m:ci>
	  <m:ci>L</m:ci>
	</m:apply>
      </m:math>-way
      between consecutive input samples. The
      <m:math><m:ci>L</m:ci></m:math> polyphase outputs are then
      interleaved to create the output stream. Assuming that
      <m:math>
	<m:apply>
	  <m:ci type="fn">
	    <m:msub>
	      <m:mi>x</m:mi>
	      <m:mi>c</m:mi>
	    </m:msub></m:ci>
	  <m:ci>t</m:ci>
	</m:apply>
      </m:math>
      is bandlimited to
      <m:math>
	<m:apply>
	  <m:times/>
	  <m:apply>
	    <m:divide/>
	    <m:cn>1</m:cn>
	    <m:apply>
	      <m:times/>
	      <m:cn>2</m:cn>
	      <m:ci>T</m:ci>
	    </m:apply>
	  </m:apply>
	  <m:ci>Hz</m:ci>
	</m:apply>
      </m:math>, perfect polyphase filtering yields a perfectly
      interpolated output.  In practice, we use the casual FIR
      approximations of the polyphase filters 
      <m:math>
	<m:apply>
	  <m:ci type="fn" class="discrete"><m:msub>
	      <m:mi>h</m:mi>
	      <m:mi>p</m:mi>
	    </m:msub></m:ci>
	  <m:ci>k</m:ci>
	</m:apply>
      </m:math> (which which correspond to some casual FIR
      approximation of the master filter 
      <m:math>
	<m:apply>
	  <m:ci type="fn" class="discrete">h</m:ci>
	  <m:ci>n</m:ci>
	</m:apply>
      </m:math>).
    </para>

    <figure id="fig5">
     <media type="image/png" src="m10438fig3.png"/>
    </figure>

  </content>
</document>
