Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы по DTMF/DSP/алгоритму Герцеля
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
megadocent
Здравствуйте.

Недавно начал работать над программированием DSP и столкнулся с рядом трудностей, появились вопросы, на которые не смог найти/понять ответа. sad.gif

Основная трудность - то, что в институте, в программе подготовки инженера-конструктора РЭА не было ЦОС. 07.gif
Самому с 0 приходится изучать весь этот огромный раздел, в частности цифровые фильтры/преобразования фурье и все связанное с этим, перерывая десятки сложных книг и сотни форумных сообщений.

Имеется вроде бы простое задание - сделать детектор DTMF сигналов + еще 1 частоты (итого 9 частот) на 30 каналов процессоре TMS320С672x (плавающая запятая, мощный достаточно, должен легко справиться).
Сначала хотел сделать это набором фильтров (это ведь называется банк фильтров?) фильтруя сигнал ЦФ/подсчитывая длительность сигнала, если его амплитуда после фильтрации имеет достаточный уровень. Выходило... не очень. В процессе изучения информации наткнулся на алгоритм герцеля, начал его изучать. Возник ряд вопросов.

1) Имеются требования, чтобы детектирование соответствовало ОСТ 45.54-95 - программа должна точно детектировать сигнал выше -20дб, и отклонением частоты менее 1.8% и не реагировать на сигнал слабее -37дб и с отклонением частоты более 3%. Ну и куча других параметров.

Из описания алгоритма не ясно, что будет, если мне надо определить, например, 697Гц и я подам, например, на 40 мс частоту 709 гц при уровне -19дб и суммарном уровне помех -40дб. Он ее должен различить, согласно госту. unsure.gif
Хочется узнать, если кто-то делал декодирование DTMF, или разбирается в этом хорошо, если сделаю по стандартному алгоритму (Например, реализации той же TI), то насколько соответствовать госту будет?

2) Насколько хорош вообще данный алгоритм? Есть альтернативы? Вопрос больше в плане точности детектирования, детектирование на фоне речи/музыки, хотя, конечно, какой-то жутко точный алгоритм, для реализации которого нужно будет по DSP на канал тоже практически непригоден. Как я понял, это самое оптимальное решение, к которому пришли за годы?

3) Встречаются разные варианты, различные модифицированные алгоритмы Герцеля, немного разные коэффициенты. Какой из выложенных в свободном доступе алгоритмов вы считаете наилучшим?

4) Хочу не просто программировать то, что придумали другие, а, самому разбираться в этом, а с опытом и придумывать свое. Со временем, конечно, разберусь в любом случае, но, если посоветуете хорошую литературу, это будет проще и приятнее. rolleyes.gif
Какую литературу посоветуете почитать, где подробно и, желательно, доступно описаны преобразования фурье, свертки и все с этим связанное? В методах проектирования ЦФ, аппроксимациях, Z преобразованиях я уже в общих чертах разобрался, а вот фурье пока неясен. В литературе ЦОС преобразования фурье чаще всего все даются либо в виде конечных формул, с комментариями типа "это сложно, детально разбирать не будем, но надо делать так", либо так, будто читатель разбуженный в полвторого ночи с ходу скажет в чем преобразование фурье заключается. Что-то типа "Дальнейшие действия исключительно просты, если помнить определение преобразования Фурье и формулу комплексного умножения" с последующими гигантскими формулами с одними "отсюда видно" и "это очень просто".

Буду благодарен любым ответам.
fontp
Цитата(megadocent @ Dec 11 2009, 12:02) *
Здравствуйте.

Буду благодарен любым ответам.


1. Различит. В основном будет. Всегда можно придумать и добавить ещё несколько условий, которые немного
улучшают качество. Обычно на простую основную идею наворачивают много дополнительных проверок, чтобы попасть в стандарт. В частности, если нужно обнаружение на фоне голоса (in-band) обязательно кроме частот ДТМФ
добавляют к анализатору их 3-и гармоники. Наличие значительной 3-й гармоники вместе с частотой указывает на то, что это фальшивое случайное срабатывание от голоса. Голос всегда содержит 3-и гармоники.
Правда говорят, есть китайские умельцы, имитирующие голосом ДТМФ специально.

2. Есть альтернативы. Я встречал AR-оценивание спектра в аппаратуре крупнейшей североамериканской корпорации.
AR-модель по частоте непрерывна, и нет проблем с отсутствием точного совпадения частот анализа Герцеля (или ДПФ) с частотами ДТМФ. Эта проблема обостряется, когда стандарт требует ещё и высокое временное разрешение (Поскольку нужного частотного разрешения можно всегда добиться увеличивая кол-во отсчетов). Есть стандарт Bell для касовых аппаратов с временным разрешением 20 мс

3. Герцель и усеченный прямой ДПФ эквивалентны математически. Но по реализации Герцель - это в основном IIR фильтр 2-го порядка, а одна частота прямого суммирования в ДПФ по sin/cos таблице - это как 2 FIR 1-го порядка. Для такого процессора как 67 c длинным убойным конвейером ДПФ смотрится несколько лучше, поскольку не вводит зависимостей в цикле, как IIR. Если не жалко памяти на sin/cos таблицу. Во всяком случае на С ДПФ будет эффективней. Компилятор С никак не сможет вложить IIR второго порядка в один такт, если даже архитектура процессора позволяет. FIR сразу будет в 1. В ассемблере нужно смотреть, что позволит архитектура для IIR, но в любом случае ДПФ не хуже. Вообще-то Герцель - это ДПФ для бедных ))
megadocent
Спасибо за ответ, fontp.

Основное требование - соответствие ОСТ-у. Про временное разрешение там указано <20мс не принимать, >40мс принимать, от 20 до 40 не определено. Применяться будет в АТС.

AR-оценивание спектра - а как оно называется по-другому, в отечественной литературе? В литературе у себя что-то не нашел такого.

То есть вы советуете не применять Герцеля, а применять ДПФ? А во сколько раз, примерно, возрастут требования к вычислительным мощностям и объемам памяти?

И вопрос, если Герцель не так хорош, почему везде где упоминается DTMF сразу пихается Герцель? И для не очень-то слабых сигнальных процессоров у TI они тоже предлагают именно его. (У TI SPRAA096 для с54). И в практических применениях, и вообще, где бы то ни было, везде он? Всего раз в интернете мне встретился другой вариант.

Кроме того, нашел очень интересное высказывание http://www.microchip.su/showpost.php?p=425...mp;postcount=41.
Что вы скажете о написанном там?

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


Кроме того, очень хочется услышать и другие мнения и советы. Буду очень признателен.
fontp
Цитата(megadocent @ Dec 11 2009, 13:56) *
AR-оценивание спектра - а как оно называется по-другому, в отечественной литературе? В литературе у себя что-то не нашел такого.


Авторегрессионное оценивание? Есть в каждом вокодере. Умножаете на функцию окна и делаете авторегрессию алгоритмом Левинсона-Дурбина. Оцениваете спектр. На самом деле оценивать спектр даже не нужно.
Перетаскивают регрессию из знаменателя в числитель, вычисляют и сравнивают чтобы было ниже порога.
1/abs(1-a1*z-a2*z**2...) > C и abs(1-a1*z-a2*z**2...) < 1/C это одно и то же. z связано с частотами MF,
типа косинус от, если раскрыть модуль, а[] - коэффициенты авторегрессии


Цитата(megadocent @ Dec 11 2009, 13:56) *
То есть вы советуете не применять Герцеля, а применять ДПФ? А во сколько раз, примерно, возрастут требования к вычислительным мощностям и объемам памяти?
И вопрос, если Герцель не так хорош, почему везде где упоминается DTMF сразу пихается Герцель? И для не очень-то слабых сигнальных процессоров у TI они тоже предлагают именно его. (У TI SPRAA096 для с54). И в практических применениях, и вообще, где бы то ни было, везде он? Всего раз в интернете мне встретился другой вариант.
Кроме того, нашел очень интересное высказывание http://www.microchip.su/showpost.php?p=425...mp;postcount=41.
Что вы скажете о написанном там?
Опять же там советуют отказаться от Герцеля. И вообще, оно сильно меня расстроило, судя по тому, что там написано я еще полгода буду ковыряться над этой "простой задачей".


Герцель возник от бедности на память, потом так и повелось, так и привыкли.
Всё что делается через Герцель, делается через усечённое ДПФ. Но нужна память под таблицу синусов.
Но математически это одно и то же. Разные способы реализации одного и того же. Я не против Герцеля, если так Вам удобней )) Я и сам делал когда-то Герцелем,повторяя когда-то учебный дизайн от AD

МИПС для современного процессора для ДПФ нужно меньше чем для Герцеля. В современных процессорах хотя бы 2 MAC умножителя. Таблица синусов нужна, но поскольку все ваши частоты кратны 1/N то и таблица нужна всего на 2*N элементов. N- число отсчетов Вашего алгоритма, типа 108 )) Что такое 256 ячеек памяти для современного процессора? Тем более что таблица синусов в процессоре Tms обычно есть в ROMе. Герцель это ДПФ для бедных микроконтроллеров.

В остальном, с написаным там в общем-то согласен. Всё что делается за месяц есть фаст-прототайпинг.
В конце концов то что даже Вы, разработчик, сами не можете протестировать по стандарту, никто другой ведь тоже не сможет протестировать, откуда он узнает, чему оно соответствует. "Очень быстро делали, ещё не знаем, что получилось"© )) Я деловит, но и предельно циничен в таких вот вопросах. Вы не должны врать начальству. Но и за язык Вас никто не тянет - не нужно всё ему говорить. Потом доделаете ))
Другое дело, если Вас начальник спрашивает прямо: "Можно за месяц сделать коммерческий продукт?" нужно прямо и отвечать -"Нет"
megadocent
Цитата(fontp @ Dec 11 2009, 16:05) *
...


Спасибо за совет.
Про авторегрессионное оценивание почитаю, как разберусь с фурье.

То есть если есть хороший процессор, стоит обратить внимание на ДПФ? А не могли бы вы посоветовать литературу по ДПФ, связанную с подобными задачами?

Начальство дало полгода. Сроки пока не жмут. Поэтому хочется разобраться во всем самому досконально и сделать действительно качественную вещь.

p.s. Месяц потратил на изучение ЦФ и их построение, типа баттерворта, чебышева, теперь выяснил что мне нужно было не это изучать, а преобразование фурье изучать.... smile.gif Ладно, в хозяйстве все пригодится.
fontp
Цитата(megadocent @ Dec 11 2009, 15:11) *
То есть если есть хороший процессор, стоит обратить внимание на ДПФ? А не могли бы вы посоветовать литературу по ДПФ, связанную с подобными задачами?


А что там учить?
Да в лоб просто делается. Берётся таблица синусов (она же и косинусов только сдвинутая на половину таблицы). Адресуется циклически. И для каждой интересующей нас частоты в цикле погнали:
S = S + X[i]*SIN[k*i]
C = C + X[i]*COS[k*i]
Ваш процессор, в отличие от микроконтролера, это будет делать за 1 такт.
Микроконтроллеру легче Герцель - в нём не хватает и памяти и производительности.
А результат - один и тот же.

Для ДСП-процессоров накопитель есть самая эффективная операция. Герцель это IIR и он во многих отношениях хуже.
thermit
Цитата
Основное требование - соответствие ОСТ-у. Про временное разрешение там указано <20мс не принимать, >40мс принимать, от 20 до 40 не определено. Применяться будет в АТС.


Там и других требований вагон. Рекомендация itu-t q24. Как показывает практика, лучше иметь более грубый приемник как с точки зрения допусков на частоты, так и на длительность сигналов и на перекосы амплитуд.
Более серьезное требование - ложные срабатывания (детект цифр на речи). Рекомендую найти в сети набор тестовых сигналов фирмы Mitel. Приемник, удовлетворяющий этим тестам будет приемлемо работать в реальной сети с большой вероятностью.

Цитата
AR-оценивание спектра - а как оно называется по-другому, в отечественной литературе? В литературе у себя что-то не нашел такого.


Авторегрессионное оценивание спектра - синтез рекурсивного фильтра без нулей. Частотная характеристика полученного фильтра в той или иной степени будет аппроксимировать спектр анализируемого сигнала.
Широко применяется для сжатия речи (lpc vocoder levinson-durbin )


Цитата
То есть вы советуете не применять Герцеля, а применять ДПФ? А во сколько раз, примерно, возрастут требования к вычислительным мощностям и объемам памяти?


Зачем вычислять значения спектра на частотах, которые не интересуют? По этому и используют герцеля. Вычисляют оценку спектра тока на интересных частотах.


Цитата
И вопрос, если Герцель не так хорош, почему везде где упоминается DTMF сразу пихается Герцель? И для не очень-то слабых сигнальных процессоров у TI они тоже предлагают именно его. (У TI SPRAA096 для с54). И в практических применениях, и вообще, где бы то ни было, везде он? Всего раз в интернете мне встретился другой вариант.


Как самый распространенный. Вариантов сгородить приемник дтмф - вагон и тележка.

Цитата
Кроме того, нашел очень интересное высказывание http://www.microchip.su/showpost.php?p=425...mp;postcount=41.
Что вы скажете о написанном там?


Как человек, сделавший 4 различных приемника дтмф скажу, что аффтырь на 90 % прав.
Из этих 4-х, на реальной сети работает только 1.

Цитата
Опять же там советуют отказаться от Герцеля. И вообще, оно сильно меня расстроило, судя по тому, что там написано я еще полгода буду ковыряться над этой "простой задачей".


Совершенно пофигу, что будет выступать в качестве селективной цепи, герцель или эллиптический фильтр 22-го порядка. Важно получить достоверные мощности интересующих спектральных компонент. Если есть ресурс - расчитайте 8 пар рекурсивных фильтров (полосовых и режекторных) под максимальные отклонения частот. Фильтры должны иметь одинаковые характеристики гвз и достаточно короткую переходную характеристику (реакцию на ступенчатое воздействие). Исходный сигнал подается на 8 полосовых фильтров.
Для верхней и нижней группы выбираются частоты с максимальной мощностью. (Лучше мерять мощность т е sig^2 затем фнч. Фнч должен быть без комплексных полюсов, чтобы не было колебательных процессов в его переходной характеристике. Типа y(n) = y(n-1) + ( x(n) - y(n-1) )*k k = 0.0000 ... 0.9999999...) Затем исходный сигнал последовательно фильтруется режекторными фильтрами, соответствующими выбранным частотам. Меряется мощность результата. По соотношению этих 3-х мощностей и времени его постоянства принимается решение о наличии/отсутствии цифры. Можно добавить еще и режекторные фильтры, настроенные на частоты 2-х гармоник. Это понизит вероятность срабатывания приемника на голос/музыку.
Рабочий приемник сделан именно так.
megadocent
Большое спасибо всем за ответы. Очень помогли.
Решил в итоге сделать несколько программ по разным алгоритмам, учитывая все, что вы написали, после чего прогнать их по тестам и выбрать наилучший.
megadocent
Решил не создавать новую тему, а продолжить эту.
За прошедшее время подтянул знания в области ЦОС, на подходе готовая плата, которую нужно программировать.
Озадачился вопросом проверки.
Помимо соответсвия рекомендациям/стандартам везде рекомендуются проверки 2 тестами - Bellcore и MITEL.
Нашел конкретные названия.
Bellcore Digit Simulation Test Tape, TR-TSY-000763 и
MITEL DTMF Receiver Test Cassette, CM7291
Уже два дня перерываю интернет, но не могу найти их для скачивания. Одни только упоминания, что чья-то продукция им соответствует или их описание и критерии прохождения.
Может кто-то дать ссылку, или сказать где можжно поискать?
fontp
Цитата(megadocent @ Feb 26 2010, 12:01) *
Помимо соответсвия рекомендациям/стандартам везде рекомендуются проверки 2 тестами - Bellcore и MITEL.
Нашел конкретные названия.
Bellcore Digit Simulation Test Tape, TR-TSY-000763 и
MITEL DTMF Receiver Test Cassette, CM7291
Уже два дня перерываю интернет, но не могу найти их для скачивания. Одни только упоминания, что чья-то продукция им соответствует или их описание и критерии прохождения.
Может кто-то дать ссылку, или сказать где можжно поискать?


Не дают никому правоаблодатели
01.gif
http://www.soft-switch.org/spandsp_faq/ar01s13.html

Попробуйте искать по имени файлов FTP-поиском, может где завалялось

MITEL_DIR "mitel-cm7291-talkoff.wav",
BELLCORE_DIR "tr-tsy-00763-1.wav",
BELLCORE_DIR "tr-tsy-00763-2.wav",
BELLCORE_DIR "tr-tsy-00763-3.wav",
BELLCORE_DIR "tr-tsy-00763-4.wav",
BELLCORE_DIR "tr-tsy-00763-5.wav",
BELLCORE_DIR "tr-tsy-00763-6.wav",

Это строки из тестов spandsp, у них там было... Распространяют ли они - не знаю, вряд ли, в дистрибутиве нет. Попробуйте им написать
thermit
MITEL DTMF Receiver Test Cassette, CM7291 - обычная аудиокассета, которая шла в комплекте с прибором для поверки дтмф-приемников. В сети скорее всего Вы ее не найдете.
fontp
Цитата(thermit @ Feb 26 2010, 16:26) *
MITEL DTMF Receiver Test Cassette, CM7291 - обычная аудиокассета, которая шла в комплекте с прибором для поверки дтмф-приемников. В сети скорее всего Вы ее не найдете.


СM7291 была отцифрована и разбита на файлы. В принципе я мог бы найти эти данные.
Только не хочется
1. Там должно быть сопроводилово, которого нет. Там есть группа тестов с известным результатом, где известные DTMF
должны обнаруживаться. И одна сторона ленты talk_off, где DTMF не должны обнаруживаться, но допустимо
до, кажется, 30 ложных срабатываний. Т.е. отсутствуют условия тестов. Я это точно не помню и всё это пришлось бы восстанавливать по командным файлам тестов и косвенно по рекламным заявкам в интернете. Что это за стандарт, пусть де-факто, когда нет уверенности в результате, что так и надо. Всё это условность. Тем более "стандарт" никто не поддерживает. Реально достаточно, чтобы надежно обнаруживались DTMF c разных телефонных аппаратов + не было бы ложных срабатываний на реальном телефонном разговоре продолжительнотью 30-60 мин. Тем более в Матлабе есть функция dtmf и можно нагенерировать сигналов любой продолжительности и любым уровнем шума. Сказать потом, что это тесты внутрикорпоративного стандарта

2. Тем более автор темы несвой, грузить временно данные 60 Мб на файлообменник не хочется, а сервер ему недоступен

Если бы кто-то взялся реконструировать тесты MITEL в виде процесса тестирования из сырых данных as is - я бы нашел и загрузил на ftp. А так совсем пользы не видно
megadocent
Про то, что в широком доступе нету, это нашел. Даже эту же страничку видел, на которую ссылка.
Думал, может у кого оцифрованные завалялись/знает адрес где завалялись.
Что же. "Будем искать" smile.gif
Впрочем, согласен, обязательного требования предоставить прохождение этих тестов никто не требует.
fant
to fontp

Если у Вас есть два файла, оцифровки СM7291, просим выложить их на сервер. Описание тестов есть [attachment=80006:DSA_802980.pdf
анатолий
DTMF характерен тем, что в нем периоды частот взаимно-простые. Поэтому для каждой частоты нужно ДПФ своей длины, так как в длину ДПФ дожно укладываться целое число периодов исследуемой частоты. Длина ДПФ должна быть минимальная, т.к. в полосу пропускания должны попадать как центральная частота, так и частота, отклоненная от нее на 3%.
fontp
QUOTE (fant @ Oct 9 2013, 17:08) *
to fontp

Если у Вас есть два файла, оцифровки СM7291, просим выложить их на сервер. Описание тестов есть [attachment=80006:DSA_802980.pdf



Выложил оцифровку, которой мы пользовались десять лет назад в одной международной корпорации.
upload\dsp\dtmf\*
Только не спрашивайте меня, как этим пользоваться. Лучше смотрите на командник test.bat и разберитесь сами,
а не я буду за вас разбираться rolleyes.gif Невозможно все помнить, что было назад 10 лет.
Sudar1977
Это была моя первая серьезная задача (10 лет назад).
Реализовывал на ADSP-2185, как указано в chpter 8 Digital Tone Detection. Нажмите для просмотра прикрепленного файла
Наткнулся на ограничение вычислительной мощности, т.к. хватало всего на 6-7 каналов вместо 30. Усовершенствовал алгоритм добавив накопление (один буфер копим, другой обсчитываем). В итоге получилось 30 каналов и еще предварительный анализ о наличии цифры. Устройство работает на сети.
Была еще задача с АОН, челнок и пр.
megadocent
Ух, что нашел. rolleyes.gif
Краткие итоги.
TMS320C6726 позволил одновременно обрабатывать 120 каналов, считать мощности в каналах, детектировать DTMF, производить анализ импульсного набора + анализ 425Гц. Плюс еще что-то делать по мелочи. Уперся скорее в пропускную способность DMA и объем памяти (Работал с буфером, а не по мере поступления отсчетов), чем в производительность процессора.

Из интересного вспоминается, как очень резко удалось поднять производительность развернув циклы.
Вместо
Код
    while (i<BUFSIZE)
    {
        x2 = x1;
        x1 = x;        
        x  = shortaddr[i++] + f_coef*x1 - x2;
    }
    return (x2*x2 + x*x - f_coef*x2*x);


использовал одновременный расчет 3 отсчетов.
Компилятор гораздо лучше смог оптимизировать это дело. За счет этого раза в 2, что-ли, скорость повысилась.

Код
    while (i<BUFSIZE)
    {
        x  = shortaddr[i++] + f_coef*x1 - x2;
        x2 = shortaddr[i++] + f_coef*x  - x1;
        x1 = shortaddr[i++] + f_coef*x2 - x;
    }
    x  = shortaddr[i++] + f_coef*x1 - x2;
    x2 = shortaddr[i++] + f_coef*x  - x1;
    return (x2*x2 + x*x - f_coef*x2*x);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.