Nevertheless, Bruun's algorithm illustrates an alternative algorithmic framework that can express both itself and the Cooley-Tukey algorithm, and thus provides an interesting perspective on FFTs that permits mixtures of the two algorithms and other generalizations.
Table of contents |
2 Recursive Factorizations and FFTs 3 The Bruun Factorization 4 References |
Recall that the DFT is defined by the formula:
A Polynomial Approach to the DFT
For convenience, let us denote the n roots of unity by ωnk (k=0..n-1):
In order to compute the DFT, we need to evaluate the remainder of X(z) modulo n monomials as described above. Evaluating these remainders one by one is equivalent to the evaluating the usual DFT formula directly, and requires O(n2) operations. However, one can combine these remainders recursively to reduce the cost, using the following trick: if we want to evaluate X(z) modulo two polynomials U(z) and V(z), we can first take the remainder modulo their product U(z) V(z), which reduces the degree of the polynomial X(z) and makes subsequent modulo operations less computationally expensive.
The product of all of the monomials (z - ωnj) for j=0..n-1 is simply zn-1 (whose roots are clearly the n roots of unity). One then wishes to find a recursive factorization of zn-1 into polynomials of few terms and smaller and smaller degree. To compute the DFT, one takes X(z) modulo each level of this factorization in turn, recursively, until one arrives at the monomials and the final result. If each level of the factorization splits every polynomial into an O(1) (constant-bounded) number of smaller polynomials, each with an O(1) number of nonzero coefficients, then the modulo operations for that level take O(n) time; since there will be a logarithmic number of levels, the overall complexity is O(n log n).
More explicitly, suppose for example that zn-1 = F1(z) F2(z) F3(z), and that Fk(z) = Fk,1(z) Fk,2(z), and so on. The corresponding FFT algorithm would consist of first computing Xk(z) = X(z) mod Fk(z), then computing Xk,j(z) = Xk(z) mod Fk,j(z), and so on, recursively creating more and more remainder polynomials of smaller and smaller degree until one arrives at the final degree-0 results.
Moreover, as long as the polynomial factors at each stage are relatively prime (which for polynomials means that they have no common roots), one can construct a dual algorithm by reversing the process with the Chinese Remainder Theorem.
The standard decimation-in-frequency (DIF) radix-r Cooley-Tukey algorithm corresponds closely to a recursive factorization. For example, radix-2 DIF Cooley-Tukey factors zn-1 into F1 = (zn/2-1) and F2 = (zn/2+1). These modulo operations reduce the degree of X(z) by 2, which corresponds to dividing the problem size by 2. Instead of recursively factorizing F2 directly, though, Cooley-Tukey instead first computes X2(z ωn), shifting all the roots (by a twiddle factor) so that it can apply the recursive factorization of F1 to both subproblems. That is, Cooley-Tukey ensures that all subproblems are also DFTs, whereas this is not generally true for an arbitrary recursive factorization (such as Bruun's, below).
The basic Bruun algorithm for powers of two factorizes zn-1 recursively via the rules:
Moreover, since all of these polynomials have purely real coefficients (until the very last stage), they automatically exploit the special case where the inputs xk are purely real to save roughly a factor of two in computation and storage. One can also take straightforward advantage of the case of real-symmetric data for computing the discrete cosine transform (Chen and Sorensen, 1992).
The Bruun factorization, and thus the Bruun FFT algorithm, was generalized to handle arbitrary even composite lengths, i.e. dividing the polynomial degree by an arbitrary radix (factor), as follows. First, we define a set of polynomials φn,α(z) for positive integers n and for α in [0,1) by:
Cooley-Tukey as polynomial factorization
The Bruun Factorization
where a is an real constant with |a| ≤ 2. At the end of the recursion, for m=1, you are left with degree-2 polynomials that can then be evaluated modulo two roots (z - ωnj) for each polynomial. Thus, at each recursive stage, all of the polynomials are factorized into two parts of half the degree, each of which has at most three nonzero terms, leading to an O(n log n) algorithm for the FFT.Generalization to arbitrary radices
Note that all of the polynomials that appear in the Bruun factorization above can be written in this form. These polynomials can be recursively factorized for a factor (radix) r via:
References