社会人博士の深層学習ブログ

深層学習を使った環境音認識研究で、働きながら博士号を取得しました

【信号処理】フーリエ変換、短時間フーリエ変換のイメージ

教科書には厳密な定義や説明がなされていますが、直感的によくわからないという人は意外と多いのではないかと思います。実際に自分も大学でちゃんと単位も取りましたが、仕事で使おうとするといまいちイメージがわいていませんでした。

なので、ここでは、厳密な説明は教科書に譲るとして、研究や仕事で使うにあたって沸いた疑問と、それに対する直感的なイメージを書きたいと思います。

 

※2021年6月17日追記

あのモーリー・ロバートソン大先生にtwitterで、よくわからねえとお叱りを受けてしまいました。。たしかに、位相といきなり言われても、普段使わない方からするとわかりにくいですね。。精進します!

 

 

そもそもフーリエ変換とは

ざっくりいうと、以下のような矩形波があったとすると、それを周波数の違う正弦波足し合わせで表現することです。

それぞれの周波数の正弦波の振幅や位相が違えば、足し合わせてできる波形も異なりますので、あらゆる波形を表現できます。

f:id:ys0510:20191113181743p:plain

振幅はわかるけど、位相ってそもそもなんだっけ?

様々な周波数の正弦波を足し合わせるときに、重ね方によっては互いに弱めあってしまう場合がありますよね?

つまり、その正弦波がいつ始まるかが重要なわけです。

その正弦波の波形がどこから始まっているのかを表すのが位相であり、下図のように1周期を360°(2π rad)として定義されています。以下の例では、正弦波が切りのいいところから始まっていますので、位相は0°です。

途中から始まっていた場合は、0°以外の位相になります。

 

f:id:ys0510:20191113183737p:plain

位相はわかったけど、フーリエ変換とはどう関係あるの?

ここで、フーリエ変換の公式を見てみると、自然対数eが出てきています。以下のオイラーの公式より、サイン、コサインで表されており、xが周波数を表しています。また、虚数iがあるので、複素数で表されています。

 オイラーの公式

ここで、(離散)フーリエ変換の式を見てみます。

    F(t)= \sum_{x=0}^{N-1} f(x) e^{-i\frac{2 \pi t x}{N}} \quad \quad

eの項がxで積分されていることが分かります。eで表されたサイン、コサインが周波数で積分されており、複素数で表現されています。ちなみにNは、周波数ビンの数を表していて、256, 512, 1024などの値がよく使われます。

つまり、各周波数成分に対して、それぞれ以下のような複素数が得られます。

得られた複素数の振幅と位相が、各正弦波の振幅と位相を表しているのです。

f:id:ys0510:20191113224158p:plain

通常、人間の耳には位相はあまり区別できないので、以下のように、横軸に周波数、縦軸に振幅をとったグラフに描画することが多いです。昔はCDコンポの表示画面によく表示されていましたね。

f:id:ys0510:20191113230320p:plain

 

 

波形が時間変化する場合はどうするの?

さて、フーリエ変換はサインコサインで表されていたかと思いますが、正弦波が永遠に続くものとして計算されてしまっています。実際には、以下のように、波形は時間変化するのが普通です。そこで、現実に音声や音楽などを分析しようと思うと、短時間フーリエ変換というものがよく使われます。

フーリエ変換では、その瞬間の波形が永遠に続くものとして計算されてしまうので、短時間の窓に区切って細かくフーリエ変換しようというものです。

短時間でフーリエ変換すると、下図中央に示すように、窓ごとに振幅のグラフが得られます。見やすくするために、振幅の大きい成分を色付けして二次元のカラーマップにしたものがスぺクトログラムといわれ、短時間フーリエ変換の結果表示としてもっともよく使われています。

 

f:id:ys0510:20191113230025p:plain

 

窓の時間はどれくらいにすればいいの?

ここからは少し実用的な話になってきますが、窓の時間によって得られる情報の質が変わってきます。

極端なことを言うと、わざわざ小さい窓に区切らずに全部で1つの窓に区切ってもいいわけですが、そうすると全部が平均された一つのフーリエ変換の結果しか得ることができませんので、いつ音色が変化したか、いつだれかが話したかなどの情報が消えてしまいます。

逆に、じゃあ限りなく窓の時間を区切ればいいかというとそうでもなく、あまりにも窓が短いと、低周波成分が計算できなくなります。

つまり、解析したい音の周波数がちゃんと収まる程度の窓にするのがよく、音声認識の場合が20~40ms程度にすることが多いそうです。

 

最後に

音の信号処理や機械学習を行うにあたり、必須の前処理を自分なりにまとめてみました。

何かわからない点や、間違っている点があれば、コメントいただけると非常にありがたいです。