Формирование сигналов специальной формы. Табличный метод генерации. Метод аппроксимации. Приёмы масштабирования, страница 2

Данная аппроксимация точна для любого значения аргумента от 0о до 90о (первый квадрант), т.е. для 0<x<0.5.  Т.к. sin(-j) = -sin(j) и  sin(j) = sin (180o - j), синус любого угла можно выразить через синус угла первого квадранта. Границы квадрантов показаны на рисунке 5.1.

p/2

 0x4000     0x3FFF

0x7FFF             2               1          0x0000

p                                           0

0x8000                                         0xFFFF

3                4

0xBFFF     0xC000   

-p/2

Рисунок 5.1. Масштабированные значения аргументов

Те же сведения о взаимном соответствии аргументов числовой оси j, x и AX0, выраженных, соответственно в градусах, дробном и 16-ричном форматах, представлены ниже для интервала одного периода:

-180O

-90O

0O

90O                    180O

-1

-0.5

0

0.5                       1.0

8000                BFFF

C000                FFFF

0000                 3FFF

4000                 7FFF

Таким образом, в этой задаче мы встречаемся с масштабированием как для аргумента  x с коэффициетом p, так и для функции с коэффициентом 8.

Цифровой генератор гармонического сигнала

Подпрограмма SINE.DSP, реализующая  данную аппроксимацию, приведена в файле Описание_ЛР5.docв приложении. Она принимает входные значения x в формате 1.15. Коэффициенты многочлена по абсолютной величине достигают величины 5.325196. Для их представления в программе выбран формат 4.12, допускающий диапазон представления чисел -8...8. Такое масштабирование позволяет отобразить диапазон значений, в котором находятся коэффициенты многочлена.

Подпрограмма читает масштабированное входное значение x из регистра АX0. Это значение модифицируется для перевода в первый квадрант. Если значение находится во втором или четвертом квадрантах (бит 14 входного значения равен 1), перемена знака (или инвертирование)  переводит значение в первый или третий квадрант, соответственно.

Знаковый разряд затем сбрасывается для того, чтобы получить значение в первом квадранте; оно сохраняется в регистре AR.

Функция синус вычисляется путем умножения увеличивающихся степеней входного значения х на соответствующие коэффициенты. Квадрат аргумента вычисляется и сохраняется в MF, в то время, как сохраненный первый коэффициент загружается из памяти данных. Первый член аппроксимации сохраняется в регистре MR (в котором результат накапливается) параллельно с загрузкой второго коэффициента. В цикле approx вычисляется следующий член апроксимации и добавляется к предыдущему результату в MR; затем инструкция умножения загружает следующий коэффициент и формирует одновременно следующую степень аргумента x.??

Поскольку при вычислениях использованы коэффициенты в формате 4.12, необходима инструкция сдвига для масштабирования результата в формат 1.15. После этого результат проверяется на переполнение. Если значение в регистре SR1 превышает 0х7FFF,  программа выполняет операцию насыщения до максимального положительного значения 0х7FFF, которое читается из регистра AY0. Затем, если необходимо, восстанавливается знаковый разряд. Если входной аргумент (сохраненный в АX0) отрицательный, результат тоже должен быть отрицательным.

Подпрограмма содержит новую директиву Ассемблера .GLOBAL. Она делает метку sin: видимой для других программ (особенно для главной программы), для использования в вызовах подпрограмм или переходов внутри программного модуля. Подпрограмма читает масштабированное входное значение x из регистра АX0. Это значение модифицируется для перевода в первый квадрант. Если значение находится во втором или четвертом квадрантах (бит 14 входного значения равен 1), перемена знака (или инвертирование) переводит значение в первый или третий квадрант, соответственно.

Знаковый разряд затем сбрасывается для того, чтобы получить значение в первом квадранте, которое сохраняется в регистре AR..

На вычисление одного значения синуса требуется 25 циклов. При тактовой частоте процессора  12,5 МГц  одно значение синуса вычисляется за 2 мкс.

Главная программы MAIN, использующая подпрограмму sine, вычисляет одно значение sin(p/2). Она содержит директиву Ассемблера .EXTERN для связи подпрограммы и главной программы. Эта директива присваивает атрибут метке sin: как внешней, объявленной в другом модуле с использованием директивы .GLOBAL. Поэтому возникает возможность вызывать подпрограмму sine из главной программы. Так как исходный параметр, нужный этой подпрограмме, извлекается из регистра АX0, его приходится инициализировать перед вызовом подпрограммы. В регистре АX0 установлено значение аргумента 0х4000, которое соответствует углу p/2. После возврата из подпрограммы вычисленное значение синуса будет находиться в регистре AR в формате 1.15.

В заключение выполните программу. Убедитесь, что в регистре AR возникает корректное значение синуса p/2. Проверьте результаты работы программы ещё для нескольких значений аргумента как в первом, так и в других квадрантах.