ЭУМК по дисциплине "Программирование проблемно-ориентированных вычислительных средств реального времени" › Теория › Тема 2. Программирование цифровых нерекурсивных и рекурсивных фильтров

# Электронный учебно-методический
комплекс по дисциплине
"Программирование проблемно-ориентированных вычислительных средств реального времени"

для специальности

1-40 02 02 «Электронные вычислительные средства»

Оглавление | Программа | Теория | Практика | Контроль знаний | Об авторах

2.2. Программирование цифровых рекурсивных фильтров
2.2.1. Уравнения и структуры цифровых рекурсивных фильтров

Прямая форма записи уравнения цифрового рекурсивного фильтра во временной области выглядит следующим образом (прямая форма 1):

|  | (2.5)

Передаточная функция цифрового рекурсивного фильтра (ЦРФ) или фильтра с бесконечной импульсной характеристикой (БИХ или IIR – Infinite Impulse Response) в Z-области записывается уравнением

|  | (2.6)

Кроме прямой формы (2.5) имеется и другая форма (называемая канонической) уравнения ЦРФ с использованием промежуточных переменных d:

|  | (2.7)

Обе эти формы (2.5) и (2.7) для случая N = M могут быть представлены следующими схемами (рис. 2.5):

###

### Рисунок 2.5 – Граф-схемы цифровых рекурсивных фильтров

Прямая форма (рис. 2.5а) требует 2N+1 коэффициентов и 2N+1 рабочих ячеек для переменных X, Y (переменные x(n), y(n) могут храниться в одной ячейке памяти). При канонической реализации (рис. 2.5б) число переменных в два раза меньше (N+2).

Коэффициенты a и b в обеих формулах одинаковые, в чем можно убедиться на примере фильтра второго порядка.
y(n) = a0d(n) + a1d(n-1) + a2d(n-2)
d(n) = x(n) – b1d(n-1) – b2d(n-2)
d(n-1) = x(n-1) – b1d(n-2) – b2d(n-3)
d(n-2) = x(n-2) – b1d(n-3) – b2d(n-4)
y(n) = a0[x(n) – b1d(n-1) – b2d(n-2)] +
+ a1[x(n-1) – b1d(n-2) – b2d(n-3)] +
+ a2[x(n-2) – b1d(n-3) – b2d(n-4)] =
= a0x(n) + a1x(n-1) + a2x(n-2) –
– b1[a0d(n-1) + a1d(n-2) + a2d(n-3)] –
– b2[a0d(n-2) + a1d(n-3) + a2d(n-4)] =
= a0x(n) + a1x(n-1) + a2x(n-2) –
– b1y(n-1) – b2y(n-2)
Обычно при программировании ЦФ используется разбиение фильтра высокого порядка на ряд фильтров более низкого порядка (например 2-го порядка), поскольку при программировании фильтра высокого порядка трудно избежать переполнения для промежуточных результатов вычисления и большой разницы в величине коэффициентов.
В качестве примера можно рассмотреть программирование ЦРФ второго порядка с прямой и косвенной адресацией (в отличие от ЦНФ обнуление предыстории обязательно для ЦРФ).
Расположение отсчетов предыстории в памяти данных аналогично их расположению у нерекурсивного фильтра: DN (мл.) -> DNM1-> DNM2 (ст.).

2.2.2. Примеры программной реализации цифрового рекурсивного фильтра

Ниже приведены несколько примеров программ для разных способов вычисления.

    ; Линейная программа ЦРФ (каноническая форма) 2-го порядка
    	.text		; секция программы
    START:	LD	#XN, DP	; сделать текущей страницу с x(n)
    	SSBX	FRCT	; режим умножения дробных чисел
    	RSBX	OVM	; нет коррекции переполнения в АЛУ
    	ORM	#1, PMST	; коррекция переполнения при записи
    	LD	#0, A	; обнуление предыстории (А:=0)
    	STL	A, DNM1	; DNM1:=0
    	STL	A, DNM2	; DNM2:=0
    ; программа ЦРФ (ввод и вывод через параллельный порт)
    NXIPT:	PORTR	PA2, XN	; ввод из порта x(n)
    	; вычисление d(n)
    	LD	XN, 16, A	; x(n) в старшую часть акк.А
    	LD	DNM1, T	; Т:=d(n-1)
    	MAS	B1, A	; A:=A-T*b1=A-b1*d(n-1)
    	LD	DNM2, T	; T:=d(n-2)
    	MASR	B2, A	; A:=A-T*b2=A-b2*d(n-2)=d(n) и окр.
    	STH	A, DN	; d(n)
    	; вычисление y(n)
    	MPY	A2, A	; A:=T*a2=a2*d(n-2)
    	LTD	DNM1	; T:=d(n-1), d(n-1)->d(n-2)
    	MAC	A1, A	; A:=A+T*a1=A+a1*d(n-1)
    	LTD	DN	; T:=d(n), d(n)->d(n-1)
    	MACR	A0, A	; A:=A+T*a0=A+a0*d(n) и округл.
    	STH	A, XN	; y(n)->x(n)
    	BD	NXIPT	; задержанный переход на NeXtInPuT
    	PORTW	XN, PA2	;2w вывод в порт y(n)
    	.data		; секция данных
    XN	.WORD	0	; вход и выход фильтра
    DN	.WORD	0	; предыстория фильтра
    DNM1	.WORD	0
    DNM2	.WORD	0
    A0	.WORD	0	; коэффициенты фильтра
    A1	.WORD	0
    A2	.WORD	0
    B1	.WORD	0
    B2	.WORD	0

    ; Программа ЦРФ N-го порядка с использованием команд MACP и MACD
    	.text		; секция программы
    START:	LD	#0, DP	; сделать текущей 0-ю страницу
    	SSBX	FRCT	; режим умножения дробных чисел
    	RSBX	OVM	; нет коррекции переполнения в АЛУ
    	ORM	#1, PMST	; коррекция переполнения при записи
    	STM	#DNMN1, AR2	; AR2:= адрес d(n-(N-1))
    	RPTZ	A, #N-2	; А:=0 и повторить N-1 раз
    	STL	A, *AR2-	; обнуление предыстории d(n-k):=0
    ; программа ЦРФ (ввод и вывод через последовательный порт)
    NXIPT:	LD	McDRR, 16, A ; ввод из порта x(n) в AH
    	; вычисление d(n)
    	STM	#DNMN1, AR2	; AR2:= адрес d(n-(N-1))
    	RPT	#N-2	; повторить N-1 раз
    	MACP	*AR2-,BNM1, A ; A:=A+T*(-bk)=A-bk*d(n-k)
    	STH	A, *AR2	; d(n)
    	; вычисление y(n)
    	STM	#DNMN1, AR2	; AR2:= адрес d(n-(N-1))
    	RPTZ	A, #N-1	; А:=0 и повторить N раз
    	MACD	*AR2-,ANM1, A ; A:=A+T*ak=A+ak*d(n-k)
    	BD	NXIPT	; задержанный переход на NeXtInPuT
    	STH	A, McDXR	;1w вывод в порт y(n)
    	NOP		;1w пустая команда
    ANMN1	.WORD	0
    	.  .  .
    A1	.WORD	0
    A0	.WORD	0	; коэффициенты фильтра
    BNMN1	.WORD	0
    	.  .  .
    B1	.WORD	0
    	.data		; секция данных
    DN	.WORD	0	; предыстория фильтра
    DNM1	.WORD	0
    	.  .  .
    DNMN1	.WORD	0
    XN	.WORD	0	; резервная пустая ячейка
    ; ПРИМЕЧАНИЕ:	коэффициенты ak и bk в памяти программ и могут
    ;		располагаться только в таком порядке !!!

    ; Программа ЦРФ с использованием циклической адресации
    	.text		; секция программы
    START:	LD	#0, DP	; сделать текущей 0-ю страницу
    	SSBX	FRCT	; режим умножения дробных чисел
    	RSBX	OVM	; нет коррекции переполнения в АЛУ
    	ORM	#1, PMST	; коррекция переполнения при записи
    	STM	#DNMN1, AR2	; AR2:= адрес d(n-(N-1))
    	RPTZ	A, #N-3	; А:=0 и повторить N-2 раз
    	STL	A, *AR2-	; обнуление предыстории d(n-k):=0
    	STL	A, *AR2	; обнуление предыстории d(n-1):=0
    	STM	#1, AR0	; AR0:= шаг в кольцевом буфере
    	STM	#N, BK	; размер кольцевого буфера
    ; программа ЦРФ (ввод и вывод через последовательный порт)
    NXIPT:	LD	McDRR, 16, A ; ввод из порта x(n) в AH
    	; вычисление d(n)
    	STM	#B1, AR3	; AR3:= адрес b1
    	RPT	#N-2	; повторить N-1 раз
    	MAS	*AR2+0%,*AR3+, A ; A:=A-T*bk=A-bk*d(n-k)
    	STH	A, *AR2	; d(n)
    	; вычисление y(n)
    	RPTZ	A, #N-1	; А:=0 и повторить N раз
    	MAC	*AR2+0%,*AR3+, A ; A:=A+T*ak=A+ak*d(n-k)
    	BD	NXIPT	; задержанный переход на NeXtInPuT
    	STH	A, McDXR	;1w вывод в порт y(n)
    	NOP		;1w пустая команда
    	.data		; секция данных
    	.ALIGN	32	; выравнивание для N < 32
    DN	.WORD	0	; предыстория фильтра
    DNM1	.WORD	0
    	.  .  .
    DNMN1	.WORD	0
    B1	.WORD	0	; коэффициенты фильтра
    	.  .  .
    BNMN1	.WORD	0
    A0	.WORD	0
    	.  .  .
    ANMN1	.WORD	0
    ; ПРИМЕЧАНИЕ:	коэффициенты ak и bk в памяти данных и должны
    ;		располагаться в указанном порядке, при этом
    ;		порядок ak, bk и d(n-k) может быть и обратным,
    ;		при этом AR0:=-1 и меняется адресация *AR3-

Недостаток канонической формы – возможно переполнение, недостаток прямой – в 2 раза больше памяти.

Оглавление | Программа | Теория | Практика | Контроль знаний | Об авторах
© БГУИР , 2012