プログラミングで DFT / IDFT を計算する際は通常はFFT (Fast Fourier Transform : 高速フーリエ変換) と IFFT (逆高速フーリエ変換) を利用します。
ただし、どうしても FFT /IFFT を使いたくない場合は

\[ \textrm{DFT}[k] = \textrm{A}[k] + j \cdot \textrm{B}[k] \]

の様に DFT 係数を実数成分 $\textrm{A}[k]$ と虚数成分 $\textrm{B}[k]$ に分けてプログラミングすると楽です。
オイラー公式を使うと $\textrm{A}[k]$ と $\textrm{B}[k]$ は次の様になります。

$\textrm{A}[k]$ と $\textrm{B}[k]$ の求め方 \begin{align*} \textrm{A}[k] &= \frac{1}{\textrm{N}} \sum_{i=0}^{\textrm{N}-1} \left \{ f[i] \cdot \cos( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) \right \} \\[10pt] \textrm{B}[k] &= -\frac{1}{\textrm{N}} \sum_{i=0}^{\textrm{N}-1} \left \{ f[i] \cdot \sin( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) \right \} \end{align*}

ここで

$f[i]$ ・・・ 周期 $\textrm{N}$ [点] の周期性時間領域ディジタル信号

$\textrm{A}[k]$ ・・・$k$ 番目のDFT係数の実数成分、実数の定数

$\textrm{B}[k]$ ・・・$k$ 番目のDFT係数の虚数成分、実数の定数

このようにすると DFT の演算中に複素数が含まれなくなるので、普通に外側が $k$、内側が $i$ の 2 重 for ループを作って $\textrm{A}[k]$ と $\textrm{B}[k]$ を求められます。

また次の様にして DFT 係数の絶対値と偏角も簡単に求められます。

絶対値と偏角の求め方 \begin{align*} |\textrm{DFT}[k]| &= \textrm{sqrt}(\textrm{A}[k]*\textrm{A}[k] + \textrm{B}[k]*\textrm{B}[k]) \\[10pt] \angle \ \textrm{DFT}[k] &= \textrm{atan2}(\textrm{B}[k],\textrm{A}[k]) \end{align*}

※ プログラミング言語によっては $\textrm{atan2}(\textrm{A}[k],\textrm{B}[k])$ の順の場合もあります

同様に IDFT を $\textrm{A}[k]$ と $\textrm{B}[k]$ を使って書き直すと次のようになります。

$\textrm{A}[k]$ と $\textrm{B}[k]$ を用いた IDFT \[ f[i] = \sum_{k=0}^{\textrm{N}-1} \left \{ \textrm{A}[k] \cdot \cos( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) - \textrm{B}[k] \cdot \sin( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) \right \} \]

ここで

$f[i]$ ・・・ 周期 $\textrm{N}$ [点] の周期性時間領域ディジタル信号

$\textrm{A}[k]$ ・・・$k$ 番目のDFT係数の実数成分、実数の定数

$\textrm{B}[k]$ ・・・$k$ 番目のDFT係数の虚数成分、実数の定数

この場合は外側が $i$、内側が $k$ の 2 重 for ループを作って $\textrm{A}[k]$ と $\textrm{B}[k]$ から $f[i]$ を復元できます。


(参考) 周期性時間領域ディジタル信号が複素信号の場合


$f[i]$が複素信号、つまり

\[ f[i] = a[i] + j \cdot b[i] \]

の場合のDFTは次のようになります

複素信号の DFT \begin{align*} \textrm{A}[k] &= \frac{1}{\textrm{N}} \sum_{i=0}^{\textrm{N}-1} \left \{ a[i] \cdot \cos( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) + b[i] \cdot \sin( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) \right \} \\[5pt] \textrm{B}[k] &= \frac{1}{\textrm{N}} \sum_{i=0}^{\textrm{N}-1} \left \{ -a[i] \cdot \sin( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) + b[i] \cdot \cos( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) \right \} \end{align*}

ここで

$a[i]$ ・・・ 周期 $\textrm{N}$ [点] の周期性時間領域複素ディジタル信号 $f[i]$ の実数成分

$b[i]$ ・・・ 周期 $\textrm{N}$ [点] の周期性時間領域複素ディジタル信号 $f[i]$ の虚数成分

$\textrm{A}[k]$ ・・・$k$ 番目のDFT係数の実数成分、実数の定数

$\textrm{B}[k]$ ・・・$k$ 番目のDFT係数の虚数成分、実数の定数

IDFTは次の通りです。

複素信号の IDFT \begin{align*} a[i] &= \sum_{k=0}^{\textrm{N}-1} \left \{ \textrm{A}[k] \cdot \cos( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) - \textrm{B}[k] \cdot \sin( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) \right \} \\[5pt] b[i] &= \sum_{k=0}^{\textrm{N}-1} \left \{ \textrm{A}[k] \cdot \sin( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) + \textrm{B}[k] \cdot \cos( k \cdot \frac{2\pi}{\textrm{N}} \cdot i ) \right \} \end{align*}

ここで

$a[i]$ ・・・ 周期 $\textrm{N}$ [点] の周期性時間領域複素ディジタル信号 $f[i]$ の実数成分

$b[i]$ ・・・ 周期 $\textrm{N}$ [点] の周期性時間領域複素ディジタル信号 $f[i]$ の虚数成分

$\textrm{A}[k]$ ・・・$k$ 番目のDFT係数の実数成分、実数の定数

$\textrm{B}[k]$ ・・・$k$ 番目のDFT係数の虚数成分、実数の定数