ケィオスの時系列解析メモランダム

時系列解析、生体情報解析などをやわらかく語ります

【時系列解析の基礎数学】離散フーリエ変換の直交性:内積で理解

 離散フーリエ変換(discrete Fourier transform: DFT)を理解するうえで、「ベクトルの内積」の考え方が基礎になります。なぜなら、離散フーリエ変換は離散時系列と規則的な振動成分を表す「基底ベクトル」の内積で表されているからです。連続フーリエ変換も同じく内積ですが、ここでは、離散からはじめます。

 内積は、ベクトルの直交を判定したり、ベクトルを特定の方向の成分に分解したりできる便利な道具です。

 下の左の図では、2つのベクトル  \mathbf{a} \mathbf{b}内積がゼロだと、両者は直交することを描いており、右の図では、内積を使えば、ベクトル  \mathbf{a} を、2つの直交する単位ベクトル  \mathbf{e} _ 1 \mathbf{e} _ 2 の向きの大きさ (2方向に分解したときの成分) がわかることを描いています。

ベクトルの内積のイメージ

離散フーリエ変換の定義

 離散フーリエ変換 (discrete Fourier transform: DFT) では、長さ \displaystyle{
N
} の離散時系列 \displaystyle{
\left\{ x [n ] \right\} _ {n=0}^ N
} を周波数領域の成分 \displaystyle{
X[k]
} に変換します。

  i虚数単位として、式の定義は以下です。

\displaystyle{
\begin{equation}
X[k] = \sum_{n=0}^{N-1} x[n] e^{-i \frac{2\pi}{N} k n}, \quad \left(k = 0,1,\dots,N-1\right)
\end{equation}
}

その逆変換(inverse discrete Fourier transform: IDFT)の定義は以下です。

\displaystyle{
\begin{equation}
x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{i \frac{2\pi}{N} k n}, \quad \left(n = 0,1,\dots,N-1\right)
\end{equation}
}

ベクトルの内積との関係

 フーリエ変換に登場する

\displaystyle{
\begin{equation}
e^{i \frac{2\pi}{N} k n} \quad \left(n = 0,1,\dots,N-1\right)
\end{equation}
}

をベクトルのように並べて書いてみます。

\displaystyle{
\begin{equation}
\mathbf{v}_k =
\begin{bmatrix}
e^{i \frac{2\pi}{N} k \cdot 0} \\
e^{i \frac{2\pi}{N} k \cdot 1} \\
e^{i \frac{2\pi}{N} k \cdot 2} \\
\vdots \\
e^{i \frac{2\pi}{N} k (N-1)}
\end{bmatrix}
\end{equation}
}

これは、基底ベクトルと呼ばれます。

複素数ベクトルの内積

 要素が複素数 n 次元列ベクトル

\displaystyle{
\boldsymbol{a}=\left(\begin{array}{c}
a_1 \\
a_2 \\
\vdots \\
a_n
\end{array}\right), \ \boldsymbol{b}=\left(\begin{array}{c}
b_1 \\
b_2 \\
\vdots \\
b_n
\end{array}\right)
}

内積は、以下の式で定義されます。

\displaystyle{
\begin{align}
\boldsymbol{a} \cdot \boldsymbol{b} &={ }^t \boldsymbol{a} \overline{\boldsymbol{b}}= \left(\begin{array}{llll} a_1 & a_2 & \cdots & a_n\end{array}\right)\left(\begin{array}{c} \overline{b}_1 \\ \overline{b}_2 \\ \vdots \\ \overline{b}_n\end{array}\right) \\ 
&= a_1 \overline{b}_1+a_2 \overline{b}_2+\cdots a_n \overline{b}_n \\
&=\sum_{i=1}^n a_i \overline{b}_i \\
\end{align}
}

ここで、 \overline{b} は、b複素共役を表します。複素共役は、\displaystyle{
\alpha
}\displaystyle{
\beta
} を実数、\displaystyle{
z
}複素数として、以下のようになります。

\displaystyle{
\begin{align}
\overline{(\alpha + i \beta) } = \alpha - i \beta \\
\overline{\left( e^{z} \right)} = e^{\overline{z}}
\end{align}
}

 また、\displaystyle{
\boldsymbol{a}
} の大きさの2乗は、

\displaystyle{
\left|\boldsymbol{a} \right|^2 = \boldsymbol{a} \cdot {\boldsymbol{a}}
}

 ベクトルの内積の表現を使えば、 以下の2つのベクトル

\displaystyle{
\boldsymbol{x}=\left(\begin{array}{c}
x [0] \\
x [1]  \\
\vdots \\
x [N-1] 
\end{array}\right), \ \mathbf{v}_k =\left(\begin{array}{c}
e^{i \frac{2\pi}{N} k \cdot 0} \\
e^{i \frac{2\pi}{N} k \cdot 1} \\
\vdots \\
e^{i \frac{2\pi}{N} k \cdot (N-1)}
\end{array}\right)
}

内積が、フーリエ変換になっています。

\displaystyle{
\begin{align}
\boldsymbol{x} \cdot {\mathbf{v}}_k &= x [0] \, e^{-i \frac{2\pi}{N} k \cdot 0}+x [1] \, e^{-i \frac{2\pi}{N} k \cdot 1}+\cdots x [N-1] \, e^{-i \frac{2\pi}{N} k \cdot N-1} \\
&=\sum_{n=0}^{N-1} x[n] \, e^{-i \frac{2\pi}{N} k n}
\end{align}
}

 つまり、フーリエ変換は、内積の計算をしているだけです。

 \mathbf{v} _ kに関する公式

 フーリエ変換を理解したり、手計算で考察したりするときに、印象に残しておいた方が良い式をまとめます。公式として覚えなければならないことはありませんが、ベクトルとして直感的なイメージをもてれば、結果を予想できるようになります。

 \mathbf{v} _ k の大きさ

\displaystyle{
\begin{equation}
\mathbf{v}_k =
\begin{bmatrix}
e^{i \frac{2\pi}{N} k \cdot 0} \\
e^{i \frac{2\pi}{N} k \cdot 1} \\
e^{i \frac{2\pi}{N} k \cdot 2} \\
\vdots \\
e^{i \frac{2\pi}{N} k (N-1)}
\end{bmatrix}
\end{equation}
}

の大きさの2乗を計算します。

\displaystyle{
\begin{align}
\left|\mathbf{v}_k\right|^2 &= \mathbf{v}_k \cdot {\mathbf{v}}_k \\
&= \sum_{n=0}^{N-1} e^{i \frac{2\pi k}{N} n} \cdot e^{-\,i \frac{2\pi k}{N} n} \\
&= \sum_{n=0}^{N-1}\exp \left( i \frac{2\pi k}{N} n -\,i \frac{2\pi k}{N} n \right) \\
&= \sum_{n=0}^{N-1}\exp \left( 0 \right) \\
&= \sum_{n=0}^{N-1} 1 \\
&= N
\end{align}
}

 したがって、

\displaystyle{
\begin{align}
\left|\mathbf{v}_k\right|^2 &= \mathbf{v}_k \cdot {\mathbf{v}_k} = N\\
\left|\mathbf{v}_k\right| &= \sqrt{N}
\end{align}
}

 この結果から「なんだよ、\displaystyle{
\mathbf{v} _ k
} って大きさ1の単位ベクトルになってね~のかよ~」と、文句を言いたいかもしれません。単位ベクトルにするには、大きさ \displaystyle{
\sqrt{N}
} で割る必要があります。

 そして、フーリエ変換を、以下のように定義したほうが、ベクトルとしての表現はきれいです。

\displaystyle{
\begin{align}
X[k] &= \frac{1}{\sqrt{N}} \sum_{n=0}^{N-1} x[n] e^{-i \frac{2\pi}{N} k n} \\
x[n] &= \frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} X[k] e^{i \frac{2\pi}{N} k n}
\end{align}
}

しかし、最初に紹介した表現

\displaystyle{
\begin{align}
X[k] &= \sum_{n=0}^{N-1} x[n] e^{-i \frac{2\pi}{N} k n} \\
x[n] &= \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{i \frac{2\pi}{N} k n}
\end{align}
}

のほうがよくつかわれます。フーリエ変換の定義には種類が違うものがあることに注意してください。

 k \neq k'のときの内積

 \displaystyle{
\mathbf{v}  _  k \cdot {\mathbf{v}}  _  {k'}
} を計算します。

\displaystyle{
\begin{align}
\mathbf{v}_k \cdot {\mathbf{v}}_{k'} &= \sum_{n=0}^{N-1} e^{i \frac{2\pi k}{N} n} \cdot e^{-\,i \frac{2\pi k'}{N} n} \\
&= \sum_{n=0}^{N-1}\exp \left( i \frac{2\pi k}{N} n -\,i \frac{2\pi k'}{N} n \right) \\
&= \sum_{n=0}^{N-1}\exp \left( i \frac{2\pi (k-k')}{N} n \right) \\
&= e^{i \frac{2\pi (k-k')}{N}\cdot 0} + e^{i \frac{2\pi (k-k')}{N}\cdot 1} + e^{i \frac{2\pi (k-k')}{N}\cdot 2} + \cdots + e^{i \frac{2\pi (k-k')}{N}\cdot (N-1)} \\
&= \frac{\displaystyle 1- e^{i 2\pi (k-k')}}{\displaystyle1- e^{i \frac{2\pi (k-k')}{N}}} \\
\end{align}
}

ここで、等比数列の和の公式を使いましたが、公比が1のときは等比数列の和の公式は使えないので、

\displaystyle{
e^{i \frac{2\pi (k-k')}{N}} \neq 1
}

である必要があります。つまり、\displaystyle{
k-k'
} N の倍数でない必要があります。

 最後の式の分子にある \displaystyle{
e^ {i 2\pi (k-k')}
} は、

\displaystyle{
e^{i 2\pi (k-k')} = \cos(2\pi (k-k')) + i \sin (2\pi (k-k'))
}

です。 k \neq k' のとき、 k - k' \neq 0 は 整数なので、

\displaystyle{
e^{i 2\pi (k-k')} = \cos(2\pi (k-k')) + i \sin (2\pi (k-k')) = 1
}

です。

 したがって、\displaystyle{
k-k'
} N の倍数でない整数のとき、

\displaystyle{
\begin{align}
\mathbf{v}_k \cdot {\mathbf{v}}_{k'} &= 0
\end{align}
}

離散フーリエ変換のベクトルとしてのイメージ

まとめ

 離散フーリエ変換は、長さ N のデータ(数列) \mathbf{x} を、特定の基底ベクトル  \mathbf{v} _ k が示す方向へ分解する計算です。

 これは、データを周波数の異なる「基本的な波」の組み合わせとして表すことに相当します。

 異なる基底ベクトル  \mathbf{v} _ k \mathbf{v} _ {k'}内積を計算すると、次のようになります:

\displaystyle{
\begin{align}
\mathbf{v}_k \cdot {\mathbf{v}}_{k'} &= 0
\end{align}
}

ただし,\displaystyle{
k-k'
} N の倍数でない整数のときに限ります。

 この関係は「異なる基底ベクトル同士が直交している」ことを意味します。

 最初に説明したように、内積の考え方を使うと、ベクトルが直交しているかどうかを判定したり、特定の方向の成分を取り出したりすることができます。このイメージを持つことで、フーリエ変換の仕組みをより直感的に理解しやすくなります。