Алгоритм Гуда — Томаса — алгоритм вычисления быстрого преобразования Фурье, применяющийся к последовательностям, длина которых равна произведению двух взаимно простых чисел.
Алгоритм Гуда — Томаса не следует путать с алгоритмом Кули — Тьюки, где делители длины преобразования не обязаны быть взаимно простыми. Алгоритм Гуда — Томаса ограничен этим условием, а также задействует более сложную схему переиндексации, чем алгоритм Кули — Тьюки, но при этом не требует промежуточного умножения на комплексные множители и потому несколько проще с точки зрения вычислений[1].
Построение алгоритма
Для произвольного натурального числа
дискретным преобразованием Фурье комплексного вектора
, где
, называется комплексный вектор
, где
, компоненты которого задаются формулой
![{\displaystyle X(k)=\sum \limits _{j=0}^{n-1}x(j)\omega ^{kj},\;k=0,\ldots ,n-1,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f7bf5ba1783e143041b28793a55e4be2d3268354)
где
.
Пусть
, где
и
взаимно просты. Пусть также
и
— новые входные индексы, задающиеся соотношениями[2]
![{\displaystyle j_{1}=j\ ({\mbox{mod}}\ n_{1}),\ j_{2}=j\ ({\mbox{mod}}\ n_{2}).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/0eadf8ebbc3f5e4059cba9f0922b6d0efaeac96d)
Отсюда по китайской теореме об остатках и соотношению Безу следует, что существуют такие целые числа
и
, что
![{\displaystyle j=j_{1}N_{2}n_{2}+j_{2}N_{1}n_{1}\ ({\mbox{mod}}\ n)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e52dc78c0b6a6f72b22718848962788a7bfacefb)
и
Аналогично, пусть
и
— новые выходные индексы, задающиеся соотношениями
![{\displaystyle k_{1}=N_{2}k\ ({\mbox{mod}}\ n_{1}),\ k_{2}=N_{1}k\ ({\mbox{mod}}\ n_{2}).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8b2705377b966db1272a01bb161b850370eee646)
Тогда
![{\displaystyle k=n_{2}k_{1}+n_{1}k_{2}\ ({\mbox{mod}}\ n).}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bfccdb29a8178aae3757c856f14aa2ae0c5201fe)
С использованием обозначений
![{\displaystyle x'(j_{1},j_{2})=x(j_{1}N_{2}n_{2}+j_{2}N_{1}n_{1}),}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d2e8203daad3de2a4a8fe2b08502254ae95b1919)
![{\displaystyle X'(k_{1},k_{2})=X(n_{2}k_{1}+n_{1}k_{2}),}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ede7d0bc5bda227869e81af6577b1590a6292e38)
![{\displaystyle \beta =\omega ^{N_{2}\left(n_{2}\right)^{2}},}](https://wikimedia.org/api/rest_v1/media/math/render/svg/60bf44d75249334b6f9b6b97bfdf70df2e23e9a8)
![{\displaystyle \gamma =\omega ^{N_{1}\left(n_{1}\right)^{2}},}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2d18256110d15fd60ed1cdcd74bc595fb85be079)
исходная формула принимает вид
![{\displaystyle X'(k_{1},k_{2})=\sum \limits _{j_{1}=0}^{n_{1}-1}\sum \limits _{j_{2}=0}^{n_{2}-1}\beta ^{j_{1}k_{1}}\gamma ^{j_{2}k_{2}}x'(j_{1},j_{2}),}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e21a892cc8f1c3ce470eb65caa422c283f60908c)
то есть произошёл переход от одномерного преобразования длины
к двумерному преобразованию размера
. При этом число умножений и число сложений стало равно примерно
[3].
Примечания
Литература
- Блейхут, Р.. Быстрые алгоритмы цифровой обработки сигналов (рус.). — М.: Мир, 1989. — 448 с.