Микропроцессоры и микроконтроллеры

 
 
 
«Измерять продуктивность программирования подсчетом строк кода — это так же, как оценивать постройку самолета по его весу.»
Bill Gates
Русский | Українська


Микропроцессоры и микроконтроллеры :: Статьи :: Современный автоответчик на базе ARM.Часть пятая

Современный автоответчик на базе ARM.Часть пятая

ВИЗУАЛЬНОЕ МОДЕЛИРОВАНИЕ

Одним из моих намерений в этом проекте было желание поэкспериментировать с реализацией функций сигнального процессора на обычном RISC-процессоре. Отправной точкой для этого является прерывание выборки, которое в действительности в этом случае представляет прерывание по таймеру. Если требуется более высокая точность и малый джиггер, прерывание должно поступать от АЦП, а значение АЦП должно храниться в буфере до тех пор, пока его не прочтет программа прерывания. Но данная функция недоступна для LPC2138. Прерывание по таймеру используется также для выходной выборки при воспроизведении голоса и тоновых посылок.

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

Одной из проблем при демодуляции является то, что вы должны захватить сигнал, который быстро появляется и исчезает. С другой стороны, эмулятор позволяет генерировать миллионы таких скрытых сигналов и контролировать, насколько хорошо работает алгоритм при наличии шума или любых других помех. Я разработал и отладил демодулятор тонового сигнала, используя старую версию Microsoft Visual C/C++. Хотя я не смог применить версию для разработки современных приложений в среде Windows ХР,

это был превосходный инструмент для разработки общего кода языка С. В этой версии также есть функция пошаговой отладки, которой не было на моей платформе LPC2138 и которую можно применять для выявления ошибок.

Для отладки детектора тональных сигналов я сгенерировал несколько образцов сигналов, а затем посылал их своей программе демодуляции. Чтобы получить от программы правильный результат, я потратил больше времени на Windows-платформе, чем на ARM-платформе. После того, как детектор тональных сигналов был отлажен в среде Windows, он заработал с первого раза на LPC2138! Исходный код на Visual C/C++ можно загрузить с ftp-сайта Circuit Cellar (www.circuitcellar.com).

Так как обычный RISC-процессор типа LPC2138 не имеет функции насыщения, важно быть уверенным, что значения входных сигналов или размер переменной нормирован правильно, чтобы избежать насыщения. За дополнительной информацией по данной теме обратитесь к ссылке «Цифровая обработка против RISC-архитектуры».

Я начал разработку и отладку частотного (FSK) демодулятора в программе Excel. Конечно, Excel — не идеальный инструмент для работы с сигнальными процессорами, но он обладает полным набором арифметических функций и средствами представления графики.

ДЕМОДУЛЯЦИЯ ТОНОВЫХ СИГНАЛОВ

Тоновый сигнал (DTMF) состоит из двух тональных посылок, отправляемых одновременно. Первый тон выбирается из четырех нижних частот. Второй — из четырех верхних частот. Это дает 16 возможных комбинаций. Демодулятор DTMF использует алгоритм Герцеля (Goertzel). Разница в том, что алгоритм написан на языке С и не использует одиночную строку компонующего автокода. Собственно реализация ал-

Тоновый сигнал (DTMF)

горитма была заимствованна из более старой версии АТС на основе Asterisk Linux.

Алгоритм Герцеля осуществляет простое дискретное преобразование Фурье (DFT). Главным для этого алгоритма является определение количества выборок, которое необходимо аккумулировать перед запуском цикла детектирования. Этим параметром является DTMF NPOINTS. Существует множество параметров, влияющих на выбор этого значения. Большее значение увеличивает время детектирования и ограничивает частотный интервал. Алгоритм выполняет собственный анализ частот дискретных сигналов (так называемых «буферов»), определяемых по формуле:

f f SAMPLINGRATE i-l>|DTMF_NPOINTS J

где i — целое число. Для того, чтобы детектирование проводилось на должном уровне, fi должно как можно ближе соответствовать частотам определяемых сигналов; иначе энергия будет перетекать из одного буфера в другой.

Тесты и моделирование показали, что при выборке с частотой 8000 Гц наилучший результат дает значение 205. Это значение опре-

деляет интервал выборки 25,6 мс. Для того, чтобы предотвратить ошибки при детектировании сигналов, алгоритм ищет два последовательных положительных результата в смежных интервалах выборки. Это означает, что минимальная продолжительность сигнала равна 51,2 мс, но она может быть немного больше, если сигнал появился в середине интервала выборки. После накопления выборок выполняется программа Герцеля (см. листинг 1).

В конце программы результирующая переменная имеет набор битов для каждого фильтра, значение которого выше предварительно запрограммированного порога. В итоге, программа детектирования проверяет, что существует только один набор битов в каждом полубайте, соответствующий нижней и высшей частотным группам.

Мой алгоритм прост, но надежен. К тому же, временной интервал, в течение которого ТАМ-ТАМ ожидает значение сигнала, мал.