Круговой буфер: критический элемент цифровых сигнальных процессоров
В этой статье рассматривается циклическая буферизация, которая позволяет значительно ускорить передачу данных в режиме реального времени.
Цифровой процессор сигналов представляет собой специализированный микропроцессор для алгоритмов, используемых в цифровой обработке сигналов (DSP). Основная цель - ускорить расчеты, сохраняя при этом потребление энергии как можно ниже. В этой статье мы рассмотрим базовую возможность адресации процессоров DSP, то есть циклическую буферизацию, что позволяет значительно ускорить передачу данных в режиме реального времени.
Обратите внимание, что, поскольку аббревиатура «DSP» обозначает «обработку цифрового сигнала» и «процессор цифровых сигналов», мы будем использовать термин «процессор DSP», если обратиться к аппаратным средствам, а не к алгоритму.
Поскольку фильтрация с конечным импульсным ответом (FIR) является общей операцией в DSP, мы продолжим наше обсуждение на основе изучения разностного уравнения фильтра КИХ. Этот простой пример покажет типичные свойства многих алгоритмов DSP. После рассмотрения проблемы обработки входящих образцов мы рассмотрим циклическую буферизацию как эффективное решение проблемы.
Выполнение FIR-фильтрации на входе в реальном времени
Предположим, что у нас есть фильтр с четырьмя кранами со следующим разностным уравнением:
$$ у (п) = B_ {0} х (п) + B_ {1} х (п-1) + B_ {2} х (п-2) + B_ {3} х (п-3) $$
Уравнение 1
где $$ b_0 $$, $$ b_1 $$, $$ \ dots $$, $$ b_3 $$ - коэффициенты фильтра, а $$ x (n) $$ обозначает входные выборки. Чтобы вычислить Уравнение 1, нам нужно сохранить последние четыре выборки ввода в памяти. Предположим, что у нас есть система реального времени, такая как слуховой аппарат. В этом случае существует бесконечное количество входных выборок, которые становятся доступными для нас с течением времени. В результате мы можем взять один входной образец, вычислить Уравнение 1, перенести результат на выходное устройство, а затем повторить эту процедуру для следующего входного образца. Следовательно, этот пример требует следующих шагов для каждого входного образца:
- Приобретите входной образец из аналогового мира и найдите его цифровое представление с использованием аналого-цифрового преобразователя (АЦП).
- Сообщите системе, что новый образец доступен.
- Сохраните новый образец в памяти (в примере уравнения 1 нам понадобится этот новый образец для создания четырех выходных выборок, поэтому нам нужно некоторое время хранить полученные образцы).
- Используйте новый образец и последние три образца для вычисления уравнения 1.
- Переместите результат на выходное устройство, такое как цифроаналоговый преобразователь (ЦАП), или просто сохраните его где-нибудь в памяти для последующего использования.
- Вернитесь к шагу 1.
Этот пример показывает, что простой алгоритм DSP включает передачу данных, оценку неравенства и множество математических операций. Например, во время шагов 3 и 5 мы должны перенести, соответственно, вход и результат в ячейку памяти. Шаг 4 включает в себя множество математических операций. На этом этапе входные отсчеты умножаются на их соответствующие коэффициенты фильтра, и продукты складываются вместе. Обычно это достигается посредством выделенного блока умножения и аккумулирования (MAC), который показан на рисунке 1.

Рисунок 1. Упрощенная модель MAC
Шаг 4 требует некоторых оценок неравенства для отслеживания промежуточных результатов и управления циклами.
Математические операции на шаге 4, по-видимому, являются наиболее трудоемкой частью алгоритма, а процессоры DSP пытаются ускорить эти вычисления с использованием различных методов. Однако интересно отметить, что без тщательного проектирования такие операции, как передача данных и управление циклами, также могут быть трудоемкими. В остальной части этой статьи будет рассмотрен известный метод, то есть круговая буферизация, для облегчения передачи данных в режиме реального времени.
Линейная буферизация
Реализация прямой формы уравнения 1 показана на рисунке 2.

Рисунок 2. Прямая реализация четырехсекционного фильтра
Вышеприведенная цифра показывает, что нам нужно четыре ячейки памяти для хранения текущего образца и трех предыдущих выборок. Когда новый образец будет получен, мы отбросим самый старый образец и подталкиваем другие образцы вверх (см. Рис. 3) на одну ячейку памяти.

Рисунок 3. Линейный буфер при (a) индексе времени n = 3 и (b) n = 4
Рисунок 3 (a) показывает, что во временном индексе $$ n = 3 $$ последние четыре образца, хранящиеся в памяти, равны $$ x (3) $$, $$ x (2) $$, $$ x (1) $$ и $$ x (0) $$. Когда новый образец получен в $$ n = 4 $$, последние четыре образца, $$ x (4) $$, $$ x (3) $$, $$ x (2) $$ и $$ x (1) $$, будет храниться в памяти, как показано на рисунке 3 (b). Такой подход к хранению входящих образцов называется линейной буферизацией. Как мы увидим через минуту, это просто, но совсем не эффективно.
Основная проблема с линейной буферизацией - это объем передачи данных, который нам нужно обрабатывать. Рассмотрим приведенный выше линейный буфер для четырехканального КИХ-фильтра. С каждым новым образцом мы должны прочитать три места памяти и записать их содержимое в другое место в нашем массиве. Это показано на рисунке 4. Мы видим, что количество операций чтения и записи пропорционально длине фильтра. Поэтому линейная буферизация не является эффективным методом хранения входящих образцов. Например, если мы используем линейный буфер для реализации фильтра с 256 фильтрами, то с каждым новым приобретенным образцом мы должны выполнить почти 256 операций чтения и записи!

Рисунок 4. Линейный буфер при индексе времени n. Образцы будут перемещаться вверх по одной ячейке памяти, когда будет получен новый образец
Циклическая буферизация
Рассмотрим еще раз 3. Память на рисунке 3 (a) хранит четыре входных выборки: $$ x (0) $$, $$ x (1) $$, $$ x (2) $$ и $$ x (3) $$. Рисунок 3 (b) хранит $$ x (1) $$, $$ x (2) $$, $$ x (3) $$ вместе с новым образцом $$ x (4) $$. Мы заметили, что три значения, т. Е. $$ x (3) $$, $$ x (2) $$, $$ x (1) $$, являются общими для двух случаев, показанных на рисунке 3; однако для хранения этих общих значений используются разные ячейки памяти.
Можем ли мы использовать приведенное выше наблюдение для уменьшения числа необходимых операций чтения и записи »« src = »// www.allaboutcircuits.com/uploads/articles/Fig5m1112017.png» />
Рисунок 5. Круговой буфер при (a) индексе времени n = 3 и (b) n = 4
На рисунке 6 показано, как следующие четыре образца будут помещены в круговой буфер этого примера. Исходя из вышеприведенного обсуждения, каждый новый образец заменяет самый старый образец. Пожалуйста, обратите внимание на положение новейшего образца в каждом состоянии на рисунке 6. С каждым новым образцом позиция последнего образца перемещается вперед по одному месту памяти из рисунка 6 (a) на рис. 6 (c). Однако, когда новая позиция образца достигает конца буфера на рисунке 6 (с), он возвращается к началу выделенной памяти. Мы можем думать об этом как о гипотетической циркулярной памяти, где конец буфера связан с его началом (рис. 7). Когда мы достигнем конца буфера, следующая ячейка памяти будет первым местом буфера. Это объясняет название, выбранное для этой методики, то есть циклическую буферизацию.

Рисунок 6. Круговой буфер при (a) индексе времени n = 5, (b) n = 6, (c) n = 7 и (d) n = 8

Рисунок 7. Круговой буфер идентичен гипотетической круговой памяти. Номера отображают адрес расположения памяти
Указатель на интерпретацию содержимого кругового буфера
При линейной буферизации каждая ячейка памяти соответствует определенному временному сдвигу относительно текущего образца. Это не меняется с индексом времени, когда мы рассматриваем память. Например, местоположение памяти 2004 соответствует текущему входному образцу как на рис. 3 (а), так и (б). Вот почему на рисунке 4 мы можем назвать ячейку памяти 2004 как x (n), расположение памяти 2003 как x (n-1) и т. Д. При циклической буферизации это не так. Например, на рисунке 5 (a) самый новый образец находится в ячейке памяти 2004; однако на рисунке 5 (b) самый новый образец находится по адресу 2001. Следовательно, в то время как круговой буфер содержит все необходимые выборки ввода для выполнения фильтрации КИХ, мы должны определить сдвиг во времени, связанный с каждой ячейкой памяти при заданном временном индексе. Этого можно легко достичь, указав указатель на местоположение самого нового образца. Указатель - это переменная, значение которой является адресом. Например, чтобы распознать новейший образец массива на рисунке 6 (a), нам нужно установить значение указателя на 2002. Когда мы получим новый образец на рисунке 6 (b), значение указателя будет увеличиваться на единицу указать место памяти 2003 и т. д. Очевидно, что из-за циклического поведения буфера указатель должен вернуться к началу буфера, когда указатель достигнет последней ячейки памяти. Следовательно, помимо указателя на новый образец массива, мы также должны распознавать первое и последнее местоположение буфера. С этой целью мы можем использовать два других указателя для хранения адреса первого и последнего мест памяти. В качестве альтернативы мы можем использовать указатель для хранения первой ячейки памяти и переменной для хранения длины кругового буфера.
Процессор DSP в сравнении с процессором общего назначения
При внедрении системы реального времени мы находим циклический буфер, решающий, используем ли мы процессор DSP или процессор общего назначения (GPP). Однако с помощью GPP нам, возможно, придется внедрить циклический буфер в программное обеспечение. Как обсуждалось в предыдущем разделе, с каждым новым образцом мы должны обновить указатель, который содержит адрес самого нового образца. С помощью циклического буфера, реализованного в программном обеспечении, программисту необходимо позаботиться о обновлении указателей буфера после каждой операции чтения и записи. Когда указатель достигает конца буфера, программа должна вернуть указатель обратно в начало буфера.
В требовательном приложении у нас может не хватить времени, чтобы постоянно проверять указатели, чтобы увидеть, достигли ли они конца буфера и, при необходимости, вернули их в начало буфера. В результате процессор DSP использует выделенное оборудование для предоставления некоторых быстрых циклических буферов. Эта аппаратная реализация автоматически проверяет статус указателей и соответственно обновляет их. Процессор DSP достигает этого без использования других ценных ресурсов системы. Чтобы узнать больше об аппаратном кольцевом буфере аналогового устройства, см. Раздел 3.2 данного руководства пользователя (PDF). Вы также можете найти некоторые советы по кодированию для реализации циклических буферов в программном обеспечении в Приложении B к этой книге.
Резюме
- Цифровой процессор сигналов является специализированным микропроцессором для алгоритмов, используемых в DSP.
- КИХ-фильтр включает передачу данных, оценку неравенства и множество математических операций. Без тщательного проектирования каждая из этих операций может быть трудоемким процессом.
- Линейная буферизация проста, но не эффективна.
- Циклическая буферизация - эффективный метод хранения входных данных системы реального времени. Используя этот метод, нам нужно выполнить только одну операцию записи по памяти для каждого нового образца.
- При использовании GPP нам может понадобиться реализовать циклический буфер в программном обеспечении. Тем не менее, процессор DSP использует выделенное оборудование для обеспечения быстрых циклических буферов.
Чтобы просмотреть полный список моих статей, посвященных DSP в AAC, см. На этой странице.