[an error occurred while processing this directive]
|
Прошу прощения за делэй, водил блондинку в ресторан...
Y(n) = X(n)*B0 + X(n-1)*B1 + Y(n-1)*A0
B0 = 7FAF
B1 = 8051
A0 = 7F5F
(дополнительный сдвиг = 1)
На счет двойной точности я что, неправильно понял?
/*-----------------------------------------*/
Немного арифметики.
B0 = -B1 =0х8000 - 0х0051
A0 = B0!^2
Проверьте, если не верите. Т.о. формула вашего фильтра мановением мой руки превращается в следующее
Y(n) = X(n) - X(n-1) + B0 * Y(n-1)
Реализация Вашего фильтра может быть, как минимум, двоякой
Господа-критиканы, даю ПРИМЕРНУЮ рыбу!!!!
Вар.1. С умножением.
- в аккумуляторе А лежит сдвинутое влево на 16 разрядов Y(n-1)
- старшие 16 разряды А домножают на 0х0051. Результат в В.
- А+В -> А
- A + X(n) -> A
- A - X(n-1) -> A
Ваш 16-ти битный результат - старшие биты A (АH).
Вар.2. Без умножения.
- в аккумуляторе А лежит Y(n-1), сдвинутое влево на 16 (а можно и больше) разрядов.
- реализуем операцию домножения на B0 при помощи трех операций сдвиг-вычитание
--- A - A(со сдвигом влево на 10 разрядов)->B
--- B - A(со сдвигом влево на 12 разрядов)->B
--- B - A(со сдвигом влево на 16 разрядов)->B
--- B + X(n) -> B
--- B - X(n-1) -> B
Кстати, этот вариант точнее, т.к. Вы можете сдвинуть влево не на 16 разрядов, а на 19.
Есть еще вариант использовать свойство того, что B0 = 32768 - 3*3*3*3. Но уже лень. Сори!
E-mail: info@telesys.ru