В HTML      В PDF
микроэлектроника, микросхема, транзистор, диод, микроконтроллер, память, msp430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, avr, mega128
Предприятия Компоненты Документация Применения Статьи Новости

 
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации





Главная страница > Применение > Микроконтроллеров > MSP430
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации


Генерация и распознавание DTMF-сигналов. Часть II

1 Введение

Во второй части данного примера применения описан приём и распознавание сигналов DTMF при помощи микроконтроллера MSP430. Рассматриваются теоретические и математические вопросы, связанные с реализацией цифровых фильтров. Отдельно рассмотрено применение таких фильтров для выделения требуемых компонентов из аналоговых сигналов. Для аналого-цифрового преобразования используется АЦП, имеющийся в конфигурации C32x. 8 цифровых фильтров обрабатываются в режиме реального времени, из их выходных значений восстанавливаются символы DTMF. Также в данном разделе приведена принципиальная схема, поясняющая подключение аналоговых сигналов к MSP430.

2 Приём сигналов DTMF при помощи цифровых фильтров-резонаторов

С целью приёма сигналов DTMF при помощи микроконтроллера без использования специализированных дорогостоящих компонентов, входные импульсы должны быть оцифрованы с помощью аналогово-цифрового преобразователя (АЦП) и распознаны методами цифровой фильтрации. MSP430 подходит для этих целей благодаря следующим особенностям:

Несмотря на сравнительно низкую тактовую частоту (до 3.3 МГц)(в современных моделях – до 8МГц, прим. перев.), микроконтроллер имеет достаточно высокую вычислительную мощность благодаря наличию команд, выполняемых за один цикл, аналогичных архитектуре RISC .

Благодаря наличию встроенного АЦП, подключение МК к аналоговым системам не представляет сложностей. Необходимость во внешнем АЦП отсутствует.

3 Основы цифровых фильтров

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

Эти значения получаются в процессе «выборки» непрерывного сигнала через фиксированные промежутки времени при помощи АЦП, который в данном случае должен содержать устройство выборки-хранения (УВХ). По теореме о дискретизации [2] частота выборки должна быть не менее, чем в два раза выше максимальной частоты, присутствующей во входном сигнале. Исходя из этого, перед АЦП установлен аналоговый ФВЧ [3].

Если на выходе цифрового фильтра требуется получить аналоговый сигнал, вычисленные значения преобразуются цифроаналоговым преобразователем, на выходе которого сигнал фильтруется при помощи ФВЧ [3].

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

3.1 Свойства цифровых фильтров-резонаторов

Алгоритмы цифровой фильтрации, как правило, требуют большого числа операций умножения. С целью уменьшения числа переполнений и ошибок округления, разрядность операндов должна быть достаточно высокой. По этой причине, желательно использовать для вычислений сигнальные процессоры с аппаратным умножителем. Разрядность при этом имеет диапазон от 16 до 24 бит.

Некоторые сигнальные процессоры также имеют возможность работы с числами в формате «плавающая точка», в котором обрабатываемые данные представлены с соответствующей точностью. В этом случае для цифровой фильтрации используются цифровые фильтры-резонаторы (ЦФР) (Wave Digital Filters (WDFs)). Такие фильтры {5,107} аналогичны аналоговым LC – цепям и микрополосковым фильтрам, их характеристики также идентичны характеристикам соответствующих аналоговых фильтров.

Особенностью ЦФР является пониженная чувствительность к изменениям коэффициентов {5}. Это особенно важно в нашем случае, т.к. все операции умножения из-за отсутствия аппаратного умножителя выполняются методом «сдвиг-сложение». Таким образом, укорочение и оптимизация коэффициентов экономит время вычислений. При этом, такое упрощение не наносит вреда стабильности частотных характеристик фильтра. В результате применения более коротких коэффициентов понижается ошибка округления, возникающая при умножении. Ещё одно положительное свойство ЦФР – большой динамический диапазон {12, 22}.

Стабильность ЦФР не нарушается при разрывах входного сигнала. Это его свойство позволяет обрабатывать запросы прерываний, после чего возвращаться к обработке фильтров. Благодаря «пассивной» природе таких фильтров, к их положительным свойствам можно также отнести быстрое восстановление при перегрузках и других искажениях входного сигнала. Такое поведение известно как «Стабильность ИХ фильтра» (“Response Stability”) {120}. Для обычных цифровых БИХ-фильтров эта проблема нерешаема {5, S 302; 136}, в то время, как ЦФР остаются стабильными даже при «закольцевании» {19}.

3.2 Структура используемых цифровых фильтров-резонаторов


Рис. 13 Структура цифрового фильтра-резонатора

В нашей задаче требуется определение наличия конкретной частоты во входном сигнале. С этой целью используется фильтр, изображенный на рис. 13 и состоящий из контура с последовательным резонансом и «согласующей цепи» с наличием потерь [4]. Амплитудная характеристика такого фильтра показана на рис. 14.


Рис. 14 Амплитудно-частотная характеристика цифрового фильтра-резонатора

Фильтры рассчитаны таким образом, чтобы резонансная частота в точности соответствовала искомой. Если интересующая нас частота появляется в спектре входного сигнала, она будет усилена, в то время, как остальные частоты будут ослаблены. Коэффициент усиления резонансной частоты, либо коэффициент ослабления остальных частот определяется параметром K в виде -20 log K (дБ). Полоса пропускания фильтра определяется как полоса частот по уровню -10 log K (дБ). Превышение амплитудой на выходе фильтра определённого порога означает присутствие искомой частоты в спектре. Регулировка усиления производится при помощи согласующей цепи с наличием потерь. Структура этой цепи идентична для всех фильтров (см. рис. 15). Цепь с последовательным резонансом состоит из двух элементов задержки и адаптера. Существуют четыре различных конфигурации в зависимости от требуемой резонансной частоты (рис.16).


Рис. 15 Структура согласующей цепи с наличием потерь

Т.к. в данном примере арифметика с плавающей точкой не используется, алгоритм фильтра вычисляется с целочисленной точностью 16 бит; коэффициенты умножения присутствуют в конфигурациях A и D, что улучшает динамические характеристики фильтра.


Рис. 16 Четыре различные конфигурации четырёхполюсника

4 Представление чисел и арифметика

Т.к. из ценовых соображений MSP430X325 не содержит аппаратного умножителя, все операции умножения выполняются при помощи сдвигов и сложений либо вычитаний. Любое умножение двух чисел может быть представлено как многократное прибавление множителя. Если над двоичным числом произвести n операций сдвига вправо, результат будет идентичен умножению на 2-n. Т.к. представления коэффициентов в интервале 2n как правило недостаточно, каждая ‘1’ в двоичном числе должна быть заменена при помощи сдвига и последующего сложения. Поясним это на примере умножения с использованием метода сдвига-сложения (shift-and-add):

Ввиду того, что в таких числах слишком много знаков после запятой, требуется большое число сложений для того, чтобы представить число в виде дополнения до 2-х. Чтобы повысить скорость обработки в таких случаях, используется кодировка Canonically Signed Digit Code (CSD) [5]. В результате использования кода CSD, число знаков коэффициента после запятой уменьшено до минимума. Это достигнуто введением величины -1 для представления двоичных чисел. Эта величина появляется в вычислениях при вычитании. Вышеприведенный пример при использовании кода CSD будет выглядеть следующим образом:

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

Учитывая, что результат умножения n бит на m бит имеет разрядность n+m бит, а разрядность операндов не может увеличиваться от одного умножения к другому, результат должен быть округлён или младшие биты должны быть отброшены, желательно при этом не потерять требуемую точность. С минимальной ошибкой это может быть обеспечено использованием метода Хорнера [5].

В нижеприведенном примере 12-битный результат формируется умножением 12-битного и 9-битного множителей.

Обычное умножение выглядит так:

При использовании метода сдвига-сложения:

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

Метод Хорненра лишён этого недостатка, в нём младшие биты сохраняются до тех пор, пока это возможно:

Процесс начинается с младшей ‘1’ множителя, в дальнейшем происходит накопление, после чего промежуточный результат сдвигается вправо (на разницу положений бит до следующей ‘1’), с последующим сложением, сдвигом и т.д. Операции абсолютного сдвига (в данном случае 2-8, 2-5, 2-2) выполняются корректно. Вышеописанный процесс используется для введения и оптимизации коэффициентов фильтра, с целью минимизировать вычислительные ресурсы при максимальном сохранении точности. Т.к. арифметические вычисления в микроконтроллере обычно осуществляются с 16-битными целыми операндами, следует договориться о представлении значений сигнала. Для программной обработки операций с плавающей точкой потребуется слишком много времени, таким образом, следует использовать арифметику с фиксированной точкой.

Примем следующее распределение бит для алгоритма фильтрации:

    1 Бит знака
    2 Бита переполнения
    13 Бит данных с фиксированной точкой

Таким образом, двоичное число 0.01111B будет представлено в данной системе, как показано на рис. 17:


Рис. 17: Цифровое представление значений сигнала

Отрицательный коэффициент представляется при помощи разделения на две части. Первая часть равна -1, вторая представляет дополнение до требуемого отрицательного значения. Таким образом, -0,3 будет представлено как -1 + 0,7.

5 Расчёт 8-ми цифровых фильтров-резонаторов и оптимизация коэффициентов

ЦФР используются для распознавания частоты, расчёт таких фильтров требует определения следующих параметров [4]:

  • Частота выборки
  • Резонансная частота фильтра
  • Усиление (ослабление) фильтра в виде -20 log K (дБ)
  • Полоса пропускания по уровню -10 log K (дБ)

Так как наивысшая частота DTMF равна 1633 Гц, по теореме о квантовании частота выборок в 3640 Гц будет достаточной. Это соответствует 1/9 частоты ACLK, равной 32.768 кГц присутствующей в MSP430, и по этой причине она легко может быть сгенерирована таймером. Несмотря на то, что речевые сигналы, попадая на вход АЦП оцифровываются с очень низкой частотой, это не приведёт к некорректному поведению при распознавании DTMF, т.к. сигнал распознаётся как корректный DTMF символ только в том случае, если в спектре присутствуют обе частоты DTMF одновременно на протяжении определённого промежутка времени. Кроме этого, во время передачи сигнала DTMF все посторонние сигналы, включая речевые, должны быть ослаблены не менее, чем на 23 дБ [1].

Резонансные частоты фильтров соответствуют каждой индивидуальной частоте DTMF. Такие частоты должны проходить через фильтр без ослабления. Подавление для остальных частот -20 log K (дБ) выбрано на уровне -40дБ. Это соответствует коэффициенту ослабления K=100. Если сигнал с частотой, равной граничной частоте фильтра (по уровню -10 log K) попадёт в соседний канал DTMF, то при этом гарантируется, что уровень искомой частоты будет в 10 раз выше, чем у соседней частоты. Это соответствует разности в 20 дБ. Однако, в результате укорочения и оптимизации коэффициентов, достичь коэффициента 10 не удается, но при том реальная разница уровней является полностью достаточной для надёжного распознавания частот. При сравнении выходных значений фильтров, частота DTMF считается присутствующей в спектре, если значение на выходе соответствующего фильтра в 10 раз превышает значение на выходах остальных фильтров.

Учитывая вышеописанные требования, коэффициенты для 8 фильтров вычислим следующим образом [4]:

Частота, Гц 697 770 852 941 1209 1336 1477 1633
Цепь с посл. резонансом Тип согл. цепи B B B C C D D D
alpha 0.3594420 0.2393157 0.0999495 0.0534851 0.4935082 0.3291608 0.1702124 0.0516459
n2 - - - - - 1.5146077 2.4736004 5.8005043
Согласующая цепь с наличием потерь gamma1 0.9773007 0.9774177 0.9759909 0.9749654 0.9696236 0.9702183 0.9692265 0.9694046
gamma2 -0.9743449 -0.9745813 -0.9716988 -0.9696270 -0.9588356 -0.9600369 -0.9580333 -0.9583930
n1 0.0250727 0.0248447 0.0276217 0.0296126 0.0399140 0.0387729 0.0406752 0.0403340

Т.к. данные коэффициенты затруднительно представить в двоичной системе и вычисления с их использованием потребуют больших ресурсозатрат, в дальнейшем произведём укорочение и оптимизацию коэффициентов. Величины n1 и n2 являются масштабирующими коэффициентами и довольно свободно могут быть изменены. Поэтому они были округлены до следующей минимальной степени двух, что позволило упростить вычисления до нескольких операций сдвига. Значения коэффициента alpha требуют большего внимания, т.к. они влияют на резонансную частоту. Чтобы удостовериться в корректности проведенного укорочения данных коэффициентов, резонансная частота была пересчитана заново с учётом новых значений. В результате успешной оптимизации были получены следующие значения:

Частота, Гц 697 770 852 941 1209 1336 1477 1633
alpha (*n2) 0.359375 0.234375 0.09375 0.046875 0.5 0.328125 0.171875*2 0.046875*4
Резонансная частота 697 773 855 937 1213 1337 1475 1642
Отклонение, % 0 0.39 0.35 -0.43 0.33 0.07 -0.14 0.55
alpha (*n2) в представлении CSD 0.010111 0.010000-1 0.00011 0.000011 0.1 0.010101 0.01011 0.0011

Несмотря на значительное укорочение коэффициентов и, благодаря этому, времени вычисления, отклонение частоты от номинальной несущественно. При внимательном рассмотрении выясняется подобие коэффициентов согласующей цепи с наличием потерь. Это легко объяснимо с учётом того фактора, что данные коэффициенты зависят в основном от параметра -10 log K, который выбран одинаковым для всех фильтров исходя из критерия: соседняя частота DTMF должна быть подавлена на -10 log K .

В результате этого, для всех 8-ми фильтров DTMF была выбрана единственная согласующая цепь с округлённым значением. Такое решение имеет массу преимуществ:

  • Требуется расчёт и программирование только одной цепи вместо 8
  • Ассемблерный код лучше оптимизирован
  • Существенно упрощается отладка при использовании одинаковой программы
  • При наличии свободного времени на вычисления, можно сэкономить память вызывая подпрограмму

Оптимальные значения коэффициентов представлены в таблице:

Частотный диапазон 697 Гц – 1633 Гц
n1*gamma1 0.00001b
gamma2 -1,0 + 0,00001b
1/n1 32

6 Проверка расчёта фильтров с помощью программ математического моделирования

Встроенный в MSP430 АЦП даёт возможность перехода от аналоговых к цифровым сигналам. Однако, для проверки характеристик фильтров, нам потребуются точные значения на выходе фильтров. Получить их непосредственно невозможно (т.к. встроенный ЦАП отсутствует), поэтому проверить амплитудные характеристики фильтра также невозможно. Чтобы получить в этом случае информацию о достигнутых характеристиках фильтров, алгоритм был смоделирован математической программой, с её помощью были получены амплитудные характеристики.

В отличие от микроконтроллера, осуществляющего вычисления с 16-битной точностью, алгоритм в данном случае оперирует с точностью плавающей запятой. При этом были использованы укороченные коэффициенты. В качестве примера приведена программа моделирования и результат - амплитудная характеристика фильтра на 770 Гц. Для сравнения также приведена характеристика фильтра с неокруглёнными коэффициентами. (Рис.18):

Программа для проверки фильтра на 770 Гц методом математического моделирования

Функция с неокруглёнными значениями gamma_1_n1, gamma_2 и n1

Функция с округлёнными значениями

Резонансная частота равна 773 Гц, поэтому предварительно полученное значение alpha=0.234375 достигается точно.

Усиление фильтра уменьшилось до -36 дБ взамен -40 дБ. Причиной этого является округление коэффициентов gamma_1 и gamma_2. При моделировании с использованием точных значений коэффициентов достигается расчётное значение -40 дБ.

Соседняя частота DTMF (697 Гц) имеет усиление -18.5 дБ, что соответствует 1/8 входного значения. Такого разделения достаточно для безошибочного распознавания частоты.

Этот пример демонстрирует весьма важное свойство цифровых фильтров-резонаторов – их низкую чувствительность к округлению коэффициентов: несмотря на значительное укорочение коэффициентов и сокращение времени расчёта, характеристики фильтра существенно не изменились.


Рис 18: Амплитудно-частотная характеристика фильтра на 770 Гц, смоделированная при помощи MathCad

7 Программное обеспечение для реализации цифровых фильтров

Алгоритмы цифровых фильтров требуют большой вычислительной мощности, ввиду большого числа умножений и сложений, требуемых при расчётах – особенно в тех случаях, когда умножение производится без помощи аппаратных умножителей, а осуществляется методом сдвигов-сложений. По этой причине для таких задач часто применяются цифровые сигнальные процессоры, т.к. они имеют быстрый умножитель с накоплением (MAC), или, как минимум, многорегистровый циклический сдвигатель (Barrel Shifter), позволяющий осуществлять операцию сдвига на несколько позиций одной командой. Таким образом, реализовать алгоритм фильтра в реальном времени с использованием медленного микроконтроллера невозможно.

Тем не менее, микроконтроллер MSP430 позволяет реализовать такой алгоритм благодаря тому, что инструкции, операнды которых находятся в регистрах, выполняются за один такт. Кроме этого, для повышения вычислительной мощности системная частота повышена с 1 МГц до 3.3 МГц (прим. перев. – на момент перевода макс. частота семейства – 8МГц).

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

Если алгоритм должен быть обработан в режиме реального времени, вычисление определённого «куска» данных должно быть завершено перед тем, как будут получены новые данные. Промежуточное хранение данных в ОЗУ невозможно, т.к. его объёма недостаточно для хранения большого массива данных, поступающих из АЦП с определённой частотой.

Для таймера-порта выбрана частота прерываний 3640 Гц. Это соответствует девяти тактам частоты ACLK. АЦП запускается по прерыванию таймера-порта. Т.к. частота ACLK генерируется при помощи «часового» кварца частотой 32.768 кГц, получаемая частота выборки имеет низкое дрожание фазы (джиттер) и высокую стабильность, присущую кварцевому резонатору. При этом гарантируется корректная выборка аналогового сигнала и, соответственно, верные расчётные значения [10]. По завершении преобразования, осуществляется вычисление для 8-ми цифровых фильтров и распознавание частот DTMF на основе полученных значений фильтров. На алгоритм расчёта и распознавания выделено, таким образом, 274.7 мкс. Это соответствует 915 тактам при длительности такта 300 нс. По завершении этого времени вычисление должно повторяться с использованием обновлённых данных АЦП. Реализация алгоритма представлена на рис. 19.


Рис. 19: Алгоритм вычисления 8-ми цифровых фильтров и распознавания сигналов DTMF в режиме реального времени.

8 Программа распознавания сигналов DTMF

С целью распознавания полученного символа DTMF из вычисленных значений фильтров, после вычислений фильтров применяется алгоритм декодирования. Этот алгоритм должен сопоставить распознанные частоты символу DTMF. Кроме этого, в процессе вычисления фильтров производится сравнение их значений. В практической реализации, раздельно для «верхней» (Hi-Group) и «нижней» (Lo-Group) групп частот находится частота с максимальной амплитудой, её значение сохраняется. Таким образом, после каждого вычисления 8-ми фильтров нам известны частоты «верхней» и «нижней» группы с максимальной амплитудой. На рис. 20 представлен алгоритм декодирования:

Чтобы убедиться в том, что все фильтры находятся в установившемся режиме и максимумы соответствующих частот определены, всегда производится 20 последовательных просчётов фильтра. Когда обработано достаточное число отсчётов, два максимума из «верхней» и «нижней» группы проверяются на достоверность по двум критериям. Первый критерий – оба максимальных значения должны превышать уровень шума. Второй критерий – незначительность отличия максимальных уровней друг от друга. Конечно, эти критерии могут быть расширены и дополнены с целью улучшения качества приёма относительно слабых сигналов.

В том случае, если сигнал удовлетворяет обоим условиям, обе частоты DTMF считаются достоверными. При этом, частоты могут быть признаны сигналами DTMF только по истечении определённого времени. Это осуществляется при помощи счётчика длительности, фиксирующего длительность сигнала. По достижении требуемой длительности, символ DTMF выбирается из таблицы исходя из двух частот, определяющих столбец и строку. Чтобы исключить повторное распознавание одного сигнала, при достижении требуемой длительности сигнала устанавливается соответствующий флаг, сигнализирующий о достоверности принятого символа.

При невыполнении одного из условий счётчик длительности декрементируется. Достижение счётчиком нуля интерпретируется как пауза между символами. Флаг при этом сбрасывается.

На рис. 21 показано графическое представление временнЫх параметров при распознавании сигнала DTMF:


Рис. 21: Временные параметры при распознавании сигнала DTMF

; Программа вычисления 8-ми цифровых фильтров-резонаторов
; для определения сигналов DTMF.
; Входной аналоговый сигнал оцифровывается на входе A4 
; с частотой отсчётов 3640 Гц
; Распознанные символы DTMF отображаются на ЖКИ
; Автор Robert Siwy, October 1997

FILTER_1    .equ    1                ;включить фильтр на 1633
FILTER_2    .equ    1                ;включить фильтр на 1477 
FILTER_3    .equ    1                ;включить фильтр на 1336
FILTER_4    .equ    1                ;включить фильтр на 1209
FILTER_5    .equ    1                ;включить фильтр на 941
FILTER_6    .equ    1                ;включить фильтр на 852
FILTER_7    .equ    1                ;включить фильтр на 770
FILTER_8    .equ    1                ;включить фильтр на 697


; Определения для используемой аппаратной части

STACK       .equ    400h
TCCTL       .equ    42h
TCPLD       .equ    43h
TCDAT       .equ    44h
BTCTL       .equ    40h
LCDCTL      .equ    30h
IE1         .equ    00h
IE2         .equ    01h
SCFI        .equ    50h
SCFQCTL     .equ    52h
WDTCTL      .equ    0120h
WDTCL       .equ    88h
WDTPW       .equ    05a00h
ACTL        .equ    0114h
PD          .equ    1000h
ADAT        .equ    0118h

; Программные определения 

DISPL       .equ    031h                ;Базовый адрес ЖКИ
LPM0        .equ    010h
LENGTH      .equ    7                ;(Length+1) * 5.48 мс = длительность сигнала THRE
            .equ    100                ; порог шума 
FLAG_REG    .equ    r4
LCOUNT      .equ    r5
ROW         .equ    r6                ; Строка «нижней» группы 
COL         .equ    r7                ; Столбец «верхней» группы
MAXLO       .equ    r8
IN          .equ    r9                ; Входной регистр
MAXHI       .equ    r10
OUT         .equ    r13
COUNT       .equ    r15
;******************************************************************************
; Распределение памяти для 8-ми фильтров
;******************************************************************************
                        .bss    T1_1633, 2
            .bss    T2_1633, 2
            .bss    T1_1477, 2
            .bss    T2_1477, 2
            .bss    T1_1336, 2
            .bss    T2_1336, 2
            .bss    T1_1209, 2
            .bss    T2_1209, 2
            .bss    T1_941, 2
            .bss    T2_941, 2
            .bss    T1_852, 2
            .bss    T2_852, 2
            .bss    T1_770, 2
            .bss    T2_770, 2
            .bss    T1_697, 2
            .bss    T2_697, 2
;******************************************************************************
; Программа 
;******************************************************************************
.text
INIT
            mov    #STACK-2,SP                ; инициализация стека 
            mov    #WDTPW+WDTCL,&WDTCTL     ; остановить сторожевой таймер 
; Инициализация MCLK
            mov.b    #102-1,&SCFQCTL            ;102*32.768Hz=3,342MHz
            bis.b    #008h,&SCFI0            ; Макс. частота 3MHz
; Инициализация ЖКИ/очистка памяти ЖКИ
CLRSCR
            mov    #11,r5
            clr1
            clr.b    DISPL-1(r5)
            dec    r5
            jnz    clr1
            mov.b    #017h,&BTCTL            ; Тактирование ЖКИ
            mov.b    #0ffh,&LCDCTL            ; Генератор ЖКИ
; Инициализация АЦП
            mov    #04912h,&ACTL            ; Инициализация АЦП, 
; внутренний ИОН 
            bis.b    #004h,&IE2                ; разрешить прерывания от АЦП
; Инициализация 8-битного таймера
            mov.b    #100h-9,&TCPLD            ;счёт до 9 тактов  ACLK=274 мкс
            mov.b    #000h,&TCDAT            ; загрузка счётчика
            mov.b    #068h,&TCCTL            ; Инициализация 8-битного таймера
            mov.b    #008h,&IE1                ; разрешить прерывания от таймера 
            eint
            bis.b    #LPM0,SR                ; выкл. CPU 

DTMF_FILTER
            inc    COUNT
            cmp    #20,COUNT                ;20 отсчётов принято?
            jlo    FILTER                ; нет
; проверка 1-го условия
            cmp    #THRE,MAXLO            ;Максимум для «нижней» группы 
; ниже порога?
            jlo    FALSE                    ; да, выход
            cmp    #THRE,MAXHI            ; Максимум для «верхней» группы 
; ниже порога?
            jlo    FALSE                    ; да, выход
 ; проверка 2-го условия
            rra    MAXLO                ; разделить MAXLO на 2
            cmp    MAXLO,MAXHI            ;MAXHI > MAXLO/2
            jlo    FALSE                    ; да, выход
            rla    MAXLO                ; восстановить MAXLO
            rra    MAXHI                    ; разделить MAXHI на 2
            cmp    MAXHI,MAXLO            ;MAXLO > MAXHI/2
            jlo    FALSE                    ; да, выход
            cmp    #LENGTH,LCOUNT            ; длительность сигнала достаточна?
            jeq    DISPLAY                ; да, переход к отображению 
            inc    LCOUNT                ; нет, инкремент счётчика 
                                    ; длительности
            jmp    CONTINUE
DISPLAY
            bit    #01h,FLAG_REG            ; проверка флага
            jnz    CONTINUE                ; распознавание завершено 
            add    ROW,COL                ; суммировать строку 
                                    ; и столбец таблицы 
            mov.b    DTMF_Tab(COL),DISPL        ; отобразить символ DTMF
            bis    #01h,FLAG_REG            ; установить флаг
            jmp    CONTINUE
FALSE
            tst    LCOUNT
            jnz    FALSE1
            mov.b    #008h,DISPL+3            ; отобразить паузу 
            mov.b    #008h,DISPL+4            ; " "
            bic    #01h,FLAG_REG            ; очистить флаг
            jmp    CONTINUE
FALSE1
            dec    LCOUNT
CONTINUE
            clr    MAXHI
            clr    MAXLO
clr    COUNT
FILTER
            mov    &ADAT,IN                ; Отсчёт ? r9/IN
            sub    #01fffh,IN                ; сформировать значение со знаком
            rla    IN                    ;*2
            rla    IN                    ;*2
            .if FILTER_1
FILTER_1633
            mov    T2_1633,r12                ;N11=T2/4-T1
            mov    r12,r13
            rra    r12
            rra    r12
            sub    T1_1633,r12                ;N11 в r12
            mov    r12,r14                    ;N11*2*alpha-T2
            rra    r12
            rra    r12
            rra    r12
            mov    r12,r11
            rra    r12
            add    r12,r11
            sub    r13,r11                    ;N15 в r11
            mov    r11,T2_1633                ;N3=N15/4-N11
            rra    r11
            rra    r11
            sub    r14,r11                    ;N3 в r11

; Общая согласующая цепь с потерями 
; требуется N3 в r11
;1/n1=32, gamma_2=-1+1/32)
;n1*gamma_1=1/32
            mov    r11,r13                    ; сохранить N3 в r13
            mov    IN,r12                    ;T1=N3*gamma_2+n1*gamma_1*IN
            rra    r12
            rra    r12
            rra    r12
            rra    r12
            rra    r12                    ;n1*gamma_1*IN in r12
            sub    r11,r12
            rra    r11
            rra    r11
            rra    r11
            rra    r11
            rra    r11
            add    r11,r12                    ;T1 в r12
            mov    r12,T1_1633                ;сохранить T1 в ОЗУ 
            rla    r13                     ;N3 * 32
            rla    r13
            rla    r13
            rla    r13
            rla    r13
            rla    r12                    ;T1 * 32
            rla    r12
            rla    r12
            rla    r12
            rla    r12
            sub    IN,r12
            add    r12,OUT                ;В r13 выходное значение 

;*************************************
            cmp    OUT,MAXHI                ; Сравнить выходное  значение
                                    ;  с максимумом
            jge    SWAP1
            mov    OUT,MAXHI                ; замена максимума 
            mov    #03,COL                ; столбец =  3
SWAP1 ;************************************
;окончание согласующей цепи
FILTER_1633_END
            endif
            if FILTER_2
FILTER_1477
            mov    T2_1477,r12                ; N11=T/2-T1
            mov    r12,r13
            rra    r12
            sub    T1_1477,r12                ;N11 в r12
            mov    r12,r14                    ;N15=N11*2*alpha-T2
            rra    r12
            rra    r12
            mov    r12,r11
            rra    r12
            rra    r12
            add    r12,r11
            rra    r12
            add    r12,r11
            sub    r13,r11                    ;N15 в r11
            mov    r11,T2_1477                ;N3=N15/2-N11
            rra    r11
            sub    r14,r11                    ;N3 в r11

; Общая согласующая цепь с потерями 
; требуется N3 в r11
;1/n1=32, gamma_2=-1+1/32)
;n1*gamma_1=1/32
            mov    r11,r13                    ; сохранить N3 в r13
            mov    IN,r12                    ;T1=N3*gamma_2+n1*gamma_1*IN
            rra    r12
            rra    r12
            rra    r12
            rra    r12
            rra    r12                     ;n1*gamma_1*IN в r12
            sub    r11,r12
            rra    r11
            rra    r11
            rra    r11
            rra    r11
            rra    r11
            add    r11,r12                    ;T1 в r12
            mov    r12,T1_1477                ;сохранить T1 в ОЗУ
            rla    r13                    ;N3 * 32
            rla    r13
            rla    r13
            rla    r13
            rla    r13
            rla    r12                    ;T1 * 32
            rla    r12
            rla    r12
            rla    r12
            rla    r12
            sub    IN,r12
            add    r12,OUT                ; В r13 выходное значение 
;************************************
cmp    OUT,MAXHI                ; Сравнить выходное  значение
;  с максимумом

            jge    SWAP2
            mov    OUT,MAXHI                ; замена максимума
            mov    #02,COL                ; столбец =  2
SWAP2 ;************************************
; окончание согласующей цепи
FILTER_1477_ENDE
            .endif
            .if FILTER_3
FILTER_1336
            mov    T2_1336,r12                ;N11=T2-T1
            mov    r12,r13
            sub    T1_1336,r12                ;N11 в r12
            mov    r12,r14                    ;N15=N11*alpha-T2
            rra    r12
            rra    r12
            mov    r12,r11
            rra    r12
            rra    r12
            add    r12,r11
            rra    r12
            rra    r12
            add    r12,r11
            sub    r13,r11                    ;N15 в r11
            mov    r11,T2_1336
            sub    r14,r11                    ;N3=N15-N11 в r11
; Общая согласующая цепь с потерями 
; требу    ется N3 в r11
;1/n1=32, gamma_2=-1+1/32)
;n1*gamma_1=1/32
            mov    r11,r13                    ;сохранить N3 в r13
            mov    IN,r12                    ;T1=N3*gamma_2+n1*gamma_1*IN
            rra    r12
            rra    r12
            rra    r12
            rra    r12
            rra    r12                    ;n1*gamma_1*IN в r12
            sub    r11,r12
            rra    r11
            rra    r11
            rra    r11
            rra    r11
            rra    r11
            add    r11,r12                    ;T1 в r12
            mov    r12,T1_1336                ; сохранить T1 в ОЗУ
            rla    r13                     ;N3 * 32
            rla    r13
            rla    r13
            rla    r13
            rla    r13
            rla    r12                    ;T1 * 32
            rla    r12
            rla    r12
            rla    r12
            rla    r12
            sub    IN,r12
            add    r12,OUT                ; В r13 выходное значение 
;******************************************
cmp    OUT,MAXHI                ; Сравнить выходное  значение
;  с максимумом
            jge    SWAP3
            mov    r13,MAXHI                ; замена максимума
            mov    #01,COL                ; столбец =  1
SWAP3 ;************************************
; окончание согласующей цепи
FILTER_1336_ENDE
            .endif
            .if FILTER_4
FILTER_1209
            mov    T2_1209,r13                ;N1=(T1-T2)*alpha
            mov    T1_1209,r11
            mov    r11,r14
            sub    r13,r11
            rra    r11                    ;N1 в r11
            mov    r11,r12                    ;N3=N1-T2
            sub    r13,r11                    ;N3 в r11
            sub    r14,r12                    ;N2=N1-T1 в r12
            mov    r12,T2_1209

; Общая согласующая цепь с потерями 
; требу    ется N3 в r11
;1/n1=32, gamma_2=-1+1/32)
;n1*gamma_1=1/32
            mov    r11,r13                    ; сохранить N3 в r13
            mov    IN,r12                    ;T1=N3*gamma_2+n1*gamma_1*IN
            rra    r12
            rra    r12
            rra    r12
            rra    r12
            rra    r12                    ;n1*gamma_1*IN в r12
            sub    r11,r12
            rra    r11
            rra    r11
            rra    r11
            rra    r11
            rra    r11
            add    r11,r12                    ;T1 в r12
            mov    r12,T1_1209                ; сохранить T1  в ОЗУ
            rla    r13                     ;N3 * 32
            rla    r13
            rla    r13
rla    r13
rla    r13
rla    r12                    ;T1 * 32
rla    r12
rla    r12
rla    r12
rla    r12
sub    IN,r12
add     12,OUT                ; В r13 выходное значение
;******************************************
cmp    OUT,MAXHI                ; Сравнить выходное  значение
;  с максимумом
jge    SWAP4
mov    r13,MAXHI                ; замена максимума
mov    #00,COL                ; столбец =  0
SWAP4 ;************************************
; окончание согласующей цепи
FILTER_1209_ENDE
.endif
.if FILTER_5
FILTER_941
mov    T2_941,r13                ;N1=(T1-T2)*alpha
mov    T1_941,r12
mov    r12,r14
sub    r13,r12
rra    r12
rra    r12
rra    r12
rra    r12
rra    r12
mov    r12,r11
rra    r12
add    r12,r11
mov    r11,r12                    ;N1 в r11/r12
sub    r13,r11                    ;N3=N1-T2 в r11
sub    r14,r12                    ;N2=N1-T1
mov    r12,T2_941
; Общая согласующая цепь с потерями 
; требу    ется N3 в r11
;1/n1=32, gamma_2=-1+1/32)
;n1*gamma_1=1/32
mov    r11,r13                    ; сохранить N3 в r13
mov    IN,r12                    ;T1=N3*gamma_2+n1*gamma_1*IN
rra    r12
rra    r12
rra    r12
rra    r12
rra    r12                    ;n1*gamma_1*IN в r12
sub    r11,r12
rra    r11
rra    r11
rra    r11
rra    r11
rra    r11
add    r11,r12                    ;T1 в r12
mov    r12,T1_941                ; сохранить T1 в ОЗУ
rla    r13                     ;N3 * 32
rla    r13
rla    r13
rla    r13
rla    r13
rla    r12                    ;T1 * 32
rla    r12
        rla    r12
rla    r12
rla    r12
sub    IN,r12
add    r12,OUT                ; В r13 выходное значение
;******************************************
cmp    OUT,MAXLO                ; Сравнить выходное  значение
;  с максимумом
jge    SWAP5
mov    r13,MAXLO                ; замена максимума
mov    #012,ROW                ; строка = 12
SWAP5 ;************************************
; окончание согласующей цепи
FILTER_941_ENDE
.endif
.if FILTER_6
FILTER_852
mov    T2_852,r11                ;N1=(T2-T1)*alpha
mov    r11,r12
mov    T1_852,r13
sub    r13,r12
rra    r12    
rra    r12
rra    r12
rra    r12
mov    r12,r14
rra    r12
add    r12,r14                    ;N1 в r14
add    r14,r11                    ;N3=T2+N1 в r11
add    r14,r13                    ;N2=T1+N1
mov    r13,T2_852
; Общая согласующая цепь с потерями 
; требу    ется N3 в r11
;1/n1=32, gamma_2=-1+1/32)
;n1*gamma_1=1/32
mov    r11,r13                    ; сохранить N3 в r13
mov    IN,r12                    ;T1=N3*gamma_2+n1*gamma_1*IN
rra    r12
rra    r12
rra    r12
rra    r12
rra    r12                    ;n1*gamma_1*IN в r12
sub    r11,r12
rra    r11
rra    r11
rra    r11
rra    r11
rra    r11
add    r11,r12                    ;T1 в r12
mov    r12,T1_852                ; сохранить T1 в ОЗУ
rla    r13                    ;N3 * 32
rla    r13
rla    r13
rla    r13
rla    r13
rla    r12                    ;T1 * 32
rla    r12
rla    r12
rla    r12
rla    r12
sub    IN,r12
add    r12,OUT                ; В r13 выходное значение
;******************************************
cmp    OUT,MAXLO                ; Сравнить выходное  значение
;  с максимумом

jge    SWAP6
mov    r13,MAXLO                ; замена максимума
mov    #08,ROW                ; строка = 8
SWAP6 ;************************************
; окончание согласующей цепи
FILTER_852_ENDE
.endif
.if FILTER_7
FILTER_770
mov    T2_770,r11                ;N1=(T2-T1)*alpha
mov    r11,r12
mov    T1_770,r13
sub    r13,r12
rra    r12
rra    r12
mov    r12,r14
rra    r12
rra    r12
rra    r12
rra    r12
sub    r12,r14                    ;N1 в r14
add    r14,r11                    ;N3=T2+N1 в r11
add    r14,r13                 ;N2=T1+N1
mov    r13,T2_770
; Общая согласующая цепь с потерями 
; требу    ется N3 в r11
;1/n1=32, gamma_2=-1+1/32)
;n1*gamma_1=1/32
mov    r11,r13                    ; сохранить N3 в r13
mov    IN,r12                    ;T1=N3*gamma_2+n1*gamma_1*IN
rra    r12
rra    r12
rra    r12
rra    r12
rra    r12                    ;n1*gamma_1*IN в r12
sub    r11,r12
rra    r11
rra    r11
rra    r11
        rra    r11
rra    r11
add    r11,r12                    ;T1 в r12
mov    r12,T1_770                ;сохранить T1 в ОЗУ
rla    r13                     ;N3 * 32
rla    r13
rla    r13
rla    r13
rla    r13
rla    r12                    ;T1 * 32
rla    r12
rla    r12
rla    r12
rla    r12
sub    IN,r12
add    r12,OUT                ; В r13 выходное значение
;******************************************
cmp    OUT,MAXLO                ; Сравнить выходное  значение
; с максимумом
jge    SWAP7
mov    r13,MAXLO                ; замена максимума
mov    #04,ROW                ; строка = 4
SWAP7 ;************************************
; окончание согласующей цепи
FILTER_770_ENDE
.endif
.if FILTER_8
FILTER_697
mov    T2_697,r11
mov    r11,r12
mov    T1_697,r13
sub    r13,r12
rra    r12
rra    r12
mov    r12,r14
rra    r12
add    r12,r14
rra    r12
rra    r12
rra    r12
sub    r12,r14                    ;N1 в r14
add    r14,r11                    ;N3=T2+N1 в r11
add    r14,r13
mov    r13,T2_697
; Общая согласующая цепь с потерями 
; требу    ется N3 в r11
;1/n1=32, gamma_2=-1+1/32)
;n1*gamma_1=1/32
mov    r11,r13                    ;сохранить  N3 в r13
mov    IN,r12                    ;T1=N3*gamma_2+n1*gamma_1*IN
rra    r12
rra    r12
rra    r12
rra    r12
rra    r12                    ;n1*gamma_1*IN в r12
sub    r11,r12
rra    r11
rra    r11
rra    r11
rra    r11
rra    r11
add    r11,r12                    ;T1 в r12
mov    r12,T1_697                ; сохранить T1 в ОЗУ
rla    r13                     ;N3 * 32
rla    r13
rla    r13
rla    r13
rla    r13
rla    r12                    ;T1 * 32
rla    r12
rla    r12
rla    r12
rla    r12
sub    IN,r12
add    r12,OUT                ; В r13 выходное значение
;******************************************
cmp    OUT,MAXLO                ; Сравнить выходное  значение
; с максимумом
jge    SWAP8
mov    OUT,MAXLO                ; замена максимума
mov    #00,ROW                ; строка = 0
SWAP8 ;************************************
; окончание согласующей цепи
FILTER_697_ENDE
.endif
FILTER_ENDE
bis.b    #LPM0,SR                ; откл. CPU
br    #DTMF_FILTER

;****************************************************************
; Прерывание 8-битного таймера
;****************************************************************
TIM_8B
bic    #PD,&ACTL                ; вкл. АЦП
bis    #001h,&ACTL                ; старт преобразования
reti

;****************************************************************
; Прерывание АЦП
;****************************************************************
AD_INT
bis    #PD,&ACTL                ; АЦП выл. 
bic    #0f0h,0(SP)                ; активный режим по выходу ? стек 
reti

;****************************************************************
; Определения ЖКИ
;****************************************************************
LCD_TYPE
a         .equ    01h
b         .equ     02h
c         .equ     10h
d         .equ     04h
e         .equ     80h
f         .equ     20h
g         .equ     08h
h         .equ     40h
;****************************************************************
; Таблица ЖКИ для символов DTMF
;****************************************************************
DTMF_Tab
.byte     b+c                     ; отображает"1"
.byte     a+b+d+e+g                 ; отображает "2"
.byte     a+b+c+d+g                 ; отображает "3"
.byte     a+b+c+e+f+g                 ; отображает "A"
.byte     b+c+f+g                 ; отображает "4"
.byte     a+c+d+f+g                 ; отображает "5"
.byte     a+c+d+e+f+g                 ; отображает "6"
.byte     c+d+e+f+g                 ; отображает "B" 
.byte     a+b+c                     ; отображает "7"
.byte     a+b+c+d+e+f+g             ; отображает "8"
.byte     a+b+c+d+f+g                 ; отображает "9"
.byte     a+d+e+f                 ; отображает "C"
.byte     a+d+e+f+g                 ; отображает "E"
.byte     a+b+c+d+e+f                 ; отображает "0"
.byte     a+e+f+g                 ; отображает "F"
.byte     b+c+d+e+g                 ; отображает "D"

;****************************************************************
; Таблица векторов прерываний
;****************************************************************
.sect    "Int_Vect" ,0ffe0h
.word    INIT                     ; Порт0, биты от 2 до 7
.word    INIT                    ; Базовый таймер Basic Timer
.word    INIT                    ; нет источника
.word    INIT                    ; нет источника
.word    INIT                    ; таймер-порт Timer Port
.word    AD_INT                ; завершение преобразования АЦП
.word    INIT                    ; нет источника
.word    INIT                    ; нет источника
.word    INIT                    ; нет источника
.word    INIT                     ; нет источника
.word    INIT                     ; Watchdog/Timer, режим Timer
.word    INIT                    ; нет источника
.word    TIM_8B                ; 8-битный таймер Timer (P0.0 Int)
.word    INIT                    ; Порт0.0
.word    INIT                    ; NMI, срыв генерации
.word    INIT                     ; POR, внеш. Reset, Watchdog

9 Аппаратная часть

Преобразование аналоговых сигналов в цифровые осуществляется при помощи АЦП, встроенного в MSP430C25x. Источник опорного напряжения выведен на ножку SVCC. Оно может быть подано снаружи, либо в качестве ИОН можно использовать напряжение питания контроллера (VDD). Таким образом, 14-битный диапазон соответствует диапазону напряжений от 0 до SVCC. Рабочее напряжение должно быть 5В, т.к. выбрана максимальная тактовая частота процессора 3.3 МГц(прим. перев. – на момент перевода макс. частота семейства – 8МГц, а макс. рабочее напряжение 3,6В). Если это же напряжение используется в качестве опорного для АЦП и подключено встроенным ключом к выводу SVCC, то можно обойтись без внешнего ИОН. Один МЗР, таким образом, соответствует величине 0.305 мВ. Доступные в продаже коммерческие приёмники DTMF принимают сигнал в диапазоне от +1 дБм (600?) до -31 дБм(600?). Это соответствует амплитуде сигнала от 1.230В до 30.8 мВ. Исходя из этого, разрешение наименьшего входного напряжения составляет не менее 100 МЗР. Если всё же требуется работа с более слабыми входными сигналами, к выводу SVCC следует подключать внешний ИОН. Конденсатор (C1) фильтрует помехи от внешнего или внутреннего ИОН. Для вычисления компонентов цифрового фильтра требуются значения со знаком, не поддерживаемые имеющимся АЦП. По этой причине, аналоговый вход смещён резистивным делителем (R1/R2) на величину SVCC/2, а входной сигнал подаётся через разделительный конденсатор C2. Численное значение SVCC/2 позже вычитается из каждого входного отсчёта. Если установившееся выходное значение АЦП численно равно 01fffh при разрешении в 14 бит, то оно будет равно напряжению SVCC/2, и остаток от вычитания значения SVCC/2 будет 01fffh-01fffh=0000h. Положительный входной сигнал, следовательно, будет соответствовать положительным численным значениям и наоборот. Развязывающий конденсатор C2 вкупе с резисторами R3 + ( R1 || R2 ) формируют ФВЧ. С учётом того, что частота среза выбрана примерно в 200 Гц, помехи с более низкой частотой, например сетевые, будут подавлены. Вход АЦП защищён от перенапряжения резистором R3 и стабилитроном D1. Принципиальная схема приведена на рис. 22:


Рис. 22: Принципиальная схема подключения сигналов к АЦП

Так как разрядность измеряемого значения ограничена 14-ю битами, в то время, как обработка в ЦПУ производится с 16-ти битной разрядностью, перед вычислениями значения отсчётов сдвигаются влево дважды, что соответствует умножению на 4. Благодаря такому масштабированию, улучшается динамический диапазон и уменьшается шум, вносимый при округлении в процессе умножения.

10 Измерения и результаты

На рис. 23 показана длительность процесса фильтрования в пределах периода квантования. Канал 1 представляет прерывания АЦП; по каждому прерыванию выводится сигнал на выход порта. Канал 2 показывает длительность процесса вычисления фильтров; в начале процесса в порт выводится лог. «1», по завершению алгоритма – лог. «0».

Как видно из рисунка, алгоритм занимает всего 55% доступного времени. Системная частота равна 3.3 МГц. Длительность такта при этом около 300 нс. Таким образом. доступно 915 тактов на период квантования. 474 такта требуются для выполнения 359 инструкций. Следовательно, результирующая вычислительная мощность равна 2.53 MIPS. В результате использования большого количества инструкций типа «регистр-регистр», в среднем требуется только 1.32 цикла на инструкцию.

Даже с учётом высокой вычислительной мощности, потребляемый устройством ток всего около 1.8 мА.

Программа занимает примерно 1КБ ПЗУ и требует 32 байта ОЗУ.


Рис. 23: Длительность вычисления фильтров

11 Заключение

Вычисления в системах реального времени требуют высокой вычислительной мощности, поэтому для таких целей часто используют цифровые сигнальные процессоры (DSP). Применение MSP430 в такой задаче для вычисления цифровых фильтров не является традиционным, в частности из-за того, что операции умножения осуществляются без использования аппаратного умножителя. Тем не менее, MSP430 является подходящим выбором в тех случаях, когда требуется распознавание частот в массиве цифровых отсчётов, а вычисленные значения не требуется выводить при помощи ЦАП. В MSP430 имеется в наличии высокопроизводительный АЦП. Его разрешение 14 бит гарантирует широкий динамический диапазон при вычислениях.

В нашем примере частоты с входными уровнями от 25 мВ RMS до 1.5 В RMS обрабатываются без проблем. Динамический диапазон при этом превышает 35 дБ, что позволяет избавиться от внешних приёмников DTMF. Так как 14-битный АЦП имеет теоретический динамический диапазон 84 дБ, есть возможность дальнейшего расширения динамического диапазона в обе стороны. Одним из способов является использование внешнего ИОН.

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

Расчёт и реализация восьми узкополосных полосовых фильтров, описанные в данном примере, демонстрируют:

  • Возможность использования MSP430 и встроенного АЦП для задач фильтрации в режиме реального времени;
  • Прекрасные свойства цифровых фильтров-резонаторов;
  • Эффективность на уровне 1.32 цикла на инструкцию, возможную благодаря RISC-архитектуре процессора и ортогональности набора команд;
  • Для 8-ми фильтров DTMF может быть достаточно 359 инструкций.