<?xml version="1.0" encoding="utf-8"?>
<!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:bib="http://bibtexml.sf.net/" xmlns:md="http://cnx.rice.edu/mdml/0.4" id="id2255529">
  <name>Algoritmo de Goertzel</name>
  <metadata>
  <md:version>1.2</md:version>
  <md:created>2008/04/28 01:36:00 GMT-5</md:created>
  <md:revised>2008/04/28 13:18:13.958 GMT-5</md:revised>
  <md:authorlist>
      <md:author id="andresrommier">
      <md:firstname>Andres</md:firstname>
      
      <md:surname>Romero Mier y Terán</md:surname>
      <md:email>andresrommier@gmail.com</md:email>
    </md:author>
  </md:authorlist>

  <md:maintainerlist>
    <md:maintainer id="andresrommier">
      <md:firstname>Andres</md:firstname>
      
      <md:surname>Romero Mier y Terán</md:surname>
      <md:email>andresrommier@gmail.com</md:email>
    </md:maintainer>
  </md:maintainerlist>
  
  <md:keywordlist>
    <md:keyword>DTMF, Algoritmo de Goertzel, DFT, FFT</md:keyword>
  </md:keywordlist>

  <md:abstract>Introducción al funcionamiento del Algoritmo de Goertzel y a su implementación en un DSP</md:abstract>
</metadata>
  <content>
    <para id="id2255538">A pesar del ahorro de recursos que la FFT (Transformada Rápida de
Fourier) consigue en comparación con la DFT ordinaria (Transformada Discreta de Fourier),
para algunas aplicaciones simplemente se requiere calcular el espectro para
algunas frecuencias de interés. Un ejemplo de esto se tiene en la demodulación
FSK, en las cuales únicamente dos frecuencias son empleadas para transmitir
datos binarios, otro ejemplo es matriz DTMF (Dual Tone Multifrequency)
de los teléfonos con marcación por tonos.</para>
    <para id="id2255554">Para estas aplicaciones el algoritmo de Goertzel reduce la cantidad
de operaciones en números reales en casi la mitad en relación
con el cálculo directo de la DFT.</para>
    <para id="id2255563">El algoritmo de Goertzel se obtiene como una adaptación de la ecuación
de la DTF, equivalente a una convolución que puede ser implementada
mediante un filtro digital.</para>
    <para id="id2255572">A partir de las constantes de la DFT tenemos que</para>
    <equation id="id2255580"><m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:msup>
            <m:mi>e</m:mi>
            <m:mrow>
              <m:mo>-</m:mo>
              <m:mfenced separators="" open="(" close=")">
                <m:mi>j</m:mi>
                <m:mfrac>
                  <m:mrow>
                    <m:mn>2</m:mn>
                    <m:mi>π</m:mi>
                    <m:mi>k</m:mi>
                  </m:mrow>
                  <m:mi>N</m:mi>
                </m:mfrac>
              </m:mfenced>
            </m:mrow>
          </m:msup>
          <m:mo>=</m:mo>
          <m:msubsup>
            <m:mi>W</m:mi>
            <m:mrow>
              <m:mi>N</m:mi>
            </m:mrow>
            <m:mi>k</m:mi>
          </m:msubsup>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2255638">y considerando que</para>
    <equation id="id2255643">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:msubsup>
            <m:mi>W</m:mi>
            <m:mrow>
              <m:mi>N</m:mi>
            </m:mrow>
            <m:mrow>
              <m:mo>-</m:mo>
              <m:mi>N</m:mi>
              <m:mi>k</m:mi>
            </m:mrow>
          </m:msubsup>
          <m:mo>=</m:mo>
          <m:mn>1</m:mn>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2255674">podemos escribir la ecuación de la DFT de manera equivalente a</para>
    <equation id="id2255681">
      <m:math mode="display" overflow="scroll">
        <m:mtable>
          <m:mtr>
            <m:mtd>
              <m:mrow>
                <m:mi>X</m:mi>
                <m:mo>(</m:mo>
                <m:mi>k</m:mi>
                <m:mo>)</m:mo>
              </m:mrow>
            </m:mtd>
            <m:mtd>
              <m:mo>=</m:mo>
            </m:mtd>
            <m:mtd>
              <m:mrow>
                <m:munderover>
                  <m:mo>∑</m:mo>
                  <m:mrow>
                    <m:mi>n</m:mi>
                    <m:mo>=</m:mo>
                    <m:mn>0</m:mn>
                  </m:mrow>
                  <m:mrow>
                    <m:mi>N</m:mi>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:munderover>
                <m:mi>x</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>n</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mn>1</m:mn>
                <m:msubsup>
                  <m:mi>W</m:mi>
                  <m:mrow>
                    <m:mi>N</m:mi>
                  </m:mrow>
                  <m:mrow>
                    <m:mi>n</m:mi>
                    <m:mi>k</m:mi>
                  </m:mrow>
                </m:msubsup>
              </m:mrow>
            </m:mtd>
          </m:mtr>
          <m:mtr>
            <m:mtd/>
            <m:mtd>
              <m:mo>=</m:mo>
            </m:mtd>
            <m:mtd>
              <m:mrow>
                <m:munderover>
                  <m:mo>∑</m:mo>
                  <m:mrow>
                    <m:mi>n</m:mi>
                    <m:mo>=</m:mo>
                    <m:mn>0</m:mn>
                  </m:mrow>
                  <m:mrow>
                    <m:mi>N</m:mi>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:munderover>
                <m:mi>x</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>n</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:msubsup>
                  <m:mi>W</m:mi>
                  <m:mrow>
                    <m:mi>N</m:mi>
                  </m:mrow>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mi>N</m:mi>
                    <m:mi>k</m:mi>
                  </m:mrow>
                </m:msubsup>
                <m:msubsup>
                  <m:mi>W</m:mi>
                  <m:mrow>
                    <m:mi>N</m:mi>
                  </m:mrow>
                  <m:mrow>
                    <m:mi>n</m:mi>
                    <m:mi>k</m:mi>
                  </m:mrow>
                </m:msubsup>
              </m:mrow>
            </m:mtd>
          </m:mtr>
          <m:mtr>
            <m:mtd/>
            <m:mtd>
              <m:mo>=</m:mo>
            </m:mtd>
            <m:mtd>
              <m:mrow>
                <m:munderover>
                  <m:mo>∑</m:mo>
                  <m:mrow>
                    <m:mi>n</m:mi>
                    <m:mo>=</m:mo>
                    <m:mn>0</m:mn>
                  </m:mrow>
                  <m:mrow>
                    <m:mi>N</m:mi>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:munderover>
                <m:mi>x</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>n</m:mi>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:msubsup>
                  <m:mi>W</m:mi>
                  <m:mrow>
                    <m:mi>N</m:mi>
                  </m:mrow>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mi>k</m:mi>
                    <m:mo>(</m:mo>
                    <m:mi>N</m:mi>
                    <m:mo>-</m:mo>
                    <m:mi>n</m:mi>
                    <m:mo>)</m:mo>
                  </m:mrow>
                </m:msubsup>
              </m:mrow>
            </m:mtd>
          </m:mtr>
        </m:mtable>
      </m:math>
    </equation>
    <para id="id2255892">expandiendo la sumatoria tenemos</para>
    <equation id="id2255896">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>X</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>k</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:mfenced separators="" open="(" close=")">
            <m:mfenced separators="" open="(" close=")">
              <m:mfenced separators="" open="(" close=")">
                <m:msubsup>
                  <m:mi>W</m:mi>
                  <m:mrow>
                    <m:mi>N</m:mi>
                  </m:mrow>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mi>k</m:mi>
                  </m:mrow>
                </m:msubsup>
                <m:mi>x</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mn>0</m:mn>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>+</m:mo>
                <m:mi>x</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mn>1</m:mn>
                  <m:mo>)</m:mo>
                </m:mrow>
              </m:mfenced>
              <m:msubsup>
                <m:mi>W</m:mi>
                <m:mrow>
                  <m:mi>N</m:mi>
                </m:mrow>
                <m:mrow>
                  <m:mo>-</m:mo>
                  <m:mi>k</m:mi>
                </m:mrow>
              </m:msubsup>
              <m:mo>+</m:mo>
              <m:mi>x</m:mi>
              <m:mrow>
                <m:mo>(</m:mo>
                <m:mn>2</m:mn>
                <m:mo>)</m:mo>
              </m:mrow>
            </m:mfenced>
            <m:msubsup>
              <m:mi>W</m:mi>
              <m:mrow>
                <m:mi>N</m:mi>
              </m:mrow>
              <m:mrow>
                <m:mo>-</m:mo>
                <m:mi>k</m:mi>
              </m:mrow>
            </m:msubsup>
            <m:mo>+</m:mo>
            <m:mo>⋯</m:mo>
            <m:mo>+</m:mo>
            <m:mi>x</m:mi>
            <m:mrow>
              <m:mo>(</m:mo>
              <m:mi>N</m:mi>
              <m:mo>-</m:mo>
              <m:mn>1</m:mn>
              <m:mo>)</m:mo>
            </m:mrow>
          </m:mfenced>
          <m:msubsup>
            <m:mi>W</m:mi>
            <m:mrow>
              <m:mi>N</m:mi>
            </m:mrow>
            <m:mrow>
              <m:mo>-</m:mo>
              <m:mi>k</m:mi>
            </m:mrow>
          </m:msubsup>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2256052">esta ecuación en diferencias puede ser escrita en forma recursiva
como</para>
    <equation id="id2256060">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>y</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>n</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:msubsup>
            <m:mi>W</m:mi>
            <m:mrow>
              <m:mi>N</m:mi>
            </m:mrow>
            <m:mrow>
              <m:mo>-</m:mo>
              <m:mi>k</m:mi>
            </m:mrow>
          </m:msubsup>
          <m:mi>y</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>n</m:mi>
            <m:mo>-</m:mo>
            <m:mn>1</m:mn>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>+</m:mo>
          <m:mi>x</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>n</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2256122">en donde</para>
    <equation id="id2256125">
      <m:math mode="display" overflow="scroll">
        <m:mtable>
          <m:mtr>
            <m:mtd>
              <m:mtable>
                <m:mtr>
                  <m:mtd>
                    <m:mrow>
                      <m:mi>y</m:mi>
                      <m:mrow>
                        <m:mo>(</m:mo>
                        <m:mn>0</m:mn>
                        <m:mo>)</m:mo>
                      </m:mrow>
                      <m:mo>=</m:mo>
                      <m:msubsup>
                        <m:mi>W</m:mi>
                        <m:mrow>
                          <m:mi>N</m:mi>
                        </m:mrow>
                        <m:mrow>
                          <m:mo>-</m:mo>
                          <m:mi>k</m:mi>
                        </m:mrow>
                      </m:msubsup>
                      <m:mi>x</m:mi>
                      <m:mrow>
                        <m:mo>(</m:mo>
                        <m:mn>0</m:mn>
                        <m:mo>)</m:mo>
                      </m:mrow>
                    </m:mrow>
                  </m:mtd>
                </m:mtr>
                <m:mtr>
                  <m:mtd>
                    <m:mrow>
                      <m:mi>y</m:mi>
                      <m:mrow>
                        <m:mo>(</m:mo>
                        <m:mn>1</m:mn>
                        <m:mo>)</m:mo>
                      </m:mrow>
                      <m:mo>=</m:mo>
                      <m:msubsup>
                        <m:mi>W</m:mi>
                        <m:mrow>
                          <m:mi>N</m:mi>
                        </m:mrow>
                        <m:mrow>
                          <m:mo>-</m:mo>
                          <m:mi>k</m:mi>
                        </m:mrow>
                      </m:msubsup>
                      <m:mi>y</m:mi>
                      <m:mrow>
                        <m:mo>(</m:mo>
                        <m:mn>0</m:mn>
                        <m:mo>)</m:mo>
                      </m:mrow>
                      <m:mo>+</m:mo>
                      <m:mi>x</m:mi>
                      <m:mrow>
                        <m:mo>(</m:mo>
                        <m:mn>1</m:mn>
                        <m:mo>)</m:mo>
                      </m:mrow>
                    </m:mrow>
                  </m:mtd>
                </m:mtr>
                <m:mtr>
                  <m:mtd>
                    <m:mrow>
                      <m:mi>y</m:mi>
                      <m:mrow>
                        <m:mo>(</m:mo>
                        <m:mn>2</m:mn>
                        <m:mo>)</m:mo>
                      </m:mrow>
                      <m:mo>=</m:mo>
                      <m:msubsup>
                        <m:mi>W</m:mi>
                        <m:mrow>
                          <m:mi>N</m:mi>
                        </m:mrow>
                        <m:mrow>
                          <m:mo>-</m:mo>
                          <m:mi>k</m:mi>
                        </m:mrow>
                      </m:msubsup>
                      <m:mi>y</m:mi>
                      <m:mrow>
                        <m:mo>(</m:mo>
                        <m:mn>1</m:mn>
                        <m:mo>)</m:mo>
                      </m:mrow>
                      <m:mo>+</m:mo>
                      <m:mi>x</m:mi>
                      <m:mrow>
                        <m:mo>(</m:mo>
                        <m:mn>2</m:mn>
                        <m:mo>)</m:mo>
                      </m:mrow>
                    </m:mrow>
                  </m:mtd>
                </m:mtr>
              </m:mtable>
            </m:mtd>
          </m:mtr>
          <m:mtr>
            <m:mtd>
              <m:mo>⋮</m:mo>
            </m:mtd>
          </m:mtr>
          <m:mtr>
            <m:mtd>
              <m:mrow>
                <m:mi>y</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>N</m:mi>
                  <m:mo>-</m:mo>
                  <m:mn>1</m:mn>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>=</m:mo>
                <m:msubsup>
                  <m:mi>W</m:mi>
                  <m:mrow>
                    <m:mi>N</m:mi>
                  </m:mrow>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mi>k</m:mi>
                  </m:mrow>
                </m:msubsup>
                <m:mi>y</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>N</m:mi>
                  <m:mo>-</m:mo>
                  <m:mn>2</m:mn>
                  <m:mo>)</m:mo>
                </m:mrow>
                <m:mo>+</m:mo>
                <m:mi>x</m:mi>
                <m:mrow>
                  <m:mo>(</m:mo>
                  <m:mi>N</m:mi>
                  <m:mo>-</m:mo>
                  <m:mn>1</m:mn>
                  <m:mo>)</m:mo>
                </m:mrow>
              </m:mrow>
            </m:mtd>
          </m:mtr>
        </m:mtable>
      </m:math>
    </equation>
    <para id="id2256351">para las condiciones iniciales de funcionamiento <m:math overflow="scroll"><m:mrow><m:mi>y</m:mi><m:mo>(</m:mo><m:mo>-</m:mo><m:mn>1</m:mn><m:mo>)</m:mo><m:mo>=</m:mo><m:mn>0</m:mn></m:mrow></m:math>.</para>
    <para id="id2256378">De esta manera el coeficiente de la DFT para <m:math overflow="scroll"><m:mi>k</m:mi></m:math> es equivalente a
la salida de la ecuación en diferencias en el tiempo <m:math overflow="scroll"><m:mrow><m:mi>n</m:mi><m:mo>=</m:mo><m:mi>N</m:mi><m:mo>-</m:mo><m:mn>1</m:mn></m:mrow></m:math>.</para>
    <equation id="id2256412">
      <m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mi>X</m:mi>
          <m:mo>(</m:mo>
          <m:mi>k</m:mi>
          <m:mo>)</m:mo>
          <m:mo>=</m:mo>
          <m:mi>y</m:mi>
          <m:mo>(</m:mo>
          <m:mi>N</m:mi>
          <m:mo>-</m:mo>
          <m:mn>1</m:mn>
          <m:mo>)</m:mo>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2256445">Expresando la ecuación en diferencias como una función de transferencias
tenemos</para>
    <equation id="id2256451"><m:math mode="display" overflow="scroll">
        <m:mrow>
          <m:mfrac>
            <m:mrow>
              <m:mi>Y</m:mi>
              <m:mo>(</m:mo>
              <m:mi>z</m:mi>
              <m:mo>)</m:mo>
            </m:mrow>
            <m:mrow>
              <m:mi>X</m:mi>
              <m:mo>(</m:mo>
              <m:mi>z</m:mi>
              <m:mo>)</m:mo>
            </m:mrow>
          </m:mfrac>
          <m:mo>=</m:mo>
          <m:mi>H</m:mi>
          <m:mrow>
            <m:mo>(</m:mo>
            <m:mi>z</m:mi>
            <m:mo>)</m:mo>
          </m:mrow>
          <m:mo>=</m:mo>
          <m:mfrac>
            <m:mn>1</m:mn>
            <m:mrow>
              <m:mn>1</m:mn>
              <m:mo>-</m:mo>
              <m:msubsup>
                <m:mi>W</m:mi>
                <m:mrow>
                  <m:mi>N</m:mi>
                </m:mrow>
                <m:mrow>
                  <m:mo>-</m:mo>
                  <m:mi>k</m:mi>
                </m:mrow>
              </m:msubsup>
              <m:msup>
                <m:mi>z</m:mi>
                <m:mrow>
                  <m:mo>-</m:mo>
                  <m:mn>1</m:mn>
                </m:mrow>
              </m:msup>
            </m:mrow>
          </m:mfrac>
          <m:mo>=</m:mo>
          <m:mfrac>
            <m:mrow>
              <m:mn>1</m:mn>
              <m:mo>-</m:mo>
              <m:msubsup>
                <m:mi>W</m:mi>
                <m:mrow>
                  <m:mi>N</m:mi>
                </m:mrow>
                <m:mi>k</m:mi>
              </m:msubsup>
              <m:msup>
                <m:mi>z</m:mi>
                <m:mrow>
                  <m:mo>-</m:mo>
                  <m:mn>1</m:mn>
                </m:mrow>
              </m:msup>
            </m:mrow>
            <m:mrow>
              <m:mn>1</m:mn>
              <m:mo>-</m:mo>
              <m:mfenced separators="" open="(" close=")">
                <m:mfenced separators="" open="(" close=")">
                  <m:msubsup>
                    <m:mi>W</m:mi>
                    <m:mrow>
                      <m:mi>N</m:mi>
                    </m:mrow>
                    <m:mi>k</m:mi>
                  </m:msubsup>
                  <m:mo>+</m:mo>
                  <m:msubsup>
                    <m:mi>W</m:mi>
                    <m:mrow>
                      <m:mi>N</m:mi>
                    </m:mrow>
                    <m:mrow>
                      <m:mo>-</m:mo>
                      <m:mi>k</m:mi>
                    </m:mrow>
                  </m:msubsup>
                </m:mfenced>
                <m:msup>
                  <m:mi>z</m:mi>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:msup>
                <m:mo>+</m:mo>
                <m:msup>
                  <m:mi>z</m:mi>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>2</m:mn>
                  </m:mrow>
                </m:msup>
              </m:mfenced>
            </m:mrow>
          </m:mfrac>
          <m:mo>=</m:mo>
          <m:mfrac>
            <m:mrow>
              <m:mn>1</m:mn>
              <m:mo>-</m:mo>
              <m:msubsup>
                <m:mi>W</m:mi>
                <m:mrow>
                  <m:mi>N</m:mi>
                </m:mrow>
                <m:mi>k</m:mi>
              </m:msubsup>
              <m:msup>
                <m:mi>z</m:mi>
                <m:mrow>
                  <m:mo>-</m:mo>
                  <m:mn>1</m:mn>
                </m:mrow>
              </m:msup>
            </m:mrow>
            <m:mrow>
              <m:mn>1</m:mn>
              <m:mo>-</m:mo>
              <m:mfenced separators="" open="(" close=")">
                <m:mn>2</m:mn>
                <m:mi>c</m:mi>
                <m:mi>o</m:mi>
                <m:mi>s</m:mi>
                <m:mfenced separators="" open="(" close=")">
                  <m:mfrac>
                    <m:mrow>
                      <m:mn>2</m:mn>
                      <m:mi>π</m:mi>
                      <m:mi>k</m:mi>
                    </m:mrow>
                    <m:mi>N</m:mi>
                  </m:mfrac>
                </m:mfenced>
                <m:msup>
                  <m:mi>z</m:mi>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>1</m:mn>
                  </m:mrow>
                </m:msup>
                <m:mo>+</m:mo>
                <m:msup>
                  <m:mi>z</m:mi>
                  <m:mrow>
                    <m:mo>-</m:mo>
                    <m:mn>2</m:mn>
                  </m:mrow>
                </m:msup>
              </m:mfenced>
            </m:mrow>
          </m:mfrac>
        </m:mrow>
      </m:math>
    </equation>
    <para id="id2256967">Esta función de transferencias representa a un filtro IIR</para>
    <para id="id2257044">De esta manera, y entendiendo que cada valor de <m:math overflow="scroll"><m:mi>k</m:mi></m:math> se encuentra
relacionado con una banda del espectro de frecuencias de la señal
<m:math overflow="scroll"><m:mrow><m:mi>x</m:mi><m:mo>(</m:mo><m:mi>n</m:mi><m:mo>)</m:mo></m:mrow></m:math>, podemos obtener la energía únicamente en las bandas que nos
interesan y ahorrar cálculos en bandas no requeridas.</para>
  </content>
</document>
