
110302_Исследование эффектов ограничения разрядной сетки при цифровой обработке сигналов
.pdfтехники связи). В процессе аналого-цифрового преобразования производится дискретизация преобразуемого сигнала во времени с частотой FД , называемой частотой дискретизации.
Результатом аналого-цифрового преобразования является последовательность цифровых отсчетов, следующих с интервалом дискретизации ТД = 1/ FД , при этом каждый отсчет представлен N битами (определяется разрешающей способностью аналого-цифрового преобразователя).
Если в процессе обработки сигнала не предполагается использование экстраординарных (>100 дБ) значений динамического диапазона, обработка обычно осуществляется без приведения к форме с плавающей точкой. Технология обработки сигналов в формате с плавающей точкой обладает рядом существенных отличий по отношению к технологии обработки с фиксированной точкой и в настоящем курсе подробно не рассматривается.
Форматы представления двоичных чисел
Представление чисел в формате с фиксированной точкой предполагает договоренность о положении точки; при этом сама точка в символьном представлении числа не фигурирует и при выполнении операций не используется.
Процессоры семейства ADSP-21ХХ поддерживают следующие форматы представления чисел:
-целочисленный беззнаковый;
-целочисленный знаковый;
-дробный знаковый;
-дробный беззнаковый.
Целочисленное беззнаковое представление двоичных чисел длиной N бит приписывает младшему разряду (крайнему правому) вес 20 = 1, а старшему (крайнему левому) – вес 2N-1, таким образом, в ячейке памяти данных процессора или в любом 16-разрядном регистре могут быть представлены числа в диапазоне от 0 до 65535.
Целочисленный знаковый формат |
представления |
приписывает |
крайнему левому (старшему) разряду вес |
минус 2N-1, и |
этот разряд |
позиционируется как знаковый. При таком формате в 16-разрядной сетке могут быть представлены числа в диапазоне от минус 32768 до плюс 32767.
10
Таким образом, отрицательные числа в старшем разряде, знаковом, содержат единичное значение; такой формат называют представлением в дополнительном коде. Операции сложения и вычитания (выполняемые по правилам действий над целыми положительными числами) над знаковыми числами, представленными в дополнительном коде, дают правильный результат. Если в результате операции формируется отрицательное число, то оно оказывается представленным в дополнительном коде.
Изменение знака числа (при знаковом представлении) соответствует инверсии всех разрядов и прибавлению единицы к младшему разряду (с учетом межразрядных переносов).
Так, например, число 10 (десятичное) представляется в 16-разрядной сетке как 0000 0000 0000 1010 = +1010
Число минус 10 (десятичное) формируется инверсией всех разрядов с прибавлением единицы:
|
0000 0000 0000 1010 |
= X = +1010 |
|
|
1111 1111 1111 0101 |
= инверсия X |
|
+ |
|
1 |
|
|
1111 1111 1111 0110 |
= инверсия X + 1 = – X = – 1010 |
Нетрудно убедиться, что сумма чисел плюс 10 и минус 10 будет равна нулю: при этом разряд, выпадающий влево за пределы знакового, следует игнорировать при выполнении операций. Эффект перегрузки (переполнения) разрядной сетки в этом случае будет рассмотрен далее.
Дробный знаковый формат представления двоичных чисел (называемый также форматом вида 1.15) приписывает крайнему левому (старшему) разряду вес минус 20, а следующему за ним разряду – вес 2-1, крайнему правому разряду соответствует вес 2-15. Аналогично целому знаковому, крайний левый разряд позиционируется как знак.
Таким образом, в рамках 16-разрядной сетки могут быть представлены числа в диапазоне от минус 1 до плюс (1- 2-15). Такой формат наиболее часто используется для представления значений отсчетов оцифрованного сигнала. Удобство такого представления наглядно демонстрируется анализом результатов операций умножения.
11
Дробный беззнаковый формат приписывает старшему (крайнему левому) разряду числа вес плюс 20 (в отличие от знакового). В этом формате в рамках 16-разрядной сетки могут быть представлены числа от 0 до (2 - 2- 15).
Характерно, что формат представления числа является только его интерпретацией и при разработке программы должен учитываться разработчиком.
Так, рассмотренное ранее число минус 1010 = 1111 1111 1111 01102 в беззнаковом формате может интерпретироваться как 6552610
(2 16 – 1) – 9 = 2 16 – 10 = 65536 – 10 = 6552610 , в знаковом дробном может интерпретироваться как минус 0,000305210
– 2 0 + ((2 15 – 1) – 9) / 2 15 = (– 2 15 + 2 15 – 10) / 2 15 = – 10 / 2 15 =
=– 10 / 32768 ≈ – 0,000305210,
ав беззнаковом дробном может интерпретироваться как 1,999694810
2 0 + ((2 15 – 1) – 9) / 2 15 = (2 15 + 2 15 – 10) / 2 15 = (2 16 – 10) / 2 15 = = 65526 / 32768≈ 1,999694810.
Коэффициент пересчета чисел, представленных в дробном формате, в целочисленный, составляет, таким образом, 2 15 = 32768.
Эффекты и признаки переполнения (перегрузки) разрядной сетки результатом операции
Элементарная арифметическая операция (сложения или вычитания), проведенная над операндами разрядностью N бит, требует для корректного представления результата расширения разрядной сетки на 1 бит. Бит, выходящий за пределы разрядной сетки арифметико–логического устройства процессора, называется переносом. Он помещается процессором в регистр ASTAT как бит переноса АС.
При выполнении элементарных операций над числами, представленными в беззнаковом формате, значение бита АС может служить индикатором переполнения разрядной сетки АЛУ.
При выполнении элементарных операций над знаковыми числами бит АС не может служить индикатором переполнения разрядной сетки.
Переполнение разрядной сетки при выполнении элементарных операций над знаковыми числами фиксируется битом AV, единичное значение которого формируется в случае возникновения только одного из двух переносов – в знаковый разряд или из знакового разряда. В случае, если возникают оба
12
переноса, или не возникает ни одного из них, формируется нулевое значение бита AV, свидетельствующее о правильности результата операции.
Вычисление алгебраической суммы М чисел разрядностью N бит требует разрядной сетки длиной (N + log2M) бит.
Выполнение операции умножения процессорами семейства ADSP-21XX предполагает явное указание в синтаксисе команды типа каждого операнда: знакового – S или беззнакового – U. Переполнение знаковой разрядной сетки умножителя фиксируется на границе регистров MR1 и MR2 битом MV. Нулевое значение бита MV является индикатором корректного знакового представления результата в регистре МR1 и формируется, если в результате операции все биты регистра MR2 и старший (знаковый) бит регистра MR1 имеют одинаковое значение. Единичное значение бита MV свидетельствует о переполнении разрядной сетки представления результата в регистрах MR1, MR0.
6.ПРАВИЛА НАПИСАНИЯ ПРОГРАММ
ИПСЕВДОИНСТРУКЦИЙ НА ЯЗЫКЕ АССЕМБЛЕРА
Врамках настоящего описания степень подробности представления языка ассемблера приводится в объеме, минимально необходимом для выполнения лабораторного практикума. Транслятор языка ассемблера процессоров семейства ADSP-21ХХ имеет ряд дополнительных возможностей, направленных на создание существенных удобств для программиста; эти возможности в настоящем описании не рассматриваются, читатель может подробно ознакомиться с ними в [1].
Программа, создаваемая на языке ассемблера, обычно компонуется из модулей, — функционально законченных блоков, допускающих индивидуальную отладку. Файлы, содержащие модули программы или всю программу целиком, написанные на языке ассемблера ADSP-2181, должны иметь расширение .dsp.
Врезультате трансляции модулей программой-ассемблером создаются их объектные модули (имеющие расширение .obj) и листинги трансляции (имеющие расширение .lst). Отлаженные объектные модули специальной программой, называемой линковщиком, компонуются в исполняемый файл, предназначенный для загрузки в программу-симулятор; этот файл имеет расширение .ехе. Процесс компоновки называется редакцией связей или линковкой.
Если программа на языке ассемблера создается как единое целое (без деления на модули), она тем не менее рассматривается программой-
13

ассемблером как модуль и требует обязательного соответствующего оформления, а также последующих трансляции и линковки.
Текст модуля (или программы), написанный на языке ассемблера и подлежащий трансляции, должен быть ограничен в начале и в конце следующими псевдоинструкциями ассемблера:
. module/ram/abs = < начальный_адрес > < имя_модуля > ;
Текст программы, включающий другие псевдоинструкции ассемблера и коды команд процессора
. endmod;
Программа должна содержать псевдоинструкции ассемблера и команды процессора; каждая из этих конструкций должна заканчиваться символом « ; » точки с запятой.
Псевдоинструкции ассемблера используются программой-ассемблером на этапе трансляции для правильной компоновки модуля; они не создают исполняемых процессором команд и в большинстве случаев направлены на создание удобств при программировании. Псевдоинструкции ассемблера начинаются с символа « . » точки.
Ввиду большого объема внутренней (резидентной) памяти и высокой производительности процессора, позволяющих создавать программы весьма высокой сложности, не представляется реальной с психофизической точки зрения возможность успешного отслеживания размещения исходных данных и результатов промежуточных вычислений в памяти процессора. Для облегчения работы с константами и ячейками памяти (переменными) им могут быть приписаны символические имена подобно тому, как это делается в языках высокого уровня. Символическое имя представляет собой набор символов, содержащий заглавные и строчные буквы латинского алфавита, цифры и символы подчеркивания (Shift – ), начинающийся не с цифры и имеющий длину до 32 символов. Набор символов, составляющий символическое имя, может быть произвольным, однако существует некоторый набор зарезервированных слов, не допускающих использования в качестве символических имен. К ним относятся имена регистров, мнемокоды команд и псевдоинструкций ассемблера и ряд других слов, использование которых в программе в качестве символических имен будет вызывать ошибки при трансляции.
Константа задается в программе псевдоинструкцией
. const < имя_константы > = < значение > ;
14
Значение константы может быть задано как число в десятичной, двоичной или шестнадцатеричной системах счисления или в виде арифметического или логического выражения. Запись числа в двоичной системе счисления должна дополняться префиксом B#, а в шестнадцатеричной — префиксом 0х. Числа, записанные без префикса, интерпретируются ассемблером как десятичные; они могут быть записаны без знака или со знаком минус.
По умолчанию заглавные и строчные буквы символических имен и мнемокодов команд воспринимаются транслятором одинаково, однако при желании можно заставить транслятор воспринимать их как разные символы. Обращение к константе в программе осуществляется непосредственно по имени. Например:
. const koefficient_1 = - 36 + 1024;
. const vhod = 0xA3C; ax0 = koefficient_1; ar = vhod;
Имя переменной (ячейки памяти) задается в программе псевдоинструкцией: - для ОЗУ данных:
. var/dm |
< имя_переменной > ; |
- для ОЗУ программ: |
|
. var/pm |
< имя_переменной > ; |
Каждая переменная может принимать начальное значение, которое ей присваивается при каждом рестарте процессора; начальное значения присваивается псевдоинструкцией
. init |
< имя_переменной > : < значение > ; |
Обращение к переменной в программе осуществляется по имени с указанием типа ОЗУ (dm — ОЗУ данных, pm — ОЗУ программ), в котором эта переменная организована, например, такой фрагмент программы:
. var/dm koef_alfa;
. init koef_alfa: 0хA348; ar = dm(koef_alfa); ar = ar + 1; dm(koef_alfa) = ar;
увеличит на 1 содержимое ячейки с символическим именем koef_alfa, организованной в памяти данных.
15
В ряде случаев бывает удобным представление переменных в виде массивов из нескольких ячеек памяти; в этом случае при объявлении имени переменной должен быть в квадратных скобках указан размер массива, а начальные значения его ячеек задаются псевдоинструкцией .init через запятые, например:
. var/dm massiv_1[5];
. init massiv_1: -3, B#0000101001011110, 0x287C, 0, 0;
Обращение к элементам массива осуществляется по имени с указанием смещения относительно начала массива. Так, например, в результате выполнения фрагмента программы:
ax0 = dm(massiv_1); ay0 = dm(massiv_1 + 2); ar = ax0 + ay0;
dm (massiv_1 + 1) = ar;
в регистр AX0 будет записано число минус 3, в регистр AY0 — число 0х287С, а в первую по номеру (но вторую по счету) ячейку массива будет записана их сумма 0х2879.
В ряде случаев представляется удобной инициализация массива (занесение начальных значений в его ячейки) из файла данных, хранящегося на носителе компьютера; такая инициализация может быть осуществлена с помощью псевдоинструкции
. init |
< имя_массива > : <имя_файла> ; |
при этом начальные значения, подлежащие загрузке в массив, должны быть записаны в файле «в столбик» в кодировке ASCII в шестнадцатеричной системе счисления.
Из внешнего файла может быть также включен в программу любой фрагмент, например, список констант или переменных; такое включение реализуется псевдоинструкцией.
. inсlude < имя_файла >;
Псевдоинструкция .inсlude включает текст указанного в угловых скобках файла в текст основного файла при трансляции модуля.
16

В целях повышения наглядности и удобочитаемости программы в ее текст полезно включать комментарии. Комментарии не транслируются и не оказывают влияния на характеристики (объем и быстродействие) загружаемого модуля программы. Комментарии размещаются в тексте программы между командами или между псевдоинструкциями ассемблера и должны заключаться либо в фигурные скобки, либо в символы « / * » и « * / » в следующем виде:
{ комментарий 1 } / * комментарий 2 */
В тексте комментариев допускается использование символов кириллицы. Вложенность комментариев одного типа не допускается.
Пример использования комментариев:
{
Эта программа реализует функцию...
}
ar = dm(koef_beta); /* чтение значения beta */ ar = ar + 1; {увеличение его значения на 1}
7. ПРАВИЛА РАБОТЫ СО ЗВУКОВЫМ РЕДАКТОРОМ СoolЕdit96
Запуск программы
При запуске программы CoolEdit96 во входном выпадающем меню, представленном на рисунке 7.1, активировать позиции: 1) Save, External Clipboard Functionality and Sample Converting и 2) Amplify, Envelope, Channel Mixer and Normalize.
Рисунок 7.1 — Запуск программы
17

Формирование сигналов
Формирование отсчетов сигналов синусоидальной формы осуществляется по меню Generate | Tones. В выпадающем меню, изображенном на рисунке 7.2, указать:
Sample Rate = 8000 Гц
Mono
16 бит
— далее ОК.
Рисунок 7.2 — Формирование сигналов
18

В следующем выпадающем меню, изображенном на рисунке 7.3, установить режим:
Lock to These Settings Only
иуказать необходимые значения для генерируемого отрезка:
частота (Base Frequency)
уровень (dB Volume)
длительности (Duration)
—далее ОК.
Рисунок 7.3 — Генерация сигналов синусоидальной формы
Для изменения масштаба визуализации сигнала использовать Zoom In
(или Zoom Out).
Для сохранения сформированного файла выбрать File | Save As и в выпадающем меню указать директорию, в которой предполагается сохранение файла, а также его имя (ввести с клавиатуры) и тип (выбрать). При подготовке файлов к лабораторному практикуму рекомендуется выбрать тип файла ASCII Text Data.
19