Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Реализация КИХ-фильтра с разрядностью 32 бит
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
K A A
Пишу программу вычисления действующего значения сигнала с помощью КИХ-фильтрации.
Алгоритм следующий: 16-бит выборки возвожу в квадрат, получаю 32 бит, затем умножаю на весовой коэффициент (32 бит) и прибавляю к аккумулятору. При такой разрядности нужно использовать все 40 бит аккумулятора MAC, и то этого мало. Но никак не пойму, как это сделать на С. Функции из fract_math.h реализуют умножение 32x32 -> 32 и сложение 32+32 -> 32, как обрабатывать дополнительные 8 бит? Или писать на ассемблере?

ЗЫ: почему такая разрядность - просто погрешность результата должна быть на уровне 0.001%. Почти получается, когда алгоритм был реализован с использованием вещественной арифметики. Для улучшения стабильности нужно увеличить размер окна в несколько раз (сейчас 4096, хорошо бы раз в 16 больше, путем интерполяции на лету), соответственно увеличить частоту - тут уже проц не поспевает. Еще возможные проблемы с float при большом окне - ограничение разрядности, когда сумма накопится большая, а слагаемые очень маленькие, при этом они будут игнорироваться.

Так как это сделать на С?
fontp
Это легко сделать инлайн вставками ассемблера. А саму переменную для накопителя можно объявить в С 64-разрядной (long long что-ли).
Чисто в С, наверно, никак
Stanislav
Цитата(fontp @ Mar 29 2007, 18:36) *
Это легко сделать инлайн вставками ассемблера. А саму переменную для накопителя можно объявить в С 64-разрядной (long long что-ли).
Чисто в С, наверно, никак
Присоединяюсь к данному мнению. Я искал, как это сделать, довольно тщательно. Вывод: никак нельзя.
Только я бы посоветовал даже не делать инлайн вставки, а писать на АСМе полноценные процедуры для напряжённой обработки сигнала. Выигрыш против С либо в точности, либо в производительности получается значительный.
kalimusk
Цитата(K A A @ Mar 29 2007, 17:47) *

Почти по теме.
В журнале "Компоненты и технологии" №2 2007 описаны КИХ-фильтры без умножений
K A A
Спасибо, буду делать на ассемблере
K A A
Спасибо, читал эту статью. Думаю, когда в процессоре есть умножение, то быстрее будет классическим способом.
Stanislav
Цитата(K A A @ Mar 30 2007, 09:53) *
Спасибо, буду делать на ассемблере
Получите двойной выигрыш: по-моему, встроенная функция, приведённая Вами в начале, на два MAC-а вычисления не раскидывает.
fontp
Вообще-то их и делать особенно не нужно. Так подправить...
Взять исходники библиотечных функций fir_fr16.asm или аналогичной, поменять атрибуты инструкции делающей mac, добавить выходную нормировку. Там почти везде два мака на такт
Jools
Цитата(kalimusk @ Mar 30 2007, 07:15) *
Почти по теме.
В журнале "Компоненты и технологии" №2 2007 описаны КИХ-фильтры без умножений


Можно ли как-то увидеть djvu этой статьи?
Буду очень признателен!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.