БПФ с векторным основанием. алгоритм

редактировать

Алгоритм векторно-основанного БПФ - это алгоритм многомерного быстрого преобразования Фурье (БПФ), который является обобщением обычного алгоритма БПФ Кули – Тьюки, который делит размеры преобразования произвольными основами. Он разбивает многомерное (MD) дискретное преобразование Фурье (DFT) на последовательно меньшие MD DFT до тех пор, пока, в конечном итоге, не потребуется оценивать только тривиальные MD DFT.

Наиболее распространенные многомерные Алгоритм БПФ - это алгоритм строки-столбца, который означает преобразование массива сначала в один индекс, а затем в другой, подробнее см. В БПФ. Затем было разработано прямое двумерное БПФ с основанием 2, которое позволяет исключить 25% умножений по сравнению с традиционным методом «строка-столбец». И этот алгоритм был расширен до прямоугольных массивов и произвольных оснований, что является общим алгоритмом векторной системы счисления.

Алгоритм вектор-основание БПФ может значительно уменьшить количество сложных умножений по сравнению с алгоритмом вектор-строка. Например, для элементной матрицы NM {\ displaystyle N ^ {M}}{\ displaystyle N ^ {M}} (размеры M и размер N для каждого измерения), количество комплексных кратных векторно-основному алгоритму БПФ для основание системы счисления 2 равно 2 M - 1 2 MNM log 2 ⁡ N {\ displaystyle {\ frac {2 ^ {M} -1} {2 ^ {M}}} N ^ {M} \ log _ {2 } N}{\ displaystyle {\ frac {2 ^ {M} - 1} {2 ^ {M}}} N ^ {M} \ log _ {2} N} , в то время как для алгоритма строка-столбец это MNM 2 log 2 ⁡ N {\ displaystyle {\ frac {MN ^ {M}} {2}} \ log _ { 2} N}{ \ displaystyle {\ frac {MN ^ {M}} {2}} \ log _ {2} N} . И, как правило, достигается еще большая экономия на умножениях, когда этот алгоритм работает с большими основами и с массивами более высокой размерности.

В целом алгоритм вектор-основание значительно снижает структурную сложность традиционного DFT, имеющего лучшую индексацию схемы, за счет небольшого увеличения арифметических операций. Таким образом, этот алгоритм широко используется во многих приложениях в инженерии, науке и математике, например, для реализации обработки изображений и проектирования высокоскоростных процессоров БПФ.

Содержание
  • 1 Случай 2-DIT
  • 2 2 -D DIF case
  • 3 Другие подходы
  • 4 Ссылки
Случай 2-D DIT

Как и в случае алгоритма Кули – Тьюки, двумерное векторно-основанное БПФ является получается путем разложения обычного 2-ДПФ на суммы меньших ДПФ, умноженных на множитель "твидла".

Алгоритм прореживания во времени (DIT ) означает, что разложение основано на временной области x {\ displaystyle x}x , подробнее см. Алгоритм БПФ Кули – Тьюки.

Мы предполагаем, что двумерное ДПФ

X (k 1, k 2) = ∑ n 1 = 0 N 1 - 1 ∑ n 2 = 0 N 2 - 1 x [n 1, n 2] ⋅ WN 1 К 1 N 1 WN 2 К 2 N 2, {\ displaystyle X (k_ {1}, k_ {2}) = \ sum _ {n_ {1} = 0} ^ {N_ { 1} -1} \ sum _ {n_ {2} = 0} ^ {N_ {2} -1} x [n_ {1}, n_ {2}] \ cdot W_ {N_ {1}} ^ {k_ { 1} n_ {1}} W_ {N_ {2}} ^ {k_ {2} n_ {2}},}{\ displaystyle X (k_ {1}, k_ {2}) = \ sum _ {n_ {1} = 0} ^ {N_ {1} -1} \ sum _ {n_ {2} = 0} ^ {N _ {2} -1} x [n_ {1}, n_ {2}] \ cdot W_ {N_ {1}} ^ {k_ {1} n_ {1}} W_ {N_ {2}} ^ {k_ { 2} n_ {2}},}

где k 1 = 0,…, N 1 - 1 {\ displaystyle k_ { 1} = 0, \ точки, N_ {1} -1}{\ displaystyle k_ {1} = 0, \ dots, N_ {1} -1} и k 2 = 0,…, N 2 - 1 {\ displaystyle k_ {2} = 0, \ dots, N_ {2} -1}{\ displaystyle к_ {2} = 0, \ точки, N_ {2} -1} и x [n 1, n 2] {\ displaystyle x [n_ {1}, n_ {2}]}{\ displaystyle x [n_ {1}, n_ {2}]} является N 1 × N 2 {\ displaystyle N_ {1} \ times N_ {2}}{\ displaystyle N_ {1} \ times N_ {2}} матрица и WN = exp ⁡ (- j 2 π / N) {\ displaystyle W_ {N} = \ exp (-j2 \ pi / N)}{\ displaystyle W_ {N} = \ exp (-j2 \ pi / N)} .

Для простоты предположим, что N 1 = N 2 = N {\ displaystyle N_ {1} = N_ {2} = N}{\ displaystyle N_ {1} = N_ {2} = N} и система счисления- (r × r) {\ displaystyle (r \ times r)}(r \ times r) (N / r {\ displaystyle N / r}{\ displaystyle N / r} - целые числа).

Использование замены переменных:

  • ni = rpi + qi {\ displaystyle n_ {i} = rp_ {i} + q_ {i}}{\ displaystyle n_ {i} = rp_ {i} + q_ {i}} , где pi = 0,…, (N / r) - 1; q i = 0,…, r - 1; {\ displaystyle p_ {i} = 0, \ ldots, (N / r) -1; q_ {i} = 0, \ ldots, r-1;}{\ displaystyle p_ {i} = 0, \ ldots, (N / r) -1; q_ {i} = 0, \ ldots, r-1;}
  • ki = ui + vi N / r {\ displaystyle k_ {i} = u_ {i} + v_ {i} N / r}{\ displaystyle k_ {i} = u_ {i} + v_ {i} N / r} , где ui = 0,…, (N / r) - 1; v i = 0,…, r - 1; {\ displaystyle u_ {i} = 0, \ ldots, (N / r) -1; v_ {i} = 0, \ ldots, r-1;}{\ displaystyle u_ {i} = 0, \ ldots, (N / r) -1; v_ {i} = 0, \ ldots, r-1;}

где i = 1 {\ displaystyle i = 1}i = 1 или 2 {\ displaystyle 2}2, тогда двумерное ДПФ можно записать как:

X (u 1 + v 1 N / r, u 2 + v 2 N / r) = ∑ q 1 = 0 r - 1 ∑ q 2 = 0 r - 1 [∑ p 1 = 0 N / r - 1 ∑ p 2 = 0 N / r - 1 x [rp 1 + q 1, rp 1 + q 1] WN / rp 1 u 1 WN / rp 2 u 2] ⋅ WN q 1 u 1 + q 2 u 2 W rq 1 v 1 W rq 2 v 2, {\ displaystyle X (u_ {1} + v_ {1} N / r, u_ {2} + v_ {2} N / r) = \ sum _ {q_ {1} = 0} ^ {r-1} \ sum _ {q_ {2} = 0} ^ {r-1} \ left [\ sum _ {p_ {1} = 0} ^ {N / r-1} \ sum _ {p_ {2} = 0} ^ {N / r -1} x [rp_ {1} + q_ {1}, rp_ {1} + q_ {1}] W_ {N / r} ^ {p_ {1} u_ {1}} W_ {N / r} ^ { p_ {2} u_ {2}} \ right] \ cdot W_ {N} ^ {q_ {1} u_ {1} + q_ {2} u_ {2}} W_ {r} ^ {q_ {1} v_ { 1}} W_ {r} ^ {q_ {2} v_ {2}},}{\ displaystyle X (u_ {1} + v_ {1} N / r, u_ {2} + v_ {2} N / r) = \ sum _ {q_ {1} = 0} ^ {r-1} \ sum _ {q_ {2} = 0} ^ {r-1} \ left [\ sum _ {p_ {1} = 0} ^ {N / r-1 } \ sum _ {p_ {2} = 0} ^ {N / r-1} x [rp_ {1} + q_ {1}, rp_ {1} + q_ {1}] W_ {N / r} ^ { p_ {1} u_ {1}} W_ {N / r} ^ {p_ {2} u_ {2}} \ right] \ cdot W_ {N} ^ {q_ {1} u_ {1} + q_ {2} u_ {2}} W_ {r} ^ {q_ {1} v_ {1}} W_ {r} ^ {q_ {2} v_ {2 }},}
Одноступенчатая «бабочка» для DIT-векторной системы счисления 2x2 FFT

Уравнение выше определяет базовую структуру двумерного DIT radix- (r × r) {\ displaystyle (r \ times r)}(r \ times r) "бабочка". (См. 1-D «бабочка» в Алгоритме БПФ Кули – Тьюки )

Когда r = 2 {\ displaystyle r = 2}r=2, уравнение можно разбить на четыре суммы: один по тем выборкам x, для которых оба n 1 {\ displaystyle n_ {1}}n_ {1} и n 2 {\ displaystyle n_ {2}}n_ {2} являются четными, для которого n 1 {\ displaystyle n_ {1}}n_ {1} четно, а n 2 {\ displaystyle n_ {2}}n_ {2} нечетно, один из который n 1 {\ displaystyle n_ {1}}n_ {1} нечетный, а n 2 {\ displaystyle n_ {2}}n_ {2} четный, и один, для которого оба n 1 {\ displaystyle n_ {1}}n_ {1} и n 2 {\ displaystyle n_ {2}}n_ {2} нечетные, и это приводит к:

X (k 1, k 2) = S 00 (k 1, k 2) + S 01 (k 1, k 2) WN k 2 + S 10 (k 1, k 2) WN k 1 + S 11 (k 1, k 2) WN k 1 + k 2, {\ displaystyle X (k_ {1}, k_ {2}) = S_ {00} (k_ {1}, k_ {2}) + S_ {01} (k_ { 1}, k_ {2}) W_ {N} ^ {k_ {2}} + S_ {10} (k_ {1}, k_ {2}) W_ {N} ^ {k_ {1}} + S_ {11 } (k_ {1}, k_ {2}) W_ {N} ^ {k_ {1} + k_ {2}},}{\ displaystyle X (k_ {1}, k_ {2}) = S_ {00} (k_ {1}, k_ {2}) + S_ {01} (k_ {1}, k_ {2}) W_ {N} ^ {k_ {2}} + S_ {10} (k_ {1}, k_ {2}) W_ {N} ^ {k_ {1}} + S_ {11} (k_ {1}, k_ {2}) W_ {N} ^ {k_ {1} + k_ {2}},}

где S ij (k 1, k 2) = ∑ n 1 = 0 Н / 2 - 1 ∑ n 2 = 0 N / 2 - 1 x [2 n 1 + i, 2 n 2 + j] ⋅ W N / 2 n 1 k 1 W N / 2 n 2 k 2. {\ displaystyle S_ {ij} (k_ {1}, k_ {2}) = \ sum _ {n_ {1} = 0} ^ {N / 2-1} \ sum _ {n_ {2} = 0} ^ {N / 2-1} x [2n_ {1} + i, 2n_ {2} + j] \ cdot W_ {N / 2} ^ {n_ {1} k_ {1}} W_ {N / 2} ^ { n_ {2} k_ {2}}.}{\ displaystyle S_ {ij} (k_ {1}, k_ {2}) = \ sum _ {n_ {1} = 0} ^ {N / 2- 1} \ sum _ {n_ {2} = 0} ^ {N / 2-1} x [2n_ {1} + i, 2n_ {2} + j] \ cdot W_ {N / 2} ^ {n_ {1 } k_ {1}} W_ {N / 2} ^ {n_ {2} k_ {2}}.}

Случай двумерного DIF

Аналогично, децимация по частоте (DIF, также называемая алгоритмом Сэнде – Тьюки) алгоритм означает, что разложение основано на частотной области X {\ displaystyle X}X , подробнее см. Алгоритм БПФ Кули – Тьюки.

Использование замены переменных:

  • ni = пи + ци N / r {\ displaystyle n_ {i} = p_ {i} + q_ {i} N / r}{\ displaystyle n_ {i} = p_ {i} + q_ {i} N / r} , где pi = 0,…, (N / r) - 1; q i = 0,…, r - 1; {\ displaystyle p_ {i} = 0, \ ldots, (N / r) -1; q_ {i} = 0, \ ldots, r-1;}{\ displaystyle p_ {i} = 0, \ ldots, (N / r) -1; q_ {i} = 0, \ ldots, r-1;}
  • ki = rui + vi {\ displaystyle k_ {i } = ru_ {i} + v_ {i}}{\ displaystyle k_ {i} = ru_ {i} + v_ {i}} , где ui = 0,…, (N / r) - 1; v i = 0,…, r - 1; {\ displaystyle u_ {i} = 0, \ ldots, (N / r) -1; v_ {i} = 0, \ ldots, r-1;}{\ displaystyle u_ {i} = 0, \ ldots, (N / r) -1; v_ {i} = 0, \ ldots, r-1;}

где i = 1 {\ displaystyle i = 1}i = 1 или 2 {\ displaystyle 2}2, а уравнение ДПФ можно записать как:

X (ru 1 + v 1, ru 2 + v 2) = ∑ p 1 = 0 N / r - 1 ∑ p 2 = 0 N / r - 1 [∑ q 1 = 0 r - 1 ∑ q 2 = 0 r - 1 x [p 1 + q 1 N / r, п 1 + q 1 N / r] W rq 1 v 1 W rq 2 v 2] ⋅ WN p 1 v 1 + p 2 v 2 WN / rp 1 u 1 WN / rp 2 u 2, {\ displaystyle X ( ru_ {1} + v_ {1}, ru_ {2} + v_ {2}) = \ sum _ {p_ {1} = 0} ^ {N / r-1} \ sum _ {p_ {2} = 0 } ^ {N / r-1} \ left [\ sum _ {q_ {1} = 0} ^ {r-1} \ sum _ {q_ {2} = 0} ^ {r-1} x [p_ { 1} + q_ {1} N / r, p_ {1} + q_ {1} N / r] W_ {r} ^ {q_ {1} v_ {1}} W_ {r} ^ {q_ {2} v_ {2}} \ right] \ cdot W_ {N} ^ {p_ {1} v_ {1} + p_ {2} v_ {2}} W_ {N / r} ^ {p_ {1} u_ {1}} W_ {N / r} ^ {p_ {2} u_ {2}},}{\ displaystyle X (ru_ {1} + v_ {1}, ru_ {2} + v_ {2}) = \ sum _ {p_ {1} = 0} ^ {N / r-1} \ sum _ {p_ {2} = 0} ^ {N / r-1} \ left [\ sum _ {q_ {1} = 0} ^ {r-1} \ sum _ {q_ {2} = 0} ^ {r-1} x [p_ {1} + q_ {1} N / r, p_ {1} + q_ {1} N / r] W_ {r} ^ {q_ {1} v_ {1}} W_ {r} ^ {q_ {2} v_ {2}} \ right] \ cdot W_ {N} ^ {p_ {1} v_ {1} + p_ {2} v_ {2}} W_ {N / r} ^ {p_ {1} u_ {1} } W_ {N / r} ^ {p_ { 2} u_ {2}},}
Другие подходы

Алгоритм БПФ с разделением оснований оказался полезным методом для 1-DFT. И этот метод был применен к векторно-основному БПФ для получения разделенного векторно-основанного БПФ.

В обычном двумерном векторно-основном алгоритме мы разлагаем индексы k 1, k 2 { \ displaystyle k_ {1}, k_ {2}}k_ {1}, k_ {2} на 4 группы:

X (2 k 1, 2 k 2): четно-четное X (2 k 1, 2 k 2 + 1): четно-нечетное X (2 k 1 + 1, 2 k 2): нечетное-четное X (2 k 1 + 1, 2 k 2 + 1): нечетно-нечетное {\ displaystyle {\ begin {array} {lcl } X (2k_ {1}, 2k_ {2}) : {\ text {even-even}} \\ X (2k_ {1}, 2k_ {2} +1) : {\ text {even- odd}} \\ X (2k_ {1} + 1,2k_ {2}) : {\ text {odd-even}} \\ X (2k_ {1} + 1,2k_ {2} +1) : {\ text {odd-odd}} \ end {array}}}{\ displaystyle {\ begin {array} {lcl} X (2k_ {1}, 2k_ {2 }) : {\ text {четный-четный}} \\ X (2k_ {1}, 2k_ {2} +1) : {\ text {четный-нечетный}} \\ X (2k_ {1} + 1,2k_ {2}) : {\ text {odd-even}} \\ X (2k_ {1} + 1,2k_ {2} +1) : {\ text {odd-odd}} \ end {array}}}

По алгоритму разделения векторной системы счисления первые три группы остаются неизменными, четвертая нечетно-нечетная группа далее разбивается на еще четыре подгруппы. групп и всего семь групп:

X (2 k 1, 2 k 2): четно-четное X (2 k 1, 2 k 2 + 1): четно-нечетное X (2 k 1 + 1, 2 k 2): нечетно-четное X (4 k 1 + 1, 4 k 2 + 1): нечетное-нечетное X (4 k 1 + 1, 4 k 2 + 3): нечетное-нечетное X (4 k 1 + 3, 4 k 2 + 1): нечетно-нечетное X ( 4 к 1 + 3, 4 к 2 + 3): нечетно-нечетное {\ displaystyle {\ begin {array} {lcl} X (2k_ {1}, 2k_ {2}) : {\ text {четное-четное }} \\ X (2k_ {1}, 2k_ {2} +1) : {\ text {четно-нечетное}} \\ X (2k_ {1} + 1,2k_ {2}) : { \ text {odd-even}} \\ X (4k_ {1} + 1,4k_ {2} +1) : {\ text {odd-odd}} \\ X (4k_ {1} + 1,4k_ {2} +3) : {\ text {odd-odd}} \\ X (4k_ {1} + 3,4k_ {2} +1) : {\ text {odd-odd}} \\ X (4k_ {1} + 3,4k_ {2} +3) : {\ text {odd-odd}} \ end {array}}}{\ displaystyle {\ begin {array} {lcl} X (2k_ {1}, 2k_ {2}) : {\ text {четный-четный} } \\ X (2k_ {1}, 2k_ {2} +1) : {\ text {четно-нечетное}} \\ X (2k_ {1} + 1,2k_ {2}) : {\ text {odd-even}} \\ X (4k_ {1} + 1,4k_ {2} +1) : {\ text {odd-odd}} \\ X (4k_ {1} + 1,4k_ { 2} +3) : {\ text {odd-odd}} \\ X (4k_ {1} + 3,4k_ {2} +1) : {\ text {odd-odd}} \\ X (4k_ {1} + 3,4k_ {2} +3) : {\ text {odd-odd}} \ end {array}}}

Это означает четвертый член в системе счисления 2-DIT - (2 × 2) {\ displaystyle (2 \ times 2)}{\ displaystyle (2 \ times 2)} уравнение, S 11 (k 1, k 2) WN k 1 + k 2 {\ displaystyle S_ {11 } (k_ {1}, k_ {2}) W_ {N} ^ {k_ {1} + k_ {2}}}{\ displaystyle S_ {11} (k_ {1}, k_ {2}) W_ {N} ^ {k_ {1 } + k_ {2}}} становится:

A 11 (k 1, k 2) WN k 1 + k 2 + A 13 (k 1, k 2) WN k 1 + 3 k 2 + A 31 (k 1, k 2) WN 3 k 1 + k 2 + A 33 (k 1, k 2) WN 3 (к 1 + к 2), {\ displaystyle A_ {11} (k_ {1}, k_ {2}) W_ {N} ^ {k_ {1} + k_ {2}} + A_ {13} (k_ {1}, k_ {2}) W_ {N} ^ {k_ {1} + 3k_ {2}} + A_ {31} (k_ {1}, k_ {2}) W_ {N} ^ {3k_ {1 } + k_ {2}} + A_ {33} (k_ {1}, k_ {2}) W_ {N} ^ {3 (k_ {1} + k_ {2})},}{\ displaystyle A_ {11} (k_ {1}, k_ {2}) W_ {N} ^ {k_ {1} + k_ {2}} + A_ {13} (k_ {1}, k_ {2}) W_ {N} ^ {k_ {1} + 3k_ {2}} + A_ {31} (k_ {1}, k_ {2}) W_ {N } ^ {3k_ {1} + k_ {2}} + A_ {33} (k_ {1}, k_ {2}) W_ {N} ^ {3 (k_ {1} + k_ {2})},}

где A ij (k 1, k 2) = ∑ n 1 = 0 N / 4 - 1 ∑ n 2 = 0 N / 4 - 1 x [4 n 1 + я, 4 n 2 + j] ⋅ WN / 4 n 1 К 1 WN / 4 n 2 K 2 {\ displaystyle A_ {ij} (k_ {1}, k_ {2}) = \ sum _ {n_ {1} = 0} ^ {N / 4-1} \ sum _ {n_ {2} = 0} ^ {N / 4-1} x [4n_ {1} + i, 4n_ {2} + j] \ cdot W_ {N / 4} ^ {n_ {1} k_ {1}} W_ {N / 4} ^ {n_ {2} k_ {2}}}{\ displaystyle A_ {ij} (k_ {1 }, k_ {2}) = \ sum _ {n_ {1} = 0} ^ {N / 4-1} \ sum _ {n_ {2} = 0} ^ {N / 4-1} x [4n_ { 1} + i, 4n_ {2} + j] \ cdot W_ {N / 4} ^ {n_ {1} k_ {1}} W_ {N / 4} ^ {n_ {2} k_ {2}}}

Затем 2-DN на N DFT получается последовательное использование указанного выше разложения, вплоть до последней стадии.

Было показано, что алгоритм системы счисления разбиения вектора сохранил около 30% сложных умножений и примерно такое же количество сложных сложений для типичного 1024 × 1024 {\ displaystyle 1024 \ times 1024}{\ displaystyle 1024 \ times 1024} массив в сравнении с алгоритмом векторной системы счисления.

Ссылки
Последняя правка сделана 2021-06-18 10:27:52
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте