PDA

Просмотр полной версии : Детектор тона DTMF на базе Goertzel алгоритма



RX1AL
02.05.2010, 22:51
Вот встал один серьезный вопрос, который непонятно, как решать. Суть задачи:
1) Имеется транковая станция, в которой есть селективный выбор абонента по коду DTMF.
При этом формирование и дешифровка сигнала делается железом самих станций. Тут все окей,
и можно было бы забыть про это. Но есть маленькое но... см. 2)
2) Имеется софт, который также должен формировать DTMF сигнал,
а также принимать DTMF код из звукового потока. Вот с этим пока полная засада.

Звуковой канал подключен через фильтры на приемную транковую станцию. С нее сигнал идет в
звуковую карточку компа, где сидит оператор станции (у нас это пожарники и полицаи). На таком
пульте нет радиостанции, есть только микрофон и выбор с пульта канала/групп каналов для оповещения.
То есть оператор набирает на клавиатуре компа код или просто жмет "горячие кнопки" и сигнал DTMF
летит в эфир через удаленно управляемую транковую станцию. На прием тоже самое. То есть полицай или
пожарник на улице набирает на носимой радиостанции или планшете (по сути вид ПДА) DTMF код и он
через базовую станцию-приемник идет на нужный комп.

Вопрос в том, как его программно сформировать и как декодировать? Сам я никогда с этим делом не имел,
но знаю, что вроде можно использовать декодер на базе Goertzel алгоритма. Если есть готовые реализации
на C++, C# или даже Java - будет очень здорово. На C# самый идеальный вариант, но не знаю делал ли кто-то.
Заранее всем спасибо...

vadim_d
03.05.2010, 14:02
Вот встал один серьезный вопрос, который непонятно, как решать.
Да, судя по молчанию, вопрос поставил всех в тупик. Набираем "goertzel algorithm implementation" в Гугле, видим ссылку на Википедию http://en.wikipedia.org/wiki/Goertzel_algorithm , а там в конце "DTMF detector in C#" http://sourceforge.net/projects/dtmf-cs/ . Подойдет?

UA6XM
03.05.2010, 16:01
Посмотрите здесь http://www.relsys.ru/prod.htm

RX1AL
03.05.2010, 17:16
Подойдет?
Вадим, спасибо... Но это не совсем то, что нужно. Детектор там написан, но непонятно, как его применить к аудио потоку.
Вот приведенная ниже ссылка на софт (30-ти дневный), как раз то, что доктор прописал. Жалко, что нет исходного текста, чтобы встроить сразу в нашу систему, но тест вроде прошел успешно. Вот найти бы где-нибудь такое же решение в исходных кодах - было бы полное счастье.

vadim_d
03.05.2010, 17:26
Детектор там написан, но непонятно, как его применить к аудио потоку.
Михаил, я себя к "сивым" программистам еще как-то могу причислить, но к "обшарпанным" увы, нет :-( Вот это не поможет прикрутить поток к C#:

http://www.codeproject.com/KB/audio-video/cswavrec.aspx ?

RX1AL
03.05.2010, 21:46
vadim_d:
Спасибо... Теперь бы мне у наших "обшарпанных" программеров узнать в каком у них формате поток.
А то тут такие программеры, что сваяют такое - потом три года разгребаешь. :wink: Но наводка похоже
по делу. Я уже из простого стрима Wav и MP3 на основе того короткого примера дергаю DTMF.
В тестовом (не реальном режиме) вроде ничего. Попутно вопрос: у нас, насколько я знаю, используются
еще и FIR фильтры и ширина диапазона. В связи с этим он и возник: "как сделать адаптивную привязку?"
Или один раз выбранные значения FIR фильтра и ширины диапазона достаточно будет для всех случаев?
Мне почему-то кажется, что нет, но могу ошибаться. Тапками не бросать - тема и предмет для меня новый...

RN6LIQ
03.05.2010, 21:58
Вот встал один серьезный вопрос, который непонятно, как решать.
Да, судя по молчанию, вопрос поставил всех в тупик.
Да народ еще празднует, шашлык переваривает :)
У меня есть детектор на C++, с инета давно уже скачал, и прикрутил к к программному телефону и радиотрубке старого панасоника. Это что бы не покупать USB телефон :)
База телефона подключена прямо к звуковой карте. После того как набираю номер, нажимаю # и нажатия как бы с клавиатуры транслируются программному телефону с нажатием Enter в конце.
Единственное что у этого алгоритма, не часто, но бывают ложные срабатывания (при разговоре), поэтому что бы положить трубку (для программного телефона имитация нажатия клавиши Esc) надо нажать подряд **, а если делать по одной *, то может разговор прерваться в любой момент.

RX1AL
03.05.2010, 22:13
У меня есть детектор на C++, с инета давно уже скачал, и прикрутил к к программному телефону и радиотрубке старого панасоника. Это что бы не покупать USB телефон :)
Во-во... а код можно? :) А то я тут получил массу материала по е-мейл, сижу и перевариваю.
Кстати в одной статье есть и про адаптивный алгоритм для окна. Понять бы теперь... :wink:
Если кому надо, то инфа здесь:
http://www.mstarlabs.com/dsp/goertzel/goertzel.html
http://www.arpnjournals.com/jeas/research_papers/rp_2008/jeas_0408_92.pdf
http://demo.mypic32.com/web/guest/forumslast/message_boards/message/138654
http://www.rootsecure.net/content/downloads/pdf/paper_dtmf.pdf

vadim_d
03.05.2010, 22:15
Или один раз выбранные значения FIR фильтра и ширины диапазона достаточно будет для всех случаев?
Михаил, для стандартного DTMF частОты компонент сигнала известны заранее, а вот с шумом (которым наверное окажется и речевой сигнал) определенности обычно не бывает. Если это ЧМ/ФМ канал, то амплитуда в процессе работы стабильна, поэтому в первом приближении какая-либо адаптация кажется излишней. Начните с простого :)

RN6LIQ
03.05.2010, 22:24
Во-во... а код можно?


В конце есть функция void dtmf_to_ascii(short *buf, int kol)
Ей надо передавать звуковой поток по 240 выборок (480 байт).
Звук с частотой дискретизации 8000 и уровнем квантования 16 бит
Внутри функции мной помечены участки кода, где происходит прием символа