プログラミングで 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 係数の絶対値と偏角も簡単に求められます。
同様に 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係数の虚数成分、実数の定数