В этом примере показано, как использовать функцию Goertzel, чтобы реализовать основанный на ДПФ алгоритм обнаружения 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);
Давайте проигрывать тоны номера телефона 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, заданного стандартом 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);
Цифровое тональное обнаружение может быть достигнуто путем измерения энергетического подарка на этих семи частотах, оцененных выше. Каждый символ может быть разделен путем простого взятия компонента максимальной энергии в более низких и верхних группах частоты.
Следующие функции помощника используются в этом примере.