Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Эрни Каспер Программирование на языке Ассемблер...doc
Скачиваний:
171
Добавлен:
09.11.2019
Размер:
955 Кб
Скачать
☆

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

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

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

Рассмотрим пример с усреднением по 8 выборкам сигнала, представ­ленным в двухбайтовом формате целыми положительными числами со значениями не более 2000h. Резервирование памяти для кольцевого буфера и для указателя производится директивами .RSECT

buf: DS 16

pbuf: DS 1

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

INC pbuf ;приращение указателя

ANL pbuf, #07h ; ограничение приращения

MOV A, pbuf ; для формирования адреса

RL А ; учет двухбайтового формата

ADD A, #buf ; формирование адреса в буфере

ХСН A, R0 ; загрузка адреса в регистр

MOV @R0, А ; запись мл. байта в буфер

INC R0 ; адрес для ст. байта

MOV A, R1

MOV @R0, А ; запись ст. байта в буфер

После обновления буфера можно суммировать все хранящихся в нем значения сигналов:

CLR А ; для накопления мл. байтов

MOV В, А ; для накопления ст. байтов

MOV R1, #8 ; для счета количества циклов

MOV R0, #buf ; для чтения из буфера

acum: ADD A, @R0 ; накопление мл. байтов

ХСН А, В

INC R0

ADDC A, @R0 ; накопление ст. байтов

ХСН А, В

INC R0

DJNZ Rl, acum ; на следующий цикл

MOV R2, А ; запоминание мл. байта суммы

ХСН А, В

MOV R3, А ; запоминание ст. байта суммы

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

CLR С

RRC А

ХСН А, В

ADD A, #4 ; округление перед делением

ANL A, #F8h ; очистка лишних разрядов

RRC А ; сумма разделена на 2

ХСН А, В

RRC A

ХСН А, В

RRC А ; сумма разделена на 4

ХСН А, В

RRC A

ХСН А, В

RRC А ; сумма разделена на 8

MOV R4, А ; мл. байт среднего значения

MOV R5, В ; ст. байт среднего значения

Программу вычисления суммы квадратов следует завершить досрочно по большому отклонению одной из выборок или по большой сумме квадратов.

MOV R6, #0 ; для накопления суммы квадратов

MOV R0, #buf ; адрес начала буфера

MOV R1, #8 ; количество данных в буфере

rms: CLR С ; для вычитания

MOV A, @R0 ; чтение мл. байта

SUBB A, R4 ; мл. байт разности

MOV В, А ; для возведения в квадрат

INC R0 ; адрес ст. байта

MOV A, @R0 ; чтение ст. байта

INC R0 ; адрес следующего сигнала

SUBB A, R5 ; ст. байт разности

JNC nmi ; переход по положительной разности

XRL В, #FFh ; для вычисления модуля

CPL А ; для вычисления модуля

ХСН А, В

ADD A, #1 ; модуль мл. байта

ХСН А, В

ADDC А, #0 ; модуль ст. байта

nmi: JNZ bad ; переход по разности больше 255

MOV А, В ; для возведения в квадрат

MUL АВ ; квадрат разности

JB 0V, bad ; переход по квадрату больше 256

ADD A, R6 ; сумма квадратов разности

JC bad ; переход по большой сумме квадратов

DJNZ Rl, rms ; на следующий цикл

SJMP ех ; на продолжение вычислений

bad: MOV R6, #255 ; насыщение суммы квадратов

ex: NOP ; для записи метки

В данном случае для накопления суммы квадратов используется только один байт, так как приемлемыми считаются серии измерений с малыми отклонениями. Поэтому при выходе отклонения одной выборки за преде­лы 15 или при заведомом выходе суммы за пределы 255 программа выходит из цикла и заносит в ячейку с оценкой суммы квадратов макси­мальное однобайтовое число.

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

Интересно сравнить этот алгоритм фильтрации с простым накопле­нием значения входного сигнала в течение 8 тактов. Приведенной про­грамме для получения первоначальной оценки требуется 8 тактов, а затем оценка выдается каждый такт с запаздыванием 8 тактов. При простом накоплении оценка будет выдаваться только один раз за 8 тактов с тем же запаздыванием. Но при этом нет необходимости запоминания всех значе­ний сигналов. Даже если нужно вычислить сумму квадратов отклонений, то для этого достаточно накопить сумму квадратов значений сигнала. Для накопления суммы квадратов выборок и последующего вычисления суммы квадратов отклонений необходимо работать с промежуточными результатами в форматах до 5 байт.