LINUX.ORG.RU

Декодирование АОН

 , , , ,


2

4

В процессе изучения Asterisk возникла необходимость преобразовать АОН в CallerID, т.к. АТС, к которой подключен сервер с * в CallerID не умеет.

Сразу оговорюсь, что c обработкой сигналов не знаком вообще. Если приведете какие-нибудь ссылки на матчасть, буду признателен.

Итак, что я имею:

  • Asterisk, подключенный к АТС по FXO-порту.
  • Запись сигнала от АТС на Asterisk, полученная с помощью dahdi_monitor 4 -r stream.wav и сделанная в то время, когда отправляется АОН (если я все правильно понимаю).

Почитав про АОН, я установил, что «информация формируется комбинациями из двух частот на основе шести базовых»:

 F0=700Гц
 F1=900Гц
 F2=1100Гц
 F4=1300Гц
 F7=1500Гц
 F11=1700Гц

 ---------------------------------------------
 0 - F4 F7          6 - F2 F4
 1 - F0 F1          7 - F0 F7
 2 - F0 F2          8 - F1 F7
 3 - F1 F2          9 - F2 F7
 4 - F0 F4          "начало-конец" - F2 F11
 5 - F1 F4          "повтор"       - F4 F11
 ---------------------------------------------

Вопросы:

  1. С помощью какой сишной библиотеки можно проанализировать частоты в wav-файле?
  2. Как определить какой код был передан (я сейчас не понимаю, как происходит «смешивание» частот, как такое смешение «увидеть» и определить какие частоты смешали)?
  3. Пишут, что длительность передачи одной комбинации может колебаться от 25 до 70 мс, несмотря на то, что по ГОСТу 40±2 мс. Как к этому можно адаптироваться? Или конкретная АТС передает комбинации с одной и той же длительностью и достаточно один раз её выяснить?

С помощью какой сишной библиотеки можно проанализировать частоты в wav-файле?

GNU Radio

Turbid ★★★★★
()
Ответ на: комментарий от beastie

В audacity я его смотрел для интереса, да. А что использует audacity? Свои библиотеки?

HerrWeigel ★★★★
() автор топика
Ответ на: комментарий от Turbid

Базовое назначение одно, реализация и фичастость разная же. Или я чего-то не понимаю?

Но я тебе могу точно сказать, что в CALLERID(num) пусто.

HerrWeigel ★★★★
() автор топика

Это чисто для себя?

потому что иначе это непонятная трата времени и возня c говном мамонта

И вообще, вне зависимости от того что там аон или CallerID fxo примочка должна сама передавать номер через sip (если он есть).

Хотя насколько я понял Asterisk через плату подрублен напрямую к fxo, тогда это другой случай.

invokercd ★★★★
()
Последнее исправление: invokercd (всего исправлений: 1)
Ответ на: комментарий от invokercd

Интерес чисто академический.

Asterisk через плату подрублен напрямую к fxo

Абсолютно верно.

HerrWeigel ★★★★
() автор топика
Ответ на: комментарий от robot12

Про такие штуки знаю: они меня не интересуют.

HerrWeigel ★★★★
() автор топика

С помощью какой сишной библиотеки можно проанализировать частоты в wav-файле?

Можно взять что-то, что умеет делать преобразование фурье, например http://snd2fftw.sourceforge.net/

Или можно FFTW взять и написать код, чтобы оно читало wav файл

SZT ★★★★★
()
Ответ на: комментарий от yoghurt

Да, это хорошая идея! Я натыкался на какой-то декодер DTMF на асме (для stm32, что ли), но не приходило в голову поискать его реализацию на чем-нибудь другом.

Там есть различия: во-первых, информация в АОН отсылается без пауз; во-вторых, у них разные базовые частоты (но это не проблема). Думаю, получится что-нибудь адаптировать. Завтра-послезавтра покопаю.

HerrWeigel ★★★★
() автор топика

1. С помощью какой сишной библиотеки можно проанализировать частоты в wav-файле?

Не страдайте тем чем не нужно страдать. #include <asterisk/dsp.h>

2. Как определить какой код был передан (я сейчас не понимаю, как происходит «смешивание» частот, как такое смешение «увидеть» и определить какие частоты смешали)?

В лоб. Настроили DSP на частоты и кормите ему порции отсчетов. В качестве выхлопа DSP даст амплитуды частот,и т.п. Подставляете и делаете вывод, какой «символ» пришел.

3. Пишут, что длительность передачи одной комбинации может колебаться от 25 до 70 мс, несмотря на то, что по ГОСТу 40±2 мс. Как к этому можно адаптироваться? Или конкретная АТС передает комбинации с одной и той же длительностью и достаточно один раз её выяснить?

Не стоит адаптироваться. Практические советы:
1) 10мс с головй хватит чтобы детектировать символ, дальше уже всё-равно сколько он длиться(конечно 100мс это перебор уже).
2) Никогда два одинаковых символа подряд не будут переданы(будет на место второго передан символ «повтор»). Момент смены реакции DSP и есть конец предыдущего символа, начало следующего.
3) Будьте готовы что некоторые станции с перепугу могут выдать несколько пачек АОН-а, встречал я до 3х. Выделите оттуда одну.
4) По протоколу АОН сам не посиылается, пока апарат не запросит посредством короткого 500Гц тона после полнятия трубки. Но станции могу посылать и без запроса(В трубке слышно характерное пиликание).
5) Если не изменяет память, АОН передается в цифрами в обратном порядке, также передается одна цифра - категория абонента.
6) ВНИМАНИЕ: если промежуточный FXO-шлюз(устройство которое цифрует звук) настроен на детекирование DTMF, то тут могут быть проблемы: дело в том что один из символов АОН(то ли «4» то ли «7») своей парой часто очень похож на один из DTMF символов(буквально 3-15Гц разница), т.е. в пределах погрешности DSP. И это «умное» оборудование услышав подобный символ, срочно заглушит его, а услышануюю цифру * получит другим способом, поэтому такая посылка АОН не будет детектирована.

В образце звука который вы предоставили вообще ничего вразумительного и АОН-подобного не услышал. Предполагаю что то 2 посылки КПВ. АОН определяется ПОСЛЕ поднятия трубки в отличии от CallerID (после первого звонка выполняется передача данных), и не на стороне линии которая слышит КПВ.

PS: два года назад самолчино сделал детектор АОН в *. За базар отвечаю :)

FeyFre ★★★★
()

В астере версии 1.4 декодирование тональной сигнализации(DTMF, etc) реализовано в файле ./main/dsp.c. Для декодирования используется алгоритм Герцеля. В принципе нужно добавить нужный паттерн в dsp.c. И настроить детектирование DTMF в канале DUHDI. Но я думаю это все уже сделано, нужно только поискать в нете.

И по поводу ГОСТа и реализации, в большинстве случаев аппаратной реализации тональной сигнализации, частотная сетка, а также длительность символов может отличатся от стандарта ввиду ограниченности аппаратуры. Например используются частоты близкие к тем что описаны в стандарте.

Tonny
()
Ответ на: комментарий от FeyFre

#include <asterisk/dsp.h>

Спасибо за подсказку.

10мс с головй хватит чтобы детектировать символ

Окей, это хорошо.

Никогда два одинаковых символа подряд не будут переданы(будет на место второго передан символ «повтор»)

Насчет этого в курсе.

Если не изменяет память, АОН передается в цифрами в обратном порядке, также передается одна цифра - категория абонента.

Память вроде не изменяет.

По протоколу АОН сам не посиылается, пока апарат не запросит посредством короткого 500Гц тона после полнятия трубки

Вот это для меня новость, думал, что моя АТС сама отправляет.

В образце звука который вы предоставили вообще ничего вразумительного и АОН-подобного не услышал

Черт, я этого боялся! Кстати, что такое КПВ?

Про то, что АОН определяется после поднятия трубки я в курсе.
Меня ввело в заблуждение то, что когда звонишь с телефона, подключенного к АТС, на номер Asterisk, то в трубке сначала слышишь два длинных гудка (как раз в это время и был записан приложенный мной файл); а в логах * в это время появляется строчка вроде Starting simple switch on DAHDI4-1. И только по прошествии этих двух гудков начинают выполняться приложения из диалплана. Я думал, что в это время как раз выполняется передача АОН. В чем тогда может быть дело?

если промежуточный FXO-шлюз(устройство которое цифрует звук) настроен на детекирование DTMF, то тут могут быть проблемы

В роли такого устройства у меня выступает PCI-плата FXO/FXS. Посмотрю, есть ли у нее такая фича. Если есть, то как-нибудь это можно обойти?

HerrWeigel ★★★★
() автор топика
Ответ на: комментарий от Tonny

В астере версии 1.4 декодирование тональной сигнализации(DTMF, etc) реализовано в файле ./main/dsp.c. Для декодирования используется алгоритм Герцеля. В принципе нужно добавить нужный паттерн в dsp.c. И настроить детектирование DTMF в канале DUHDI. Но я думаю это все уже сделано, нужно только поискать в нете.

Да, подсказали уже, спасибо.

HerrWeigel ★★★★
() автор топика
Ответ на: комментарий от HerrWeigel

Вот это для меня новость, думал, что моя АТС сама отправляет.

На всякий случай может и отправлять без запроса. В принципе это конфигурируется в АТС-ках. Сами понимаете до чего кривость рук(или мозгов) приводит.

Черт, я этого боялся! Кстати, что такое КПВ?

Контроль Посылки Вызова(https://ru.wikipedia.org/wiki/КПВ ) -, онже Ring-Back Tone 425Гц прерывистый сигнал(1с+4с пауза кажись), сигнал слышно звонящему абоненту в трубку пока набранному идут звонки. Фактически КПВ сигнал соответствует звонку, если абоненты находятся на одной станции/на одном протоколе обмена(нету «оцифровки» и прочих переходов между абонентами). У Астериска есть специальный конфиг(indications.conf) где такие тоны прописаны и некоторые Application-ы их оттуда читают и генерят что положено.

Меня ввело в заблуждение то, что когда звонишь с телефона, подключенного к АТС, на номер Asterisk, то в трубке сначала слышишь два длинных гудка (как раз в это время и был записан приложенный мной файл); а в логах * в это время появляется строчка вроде Starting simple switch on DAHDI4-1. И только по прошествии этих двух гудков начинают выполняться приложения из диалплана. Я думал, что в это время как раз выполняется передача АОН. В чем тогда может быть дело?

Очень похоже на устройствами типа конвертатор АОН-в-CID(возможно в плате такое предусмотрено). При первом звонке автомат поднимает трубку, посылает запрос АОН, слушает АОН, передает его CallerID-совместимому телефону, а само начинает генерировать КПВ в трубку, типа чтобы там абонент подумал что ещё не ответил(а фактически ответили, и это видят все станции и считает биллинг). Такое вот предположение, возможно ложное. Суть в том что АОН пиликает в трубку набранного абонента, и пиликает именно его станция. Набирающий абонент может лишь догадаться о АОН-е по 500Гц тону запроса(который станция добросовестно транслирует дальше, не глушит). Если честно я не силен в DAHDI, ибо делал всё без него(на DLink VoIP шлюзе, который FXO конвертировал в SIP, и Asterisk на ура определял АОН)

В роли такого устройства у меня выступает PCI-плата FXO/FXS. Посмотрю, есть ли у нее такая фича. Если есть, то как-нибудь это можно обойти?

Курить доки только. Как выше говорил, я практически с ними дела не имел, но настройка должна какая нибудь быть, да хоть в лоб «не детектить DTMF»(если такая фича есть вообще... вполне вероятно что DTMF может и * детектить программно).

Качество записи конечно фигня, даже если не с той стороны писали. Если повезет нагуглю вам пример хорошего АОН-а.

FeyFre ★★★★
()
Ответ на: комментарий от FeyFre

Очень похоже на устройствами типа конвертатор АОН-в-CID

Спасибо за наводку, временно отрубил использование CallerID (usecallerid=no), теперь до начала выполнения приложений диалплана проходит только один гудок и, соответсвенно, только одна отправка сигнала (КПВ?).

Я правильно понимаю, что могу сделать что-то вроде

exten => s,1,Answer()
exten => s,n,PlayTones(aonrequest) ; отправка сигнала 500Гц
exten => s,n,Wait(0.1)
exten => s,n,StopPlayTones()
exten => s,n,EAGI(detectaon) ; запись АОН и установка CALLERID

?

Качество записи конечно фигня

Сэмплрейт 8000Гц, может из-за этого?

HerrWeigel ★★★★
() автор топика
Ответ на: комментарий от FeyFre

Немного дополню код после прочтения информации о сигнале запроса:

exten => s,1,Answer()
exten => s,n,Wait(0.25)
exten => s,n,PlayTones(aonrequest) ; отправка сигнала 500Гц
exten => s,n,Wait(0.1)
exten => s,n,StopPlayTones()
exten => s,n,EAGI(detectaon) ; запись АОН и установка CALLERID

Только пока не понял, как установить уровень в -4.3Дб.

HerrWeigel ★★★★
() автор топика
Последнее исправление: HerrWeigel (всего исправлений: 1)
Ответ на: комментарий от HerrWeigel

Сэмплрейт 8000Гц, может из-за этого?

Не. шумов много. То ли наводка по питаю, то ли ещё что. 8кГц это вполне себе качественный звук, который слышно в трубке(в т.ч мобильного телефона), и если вам не нужно случшать фортепьяно, но лучше желать нет необходимости.

Если EAGI позволяет адекватно передать звуковые данные внешнему приложению, то можно и так. Я сделал Application (app_aon.so), который и отправляет запрос, и читает ответ, и устанавливает переменные.

exten => s,1,Answer()
exten => s,n,AON(некие параметры типа таймаутов)
exten => s,n,Noop(--${AOUNSTATUS}--${AOUNNUMBER}--${AONCATEGORY}--)
; Тут уже по памяти
exten => s,n,Set(${CALLERID(cid_num)}=${AONNUMBER})

FeyFre ★★★★
()
Ответ на: комментарий от FeyFre

Не. шумов много. То ли наводка по питаю, то ли ещё что

Тогда фиг его знает.

Вариант со своим приложением мне гораздо больше нравится: более гибкий.

Буду выяснять, как АТС к которой я подключаюсь, отдает АОН.

HerrWeigel ★★★★
() автор топика
Ответ на: комментарий от FeyFre

Не, пока почему-то не получается запросить АОН:

indications.conf

[ru]
aonrequest = 500/90, 0/4000
extensions.conf

exten => s,1,Answer()
exten => s,n,Wait(0.25)
exten => s,n,PlayTones(aonrequest)
exten => s,n,Wait(4)
exten => s,n,StopPlayTones()
exten => s,n,Dial(DAHDI/4)

Сигнал aonrequest в трубке вызывающего абонента слышно, а потом на канале тишина.

HerrWeigel ★★★★
() автор топика
17 сентября 2015 г.
Ответ на: комментарий от HerrWeigel

Здравствуйте.

Интересует та же проблема.

Для меня работает такой диалплан:

[from-pstn]
exten => s,1,Answer()
same => n,PlayTones(!500/100,!0/100,!500/100,!0/100,!500/100)
same => n,Wait(0.3)
same => n,Wait(1000)
same => n,Hangup()

От АТС ответ приходит. Терерь задача его декодировать.

Вы добились успеха?

Вот запись канала с ответом станции: http://expirebox.com/download/5b61ecad50155ad78b13ca0859a800d7.html

usv
()
16 мая 2016 г.
Ответ на: комментарий от FeyFre

PS: два года назад самолчино сделал детектор АОН в *. За базар отвечаю :)

А можешь поделиться своим решением? Кажется, несовсем правильно пытаться реализовывать одно и то же, тем более когда анализом сигналов никогда не занимался.

andr-04
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.