The DFT transforms a sequence of \(N\) complex (time-domain) numbers \({x_0, x_1, \ldots, x_{N-1}}\) into a second sequence of complex (frequency-domain) numbers \({X_0, X_1, \ldots, X_{N-1}}\) as shown in the following equation. Because each sample \(X_k\) requires \(N\) complex multiplications with the fixed “twiddle factors” \(\exp(-i2\pi kn/N)\), the computation requires \(N^2\) multiplications overall, leading to the computational complexity of \(O(N^2)\).
Direct computation of the preceding equation can be feasible for cases where \(N\) is not too large. You can write the preceding equation as a matrix-vector multiplication where an \(N\times N\) matrix collects the twiddle factors, and an \(N\times 1\) vector collects the samples \(x_n\). Indeed, a following section shows a “direct form” solution like this for a Versal DFT design.