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

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

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

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

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

Сгенерируйте и постройте сигнал 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);

Figure contains 12 axes objects. Axes object 1 with title Symbol "1": [697,1209] contains an object of type line. Axes object 2 with title Symbol "2": [697,1336] contains an object of type line. Axes object 3 with title Symbol "3": [697,1477] contains an object of type line. Axes object 4 with title Symbol "4": [770,1209] contains an object of type line. Axes object 5 with title Symbol "5": [770,1336] contains an object of type line. Axes object 6 with title Symbol "6": [770,1477] contains an object of type line. Axes object 7 with title Symbol "7": [852,1209] contains an object of type line. Axes object 8 with title Symbol "8": [852,1336] contains an object of type line. Axes object 9 with title Symbol "9": [852,1477] contains an object of type line. Axes object 10 with title Symbol "*": [941,1209] contains an object of type line. Axes object 11 with title Symbol "0": [941,1336] contains an object of type line. Axes object 12 with title Symbol "#": [941,1477] contains an object of type line.

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

Например, проигрывайте тоны, соответствующие номеру телефона 508-647-7000. "0" символ соответствует 11-му тону.

% To hear, uncomment these lines:

% 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);

Figure contains 12 axes objects. Axes object 1 with title Symbol "1": [697,1209] contains an object of type stem. Axes object 2 with title Symbol "2": [697,1336] contains an object of type stem. Axes object 3 with title Symbol "3": [697,1477] contains an object of type stem. Axes object 4 with title Symbol "4": [770,1209] contains an object of type stem. Axes object 5 with title Symbol "5": [770,1336] contains an object of type stem. Axes object 6 with title Symbol "6": [770,1477] contains an object of type stem. Axes object 7 with title Symbol "7": [852,1209] contains an object of type stem. Axes object 8 with title Symbol "8": [852,1336] contains an object of type stem. Axes object 9 with title Symbol "9": [852,1477] contains an object of type stem. Axes object 10 with title Symbol "*": [941,1209] contains an object of type stem. Axes object 11 with title Symbol "0": [941,1336] contains an object of type stem. Axes object 12 with title Symbol "#": [941,1477] contains an object of type stem.

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

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

Приложение

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

Смотрите также