RandSirpi Ответов: 3

Как обнаружить звук DTMF?


Привет,

Я пытаюсь найти метод в C/C++ или C# для обнаружения звука (DTMF-код) с микрофона в Windows. В настоящее время я не могу найти простой метод (FFT off и акустический отпечаток пальца), чтобы узнать, что такое звук DTMF. Не знаете ли вы, есть ли библиотеки (с примерами для понимания) или эффективный метод, чтобы добраться туда? Я смотрю с Microsoft TAPI, чтобы увидеть, не зная, как его использовать.

С помощью C# я нашел DTMFrecognitionEngine на MSDN, но не нашел примеров, чтобы понять, как он работает.

Сейчас мне нужен простой метод, чтобы реализовать такую простую демонстрацию.

Если у кого - то есть идея, мне интересно

сердечно

3 Ответов

Рейтинг:
2

Albert Holguin

Видишь это?:
http://sourceforge.net/projects/dtmf/[^]
http://www.microchip.com/stellent/idcplg-что?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en536955[^] (этот вариант предназначен для процессоров PIC, но алгоритмы могут быть доступны на языке C)

Нашел еще одну реализацию Java:
http://henryranch.net/software/java-dtmf-detector/[^]


RandSirpi

Привет,

спасибо Вам за эти адреса,

Я знал, что из sourceforge (есть версия на C # и еще одна на Java в дополнение к C++), но я не понимал, как звук, он может конвертировать код DTMF.

Для jDTMF я привык понимать теорию, но я не смог найти код, чтобы понять и предложить версию на C# или C+.

Искренне,

Albert Holguin

Итак, вы спрашиваете, как работает вся эта технология?

RandSirpi

привет,

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

Искренне,

Albert Holguin

Ну, суть его заключается в том, что вы должны взять аудиосэмплы (PCM) и сделать на них БПФ. БПФ даст вам представление сигнала в частотной области, оттуда вам понадобится какой-то алгоритм "обнаружения", который будет идентифицировать пики в диапазоне звуковых тонов (чуть ниже диапазона 4 кГц). Существуют различные способы выполнения части обнаружения, и это зависит от реализации.

Рейтинг:
2

Shaunak De

В этой статье объясняется, как реализовать 1D FFT - Как реализовать алгоритм БПФ[^]

Для простоты я бы посоветовал вам сначала попробовать с помощью DFT. Обработка может быть медленной, но ее гораздо проще реализовать. Эта страница содержит как описание, так и список кодов как БПФ, так и ДПФ: http://paulbourke.net/miscellaneous/dft/[^]

Самый простой метод обнаружения пиков-это поиск значений выше среднего для всех выборок и поиск изменений наклона. Скопировав его из другого пост:

Between any two points in your data, (x(0),y(0)) and (x(n),y(n)), add up y(i+1)-y(i) for 0 <= i < n and call this T ("travel") and set R ("rise") to y(n)- y(0) + k for suitably small k. T/R > 1 indicates a peak. This works OK if large travel due to noise is unlikely or if noise distributes symmetrically around a base curve shape. For your application, accept the earliest peak with a score above a given threshold, or analyze the curve of travel per rise values for more interesting properties.


----

Для простоты я бы рекомендовал использовать готовую библиотеку, а не пытаться написать весь алгоритм целиком. Я бы предпочел C# C++.

Попробовать это: http://www.tapiex.com/ToneDecoder.Net.htm[^]
Он может легко декодировать DTMF из аудиофайла или потока, что, как я предполагаю, вам и нужно.

У них есть несколько файлов справки здесь: http://www.tapiex.com/TDNet_Help/[^]

Из их руководства:
PhoneToneDecoder decode variant of tone signals such as DTMF, Caller-ID, TTY, SAME etc.

There are three ways to feed the audio data to this component.
From the file (.wav, .mp3, .raw etc).
Stream data capture by WaveEx control
Stream data feed by manually via WaveStreamInput method.


-----

То, что вы также можете сделать, это записать WAV-файл, а затем декодировать его. Я имел хороший успех, используя Наудио библиотека с более ранним C#. Библиотека также имеет функции для вычисления БПФ.
Рассмотрим эту серию учебников: http://www.youtube.com/watch?v=6XvWRzWzgNI[^]

Вы также можете попробовать это: http://msdn.microsoft.com/en-us/library/ff827802.aspx[^]


Рейтинг:
0

Member 13616601

Of course, because of the Shannon-Nyquist theorem, you'd have to compare at least two detected frequencies next to each other and only leave the one with the loudest tone in.
Maybe run an iteration over it beforehand and erase the more silent tones next to each other.
You could probably even better only detect the exact frequencies of the 4x4 matrice and don't run a complete detection over the spectrum.
I know that it was sloppy.
But two tests showed that it still worked. At least with no disturbing noise around it.
I'll explain it: if you let echo a tone with the amplitude of the slope on every signal position ( next value versus previous is the amplitude of the sinus wave echoed on that position) and repeat that over several signal positions, if the echoed tone is in the signal, there will be an amplification. Otherwise, other tones will not be amplified but blocked. Ever noticed that when you sing along with the pitch in which a string is tuned, that it will start to ring? Also, besides octaves, fifths, fourths and after that major thirds upwards will also be activated, but less loud. Because of that fact, you could accelerate the detection recursively if you started some octaves higher and only hangled down if the amplitude was over a threshold.