- •1. Задание на проектирование
- •1.1. Задача 1. Реализация ких-фильтра на процессоре tms320c50
- •1.2. Задача 2. Синтез и реализация ких-фильтра на процессоре tms320c50
- •1.3. Задача 3. Реализация бих-фильтра на процессоре tms320c50
- •1.4. Задача 4. Синтез и реализация бих-фильтра на процессоре tms320c50
- •2. Методические указания по выполнению задач
- •2.1.Составление программы
- •2.1.1. Программа реализации ких фильтра
- •2.1.2. Программа реализации бих фильтра
- •2.2.Отладка программы
- •2.3.Получение импульсной характеристики фильтра
- •2.4.Определение максимально возможной частоты дискретизации
- •3. Примеры программ
- •3.1.Программа реализации нерекурсивного фильтра
- •Inport .Set 50h ; параллельный порт, используемый для ввода
- •In inad,inport ; приём отсчета через входной порт
- •3.2. Командный файл компоновки
- •3.3.Программа реализации рекурсивного фильтра
- •3.3.1. Прямая форма
- •In1 .Word 0 ; входной отсчет
- •In inad,inport ; прием отсчета через порт ввода
- •3.3.2. Каноническая форма
- •In1 .Word 0 ; входной отсчет первого звена
- •In inad,inport ; прием отсчета через порт ввода
- •3.3.3. Трансформированная форма
- •In1 .Word 0 ; входной отсчет
- •3.4.Командный файл программного имитатора
- •4. Расчет фильтра с помощью пакета программ fd
- •5. Литература
- •Содержание
In inad,inport ; прием отсчета через порт ввода
* умножение входного отсчета на масштабный множитель
LT INAD
MPY MM1
LDP #IN1
SPH IN1 ; запись отсчета во входную ячейку первого звена
*при значении множителя ММ=1 необходимо убрать умножение на него;
* для этого вместо последних 4-х команд вставить команды
* LACC INAD
* LDP #IN1
* SACL IN1
.sect "Filter"
* вычисление выходного отсчета
ZAP ; (ACC) = (PREG) = 0
LT S31 ; (S31) -> регистр T
MPY B21 ; (S31)*(B21) -> PREG
LTA S21 ; предыдущее (PREG) + (ACC) -> ACC, (S21) -> T
MPY B11 ; (S21)*(B11) -> PREG
APAC ; предыдущее (PREG) + (ACC) -> ACC
EXAR ; (ACC) <-> буфер BCC
LACC IN1,16 ; (IN1) -> ACC
LT S31 ; (S31) ->T
MPY A21 ; (S31)*(A21) -> PREG
LTA S21 ; предыдущее (PREG) + (ACC) -> ACC, (S21) -> T
MPY A11 ; (S21)*(A11) -> PREG
APAC ; предыдущее (PREG) + (ACC) -> ACC
SACH S11 ; сохранение S11
LT S11 ;(S11) -> T
MPY B01 ;(S11)*(B01) -> PREG
EXAR ; (ACC) <-> буфер BCC
APAC ; предыдущее (PREG) + (ACC) -> ACC
SACH OUT1 ; сохранение выходного отчета
DMOV S21 ; сдвиг (S21) -> S31
DMOV S11 ; сдвиг (S11) -> S21
.sect "Vivod"
; Вывод выходного отсчета фильтра
LACC OUT1
LDP #OUTAD
SACL OUTAD
OUT OUTAD,OUTPORT
CLRC INTM ; разрешение прерывания для следующего отсчета
RET
.end
3.3.3. Трансформированная форма
Структурная схема звена второго порядка в трансформированной форме приведена на рис. 4.в. Обозначения переменных, используемые в программе, соответствуют обозначениям на этом рисунке.
* Программа реализации БИХ фильтра в трансформированной форме
.version 50
.global BUFFER2
.mmregs
* Задание значений символов, используемых в программе
OUTPORT .set 51h
INPORT .set 50h
.data
; данные для фильтра
INAD .word 0
OUTAD .word 0
MM1 .word 32768*74/100 ; масштабный множитель первого звена 0,74
.sect "KOF_VAR"
; Коэффициенты фильтра, к-ты Ai записываются с противоположным знаком
; Первое звено
B01 .word 32768*2793/10000 ; B01 = 0,2793
B11 .word (32768*307/10000) ; B11 = 0,0307
B21 .word 32768*2793/10000 ; B21 = 0,2793
A11 .word 32768*5586/10000 ; A11 = 0,5586
A21 .word -(32768*8289/10000) ; A21 = -0,8289
; переменные фильтра
; Первое звено
In1 .Word 0 ; входной отсчет
S11 .word 0 ; промежуточное значение
S21 .word 0 ; промежуточное значение
OUT1 .word 0 ; выходной отсчет звена
.sect "Vectors"
* Таблица векторов прерываний
B START
B BEGIN ; INT1 внешние прерывания
B BEGIN ; NT2
B BEGIN ; INT3
B BEGIN ; TINT прерывание по таймеру
.sect "Init_main"
* Инициализация процессора и основная программа
START:
* установка режимов работы
SETC INTM ; запрет прерываний на время установки режимов работы
CLRC OVM ; режим переполнения
SPM 1 ; режим сдвига значений при передаче (PREG) -> АЛУ
SETC SXM ; режим расширения знака
LDP #0 ; установка разрешения необходимых прерываний
SPLK #0Fh,IMR
CLRC INTM ; разрешение прерываний
LOOP:
NOP ; основная программа – бесконечная петля ожидания
; прихода запроса на прерывание
B LOOP
* подпрограмма прерывания, которая состоит из трёх основных частей
.sect "Vvod"
BEGIN:
* ввод отсчета
LDP #INAD
IN INAD,INPORT
* умножение входного отсчета на масштабный множитель
LT INAD
MPY MM1
LDP #IN1
SPH IN1
при значении множителя ММ=1 необходимо убрать умножение на него;
* для этого вместо последних 4-х команд вставить команды
* LACC INAD
* LDP #IN1
* SACL IN1
.sect "Filter"
* вычисление выходного отсчета
ZAP ; (ACC) = (PREG) = 0
LACC S21,16 ; S21 -> ACC
LT IN1 ; IN1 -> регистр T
MPY B01 ; (IN1)*(B01) -> PREG
APAC ; (PREG)+(ACC) -> ACC
SACH OUT1 ; сохранение выходного отсчета
LACC S11,16 ; S11 -> ACC
MPY B11 ; (IN1)*(B11) -> PREG
LTA OUT1 ; предыдущее (PREG)+(ACC) -> ACC, OUT1 -> T
MPY A11 ; (OUT1)*(A11) -> PREG
APAC ; (PREG)+(ACC) -> ACC
SACH S21 ; сохранение значения S21
MPY A21 ; (OUT1)*(A21) -> PREG
LTP IN1 ; предыдущее (PREG) - ACC, (IN1) - T
MPY B21 ; (IN1)*(B21) -> PREG
APAC ; (PREG)+(ACC) -> ACC
SACH S11 ; сохранение значения S11
.sect "Vivod"
; Вывод выходного отсчета фильтра
LACC OUT1
LDP #OUTAD
SACL OUTAD
OUT OUTAD,OUTPORT
CLRC INTM ; разрешение прерывания для следующего отсчета
RET
.end
