Оценка ДПФ с алгоритмом Goertzel

Этот пример показывает, как использовать функцию Goertzel, чтобы реализовать основанный на ДПФ алгоритм обнаружения DTMF.

Сигнализация двухтонального многочастотного (DTMF) является основанием для управления голосовыми сообщениями и широко используется во всем мире в современной телефонии, чтобы набрать номера и сконфигурировать кнопочные формы. Это также используется в системах такой как в голосовой почте, электронной почте и телефонном банковском деле.

Генерация тоны DTMF

Сигнал DTMF состоит из суммы двух синусоид - или тоны - с частотами, взятыми из двух взаимоисключающих групп. Эти частоты были выбраны, чтобы препятствовать тому, чтобы любые гармоники были неправильно обнаружены получателем как некоторая другая частота DTMF. Каждая пара тонов содержит одну частоту низкой группы (697 Гц, 770 Гц, 852 Гц, 941 Гц) и одну частоту высокой группы (1 209 Гц, 1 336 Гц, 1477 Гц) и представляет уникальный символ. Частоты, выделенные кнопкам телефонной клавиатуры, показывают ниже:

Сгенерируйте и постройте сигнал DTMF для каждой кнопки на телефонной клавиатуре. Каждый сигнал имеет частоту дискретизации 8 кГц и длительность 100 мс.

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

Проигрывание тоны DTMF

Давайте проигрывать тоны номера телефона 508 647 7000, например. Заметьте, что "0" символ соответствует 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

Оценка тонов DTMF с алгоритмом Goertzel

Минимальная длительность сигнала DTMF, заданного стандартом ITU, составляет 40 мс. Поэтому существует самое большее 0.04 x 8000 = 320 выборок, доступных для оценки и обнаружения. Декодер DTMF должен оценить частоты, содержавшиеся в этих коротких сигналах.

Один общий подход к этой проблеме оценки должен вычислить преобразование Фурье Дискретного времени (ДПФ) выборки близко к семи основным тонам. Для основанного на ДПФ решения было показано, что использование 205 выборок в частотном диапазоне минимизирует ошибку между исходными частотами и точками, в которых оценивается ДПФ.

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

Чтобы минимизировать ошибку между исходными частотами и точками, в которых оценивается ДПФ, мы обрезаем тоны, сохраняя только 205 выборок или 25,6 мс для последующей обработки.

tones = tones(1:205,:);

В этой точке мы могли использовать алгоритм Быстрого преобразования Фурье (FFT), чтобы вычислить ДПФ Однако, популярность алгоритма Goertzel в этом контексте находится в маленьком числе точек, в котором оценивается ДПФ. В этом случае алгоритм Goertzel более эффективен, чем Алгоритм бпф.

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

Постройте оценку значения ДПФ Гоерцеля каждого тона на сетке, соответствующей телефонной клавиатуре.

helperDFTEstimationPlot2(ydft,symbol,f, estim_f);

Обнаружение тоны DTMF

Цифровое тональное обнаружение может быть достигнуто путем измерения энергетического подарка на этих семи частотах, оцененных выше. Каждый символ может быть разделен путем простого взятия компонента максимальной энергии в более низких и верхних группах частоты.

Приложение

Следующие функции помощника используются в этом примере.