Генерация и распознавание 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 инструкций.
|