Для организации достаточно эффективной реализации КИХ фильтра требуется реализовать “кольцевой буфер”( см. Работа с кольцевым буфером ). Этот буфер будет располагаться внутри класса фильтра. Размер его равен числу коэффициентов КИХ фильтра. Создается он динамически. Помимо него еще потребуется использование двух лишних переменных-индексов для передвижения по массиву, скажем, m_indexIn и m_indexOut .
Вспоминая теорию, строим иллюстрацию нашего алгоритма (использовал в своем дипломе):
Сам алгоритм выглядит так:
По кольцевому буферу делаем простенькую программу для проверки своей идеи в Microsoft Visual C++ 2010 Express Edition:
#include <iostream>
//первая ступень фильтрации-децимации имеет такой размер
const int m_coeffAmounts = 68;
int buff_FIFO[ m_coeffAmounts ];
int main() {
//заполнение буфера
for( int i = 0; i < m_coeffAmounts; ++i) {
buff_FIFO[ i ] = i;
}
int result;
int idx = 3;
for(int i = 0; i < m_coeffAmounts; ++i, --idx ) {
result = buff_FIFO[ ( idx + m_coeffAmounts ) % m_coeffAmounts ];
std::cout << result << std::endl;
}
std::cin.get();
return 0;
}
Примечание: если индекс увеличивать ++idx, то обход буфера будет проходить от меньшего индекса к большему по кругу, если --idx, то наоборот - от большего к меньшему.
Результат выполнения:
Данный подход использую и в программе для КИХ фильтра. О круговых буферах (круговой адресации) можно почитать у Айфичера 12.5.1 “Цифровая КИХ фильтрация”.
Видение того, как должна происходить работа КИХ фильтра-дециматора, отображено в анимации алгоритма работы:
хороший материал о Кольцевом Буфере, оформленном как сущность (в виде шаблона) -
ОтветитьУдалитьhttp://we.easyelectronics.ru/Soft/kolcevoy-bufer-na-s-dlya-mk.html