В этом примере показано, как использовать функцию Goertzel для реализации алгоритма обнаружения DTMF на основе DFT.
Двухтоновая многочастотная (DTMF) сигнализация является базисом для управления голосовой связью и широко используется во всем мире в современной телефонии для набора номеров и конфигурирования распределительных плат. Он также используется в таких системах, как голосовая почта, электронная почта и телефонный банкинг.
Сигнал DTMF состоит из суммы двух синусоидов - или тонов - с частотами, взятыми из двух взаимоисключающих групп. Эти частоты были выбраны, чтобы предотвратить неправильное обнаружение каких-либо гармоник приемником в качестве некоторой другой частоты DTMF. Каждая пара тонов содержит одну частоту низкой группы (697 Гц, 770 Гц, 852 Гц, 941 Гц) и одну частоту высокой группы (1209 Гц, 1336 Гц, 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 номера телефона. The "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, заданная стандартом ITU, составляет 40 мс. Поэтому для оценки и обнаружения доступны не более 0,04 x 8000 = 320 выборок. Декодер DTMF должен оценить частоты, содержащиеся в этих коротких сигналах.
Одним из распространенных подходов к этой задаче оценки является вычисление выборок Преобразования Фурье в дискретном времени (DFT), близких к семи основным тонам. Для решения, основанного на ДПФ, было показано, что использование 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), чтобы вычислить ДПФ. Однако популярность алгоритма Гертцеля в этом контексте заключается в небольшом числе точек, в которых оценивается ДПФ. В этом случае алгоритм Гертцеля более эффективен, чем алгоритм БПФ.
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);
Обнаружение цифрового тонального сигнала может быть достигнуто путем измерения энергии, присутствующей на семи частотах, оцененных выше. Каждый символ может быть разделен простым взятием компонента максимальной энергии в нижней и верхней группах частот.
В этом примере используются следующие вспомогательные функции.