Main Content

Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Estimación de DFT con el algoritmo Goertzel

Este ejemplo muestra cómo utilizar la función Goertzel para implementar un algoritmo de detección DTMF basado en DFT.

La señalización multifrecuencia de tono dual (DTMF) es la base para el control de las comunicaciones de voz y es ampliamente utilizada en todo el mundo en la telefonía moderna para marcar números y configurar cuadros de mando. También se utiliza en sistemas como el correo de voz, el correo electrónico y la banca telefónica.

Generación de tonos DTMF

Una señal DTMF consiste en la suma de dos sinusoides - o tonos - con frecuencias tomadas de dos grupos mutuamente excluyentes. Estas frecuencias fueron elegidas para evitar que los armónicos sean detectados incorrectamente por el receptor como alguna otra frecuencia DTMF. Cada par de tonos contiene una frecuencia del grupo bajo (697 Hz, 770 Hz, 852 Hz, 941 Hz) y una frecuencia del grupo alto (1209 Hz, 1336 Hz, 1477Hz) y representa un símbolo único. Las frecuencias asignadas a los pulsadores de la almohadilla telefónica se muestran a continuación:

Genere y trace una señal DTMF para cada botón en la almohadilla telefónica. Cada señal tiene una frecuencia de muestreo de 8 Khz y una duración de 100 ms.

symbol = {'1','2','3','4','5','6','7','8','9','*','0','#'}; [tones, Fs, f, lfg, hfg] = helperDTMFToneGenerator(symbol, false); helperDFTEstimationPlot1(tones, symbol, Fs, f);

Reproducción de tonos DTMF

Vamos a reproducir los tonos del número de teléfono 508 647 7000 por ejemplo. Observe que el símbolo "0" corresponde al tono 11.

for i = [5 11 8 6 4 7 7 11 11 11]     p = audioplayer(tones(:,i),Fs,16);     play(p)     pause(0.5) end

Estimación de tonos DTMF con el algoritmo Goertzel

La duración mínima de una señal DTMF definida por el estándar de la UIT es de 40 ms. Por lo tanto, hay como máximo 0,04 x 8000 x 320 muestras disponibles para su estimación y detección. El decodificador DTMF necesita estimar las frecuencias contenidas en estas señales cortas.

Un enfoque común para este problema de estimación es calcular las muestras de transformación de Fourier en tiempo discreto (DFT) cerca de los siete tonos fundamentales. Para una solución basada en DFT, se ha demostrado que el uso de 205 muestras en el dominio de frecuencia minimiza el error entre las frecuencias originales y los puntos en los que se estima el DFT.

Nt = 205; original_f = [lfg(:);hfg(:)]  % Original frequencies
original_f = 7×1

         697
         770
         852
         941
        1209
        1336
        1477

k = round(original_f/Fs*Nt);  % Indices of the DFT estim_f = round(k*Fs/Nt)      % Frequencies at which the DFT is estimated
estim_f = 7×1

         702
         780
         859
         937
        1210
        1327
        1483

Para minimizar el error entre las frecuencias originales y los puntos en los que se estima el DFT, truncamos los tonos, manteniendo sólo 205 muestras o 25,6 ms para su posterior procesamiento.

tones = tones(1:205,:);

En este punto podríamos usar el algoritmo Fast Fourier Transform (FFT) para calcular el DFT. Sin embargo, la popularidad del algoritmo Goertzel en este contexto radica en el pequeño número de puntos en los que se estima el DFT. En este caso, el algoritmo Goertzel es más eficiente que el algoritmo FFT.

for toneChoice = 1:12     % Select tone     tone = tones(:,toneChoice);     % Estimate DFT using Goertzel     ydft(:,toneChoice) = goertzel(tone,k+1); % Goertzel uses 1-based indexing    end

Trazar la estimación de magnitud DFT de Goertzel de cada tono en una cuadrícula correspondiente a la almohadilla telefónica.

helperDFTEstimationPlot2(ydft,symbol,f, estim_f);

Detección de tonos DTMF

La detección de tono digital se puede lograr midiendo la energía presente en las siete frecuencias estimadas anteriormente. Cada símbolo se puede separar simplemente tomando el componente de máxima energía en los grupos de frecuencia inferior y superior.

Apéndice

En este ejemplo se utilizan las siguientes funciones auxiliares.