Алгоритмы Винограда малоточечных ДПФ
DSPL-2.0 — свободная библиотека алгоритмов цифровой обработки сигналов Распространяется под лицензией LGPL v3 Страница проекта на SourceForge |
В предыдущих разделах мы рассмотрели алгоритмы БПФ по основанию два с прореживанием по времени и с прореживанием по частоте. Данные алгоритм очень эффективны, но они имеют существенное ограничение: длина входных данных и выходного вектора должна быть целой степенью двойки .
В данном разделе мы рассмотрим алгоритмы БПФ для произвольной составной длины , где и — произвольные положительные целые. Данный подход позволит построить эффективные процедуры дискретного преобразования Фурье практически для всех длин, а не только для . Кроме того, мы покажем, что рассмотренные ранее алгоритмы БПФ по основанию два являются частным случаем алгоритма БПФ составной длины.
Рассмотрим -точечное ДПФ сигнала , :
Выражение (1) можно трактовать как произведение матрицы поворотных коэффициентов на вектор входного сигнала:
Все элементы матрицы -точечного ДПФ, с учетом периодичности комплексной экспоненты могут быть представлены как степени по модулю .
Ввиду того, что матрица содержит лишь различных комплексных экспонент, она обладает рядом замечательных свойств. Во первых матрица является унитарной с весом , т.е. эрмитово сопряжение приводит нас к масштабированной обратной матрице:
Поскольку первая строка матрицы содержит только единичные элементы, то первый спектральный отсчет (постоянная составляющая сигнала)
С другой стороны, первый столбец матрицы также содержит только единичные значения. Это значит, что спектральный отсчет с индексом можно представить как:
Тогда вычисление ДПФ для индексов в матричном виде можно представить для как:
Таким образом необходимо найти эффективный алгоритм для матрично-векторного умножения в выражении (10). Разработка такого алгоритма заняла весьма продолжительное время. В 1968 году Рейдер опубликовал первый важный шаг этого алгоритма: сведение матрично-векторного умножения в выражении (10) к расчету циклической свертки. И спустя 10 лет, в 1978 году, Виноград опубликовал статью, в которой приводил максимально эффективные алгоритмы расчета циклической свертки, с минимальным числом операций умножения.
При рассмотрении циклической свёртки мы говорили, что ее можно представить в матричном виде как:
Обозначим «подматрицу» поворотных коэффициентов в выражении (10) через , а «подвектор» входного сигнала через . Тогда произведение матрицы на вектор можно представить как:
Как можно видеть из выражения (12) матрица поворотных коэффициентов не является циркулянтом, но как и циркулянт содержит только различный элемент, причем как и в циркулянте все строки и столбцы содержат различный коэффициент .
Рейдер в своей работе показал, что если размер ДПФ представляет собой простое число (3, 5, 7, 11 и т.д.), то переставляя строки и столбцы матрицы размерности («подматрицы» ), мы всегда можем свести ее к матрице циркулянту, а расчет к циклической свертке. Для перестановки столбцов матрицы , умножим обе части уравнения (12) на перестановочную матрицу слева:
Для перестановки строк матрицы перепишем (13) виде:
Как мы знаем, матрицы перестановок являются ортогональными, что означает и выражение (14) можно записать:
Например для матрицы перестановок равны:
Для комбинаций можно также найти две комбинации перестановочных матриц, а вот для и таких комбинаций будет уже 4, что приводит к возможности построения различных циркуляционных матриц алгоритма ДПФ. Для простых длин большей длины количество различных комбинаций перестановочных матриц может быть различным, но всегда найдется хотя бы одна такая комбинация перестановочных матриц, которая сведет расчет ДПФ простой длины к циклической свертке согласно алгоритму Рейдера.
Для того чтобы построить эффективные алгоритмы ДПФ простой длины необходимо научиться рассчитывать перестановочные матрицы и для заданной длины . Тогда мы сможем свести расчет ДПФ к циклической свертке, согласно алгоритму Рейдера и использовать эффективные алгоритмы Винограда для расчета циклической свертки.
Для начала вспомним малую теорему Ферма, которая утверждает, что для любого простого и натурального выполняется равенство:
Например для имеем:
Кроме того, из теории чисел известно, что для простого числа существуют примитивные корни , представляющие собой натуральные числа , такие, что
Для того, что понять является ли некоторое примитивным корнем простого числа необходимо рассчитать вектор значений для , и если в данном векторе значений не встречается единица, то значит — примитивный корень .
Рассмотрим пример для . Возможные значения , а возможные значения . Тогда можно составить таблицу, как это показано на рисунке 3
Из рисунка 3 можно заключить, что и являются примитивными корнями для простого .
Тогда каждый примитивный корень будет порождать матрицу перестановок . Для того чтобы сгенерировать матрицу , размерности необходимо установить в единицу элементы строк с индексами для столбцов (индексация строк и столбцов матрицы начинается с нуля ). Так для примитивного корня для необходимо установить в единицу следующие элементы матрицы :
ДПФ размерности точки можно записать в виде алгоритма Рейдера как:
ДПФ размерности точки можно записать в виде алгоритма Рейдера как (20), которые требует расчета 4-точечной циклической свертки.
Алгоритм Винограда для 4-точечной циклической свертки представлен в параграфе «Алгоритм Винограда для расчета циклической свертки», там же представлена оптимизированная версия алгоритма с минимальным числом сумматоров [1, стр. 67]:
- отсчеты входного сигнала соответствуют значениям циклической свертки :
- Поворотные коэффициенты соответствуют значениям циклической свертки :
- Коэффициенты зависят от поворотных коэффициентов и могут быть просчитаны однократно до использования алгоритма.
- Выходные значения свертки используются для расчета спектральных отсчетов согласно алгоритму Рейдера как:
- Учтем также, что
- Переобозначим промежуточные суммы при расчете циклической свертки как , чтобы не путать промежуточные суммы и сигнал.
Обобщив все замечания, алгоритм 5-точечного ДПФ можно записать как
Можно видеть, что
Также можно слагаемое при расчете спектральных отсчетов учесть в произведении , которое используется в и . Окончательно, алгоритм Винограда 5-точечного ДПФ может быть представлен как:
В данном разделе мы рассмотрели алгоритм Винограда расчета коротких ДПФ по простому основанию. Ядра коротких ДПФ могут быть использованы для построения быстрых алгоритмов составной длины, отличной от степени двойки. Это позволяет расширить применение алгоритмов БПФ и построить эффективные процедуры практически для любой длины исходной выборки.
Рассмотренные алгоритмы используют быстрые алгоритмы Винограда для циклической свертки, к которой можно свести алгоритм путем перестановки столбцов и строк матрицы поворотных коэффициентов в соответствии с алгоритмом Рейдера.
В данном разделе приведен алгоритм расчета перестановочных матриц для приведения ДПФ к расчету циклической свертки, а также приведены алгоритмы для длин и .
Алгоритм БПФ составной длины
Алгоритм Винограда для расчета циклической свертки
Алгоритм БПФ с прореживанием по времени
Алгоритм БПФ с прореживанием по частоте
[1] Замечание автора. Структура матрицы найдена мной, как автором, эмпирическим путем, который заключался в том, что анализировались свойства перестановочных матриц и и выявлении свойства . В результате структура сохранялась для всех перестановочных матриц, которые позволяли свести ДПФ к циклической свертке. Мне неизвестно доказательство того, что данный алгоритм работоспособен для всех простых длин ДПФ. Однако я проверил данный алгоритм численно для всех простых длин до включительно и для всех проверенных длин, алгоритм расчета перестановочных матриц давал правильный результат. Для длин больше я не смог проверить, ввиду численной неустойчивости алгоритма расчета примитивных корней. Если кто-то из читателей найдет аналитическое доказательство корректности подхода, равно как найдет опровержение, то прошу незамедлительно сообщить.