離散フーリエ変換

シェアする

  • このエントリーをはてなブックマークに追加
最近の記事
  • 10/21 【C#】寸法線の描画
  • 10/21 【C#】GraphicsPathの領域取得
  • 10/20 【C#】GraphicsPathの描画
  • 10/18 【C#】GraphicsPath
  • 10/17 【C#】Bitmap画像データの拡大縮小
  • 10/15 【C#】画像の座標系
  • 10/14 【C#】画像の上下左右反転、90,180,270度回転
  • 10/3 【C#】SplitContainerのPanel固定方法
  • 9/7 【Neural Network Console】学習データの出力方法
  • 9/3 Deep Learning向け学習画像撮り込みソフト公開
  • 9/1 【Neural Network Console】新規画像のDataset作成方法
  • 8/28 【Neural Network Console】GUI表示スケールの変更
  • 8/22 【Neural Network Console】CPU/GPU処理の設定切替
  • 8/21 【Neural Network Console】Learning Rate(学習率)の設定
  • 8/20 ソニーの無償AIソフト Neural Network Consoleの入手ダウンロード、インストール
  • 8/20 Deep Learning
  • 8/20
  • 8/19 古いバージョンのVisual Studio Community/Expressの入手ダウンロード
  • 8/19 CUDAの入手、ダウンロード、インストール方法
  • 8/17 【C#.NET】マイクロソフト仕様のアフィン変換
  • 8/5 【C#】ファイルを開くダイアログボックスの表示
  • 8/2 キャノンプリンターのCDトレイはどこ?!
  • 7/6 【参考書籍】画像処理・機械学習プログラミング OpenCV 3対応
  • 6/20 【Python,matplotlib】動くグラフをAnimationGifに保存する方法
  • 6/17 シグモイド関数の微分
  • 6/15 シグモイド関数
  • 6/13 合成関数の微分
  • 6/12 WordPressで数式エディタ風に数式を入力したい
  • 6/11 PythonをVisual Studioでインストールする方法
  • 6/9 【Python】OpenCVをAnacondaでインストール(Windows編)
  • 6/6 【Python】Anacondaで複数バージョンの環境切り替え
  • 6/6 画像センシング展2017に出展します。
  • 6/1 【Office365】Web版Outlookのフォントサイズ変更
  • 6/1 【Anaconda】モジュールのアップデートでエラー発生
  • 6/1 【Anaconda】コマンドリストの表示
  • 5/29 Windows10パソコン購入
  • 5/24 Anacondaのアンインストール
  • 5/24 【Jupyter Notebook】新規プログラムの作成
  • 5/23 【Python】開発環境の構築
  • 5/23 Pythonはじめました
  • 4/6 【Office365】Web版Outlookのスレッド表示を解除する方法
  • 4/5 【Excel】フーリエ解析(FFT)
  • 3/20 Canny edge detection
  • 3/20 【Excel2016】分析ツールの表示
  • 3/5 【Visual Studio】黒い背景色を白に変更する方法
  • 2/8 【Windows10】拡張モニタに表示されたウィンドウを元に戻す
  • 2/7 複素数の計算
  • 1/18 【Excel】棒グラフの横軸の目盛を0始まりにする
  • 1/16 【Excel】フーリエ変換
  • 1/6 【OpenCV】疑似カラー(カラーマップ)

  • フーリエ変換に関しては

    と説明してきて、ようやく本題の離散フーリエ変換となりました。

    フーリエ変換に関しては、数々の説明が本やHPでされていますが、なかなか理解するには至らず、ここでは私なりの理解で説明したいと思います。

    説明の途中でベクトルという言葉が出てきますが、厳密なベクトルではなく、複素数のイメージで説明しているように複素数を指している場合があるので、ご了承下さい。

    (このベクトルを個人的にはパワーベクトルと勝手に呼んでいます。向きと大きさを持つという意味で。)

    ここで、いきなり離散フーリエ変換の公式ですが、主に以下の3つの公式を目にします。

    Image-of-the-discrete-Fourier-transform-10

    どの公式もΣ以降は同じで離散フーリエ変換はeの指数部分がマイナス、逆離散フーリエ変換のeの指数部分がプラスとなっています。

    異なるのはΣの頭に付く係数のみです。

    3つも公式を並べると、どれを使えばいいの?みたいに思われるかもしれませんが、どれの公式も正解で使う公式によってパワースペクトルの大きさが異なってきますが、各周波数によって得られるパワースペクトルの相対的に大きさには変わりがありません。

    しかし、最初の式だけはパワースペクトルの値に意味を持つので、最初の式を用いて説明します。

    まず、公式のf(x)がフーリエ変換を行うデータの配列で、データ個数がN個となります。

    が周波数を表し、データの個数と同じ0~N-1分だけ周期が存在します。

    フーリエ変換を行った結果F(t)はある特定の周波数tの時の結果で、やはり0~N-1分だけの結果が存在し、この結果は複素数となります。

    それでは離散フーリエ変換の詳細を見てみたいと思います。

    まず、フーリエ変換の公式の複素数(e)の部分に着目します。

    離散フーリエ変換

    これを見ると複素数のイメージの部分でも説明しましたが、θの部分が

    フーリエ変換

    となっており、複素空間におけるベクトルがtの値により時計周り(回転角度が負の方向)に回転する速度が変化するイメージです。

    こんな感じ↓

    複素フーリエ変換

    tの値が大きくなると矢印の回転も速くなっていくのですが、途中から回転が逆になり、遅くなるように見えます。

    この現象はちょうど、車のタイヤをビデオカメラで撮影すると、タイヤが途中で止まって、さらに車の速度が速くなると、タイヤが逆転するように見えるのと似ています。

    次にf(x)の部分に着目すると複素数(e)の頭の部分にf(x)が付いているので、各xに対応した複素数の大きさ(ベクトル)がf(x)倍される事になります。

    離散フーリエ変換

    最後にΣでN個の値を合計して、Nで割っているので、複素数を平均している事が分かります。

    離散フーリエ変換

    ここで、データの個数が16個だけの簡単な例を示します。

    f(0)~f(15)のデータを以下のようにします。

    離散フーリエ変換

    このデータを周波数t(0~15)ごとに離散フーリエ変換を行います。

    (この結果がF(0)~F(15))

    離散フーリエ変換

    上図のように、複素平面に変換されたデータ(左側の黒い点)の平均へ向かうベクトル(赤い矢印)こそが、離散フーリエ変換した結果となります。

    つまり、離散フーリエ変換の結果は各周波数ごとの複素数となります。

    このベクトル(赤い矢印)の大きさが各周波数における波形の大きさ(パワースペクトル)でベクトルの向きが各周波数の位相となります。

    ただし、一般に、このパワースペクトルは各周波数の波形の振幅ではない事にご注意下さい。

    ここで着目して頂きたいのが、t=7 と t=9、t=6 と t=10、t=5 と t=11・・・がベクトル(赤い矢印)の大きさ同じで位相(ベクトルの向き)が±逆となる組み合わせが存在しています。

    さらにもう少し詳しく見ていきます。

    フーリエ変換とは?のページで紹介してますが、任意の波形を以下のように定めます。

    フーリエ変換とは

    ただし、

    N:データ個数

    t = 0、1、2、・・・・N-1

    n = 0、1、2、・・・・N-1

    At:tの時の振幅

    φt:tの時の位相

    t:データ全体に含まれる1周期分の波の個数。この値で周波数を調整します。

    この時、波形の位相φが変化すると、フーリエ変換を行うと、どのように変化するのか?

    周波数t=2の時、位相を変えながらフーリエ変換を行う例を以下に示します。

    離散フーリエ変換

    上図の左側が複素平面で右側が実数平面です。

    当然ながら、途中に出てくるベクトル(赤い矢印)の角度(位相)が変化します。

    次に振幅を変えるとどうなるか?やってみると

    離散フーリエ変換

    途中に出てくるベクトル(赤い矢印)の大きさ(パワースペクトル)が変化します。

    このパワースペクトルの大きさが、本記事の上部で紹介している離散フーリエ変換の公式の一番最初に出てくる公式を用いると、パワースペクトルの大きさは信号の振幅の半分の大きさになるのが、好きなとこ。

    ここまでは、普通な感じでしょうか。

    次からが、フーリエ変換を使う大事なところ!?

    離散フーリエ変換を行う特定の周波数(ここではt = 2の時)に着目し、それ以外の周波数の信号をフーリエ変換するとどうなるのか?見てみると...

    離散フーリエ変換

    上図のように、信号の周波数とフーリエ変換を行う周波数とが一致した時のみパワースペクトルが出現し、それ以外はパワースペクトルの大きさが0となります。

    上図を見ても分かるように、周波数が一致しないと、複素平面上で中心から放射状にデータを打ち消しあう作用が働き、特定の周波数のみの成分を抽出する事が可能となります。

    この辺が、フーリエ変換に複素数を使うのが好きなところ。

    今度は、各データにバイアス成分というか、直流成分というか、ただのオフセットを加えて変化させてみます。

    離散フーリエ変換

    途中に出てくるベクトル(赤い矢印)の大きさ(パワースペクトル)が変化しません!

    つまり、信号の周波数が分かっていれば、バイアス成分の影響を受ける事なく、信号の位相を抽出する事ができます。

    この性質は、フーリエ変換の位相を使った処理では大事なところです。

    さらに、周波数t=2の時の例を示してきましたが、この信号に周波数t=2以外の信号を加えたら、周波数t=2の時のフーリエ変換がどうなるか?見ていきます。

    離散フーリエ変換

    上図右側の緑色の線が周波数t=2の信号、水色の線が周波数t=2以外の信号、

    青色の線が足し合わせた信号です。

    これを見てもやはり、途中に出てくるベクトル(赤い矢印)の大きさ(パワースペクトル)が変化しません!

    もはや複素平面の黒い点はバラバラに見えるのですが、他の周波数の影響を受けずに周波数t=2の信号成分のみを抽出してくれています。

    この性質が、よくフーリエ変換を行って、各周波数のパワースペクトルを解析する事で、周波数の特性を使った処理に使われる要因です。

    ただし、ここで挙げている例は、少し意図的な部分もあって、合成している波形は全て整数倍で示される周波数の波形を足し合わせた例を示しています。

    しかし、実際の信号では、必ずしも整数倍の周波数となる訳もなく、整数倍でない周波数が加わると、複素平面の円の放射方向にデータを打消し合わないなので、パワースペクトルにも影響が出るのでご注意下さい。

    と、フーリエ変換については、少し前までは、各周波数成分との正規直交との射影をとる事で、各周波数成分を抽出する!ぐらいの認識でいたのですが、これだといまいちビジュアル的にイメージできません。

    ここに書いてあるイメージだと、なんだかよく分からなかった複素数もビジュアル的にイメージできて、ようやくフーリエ変換を理解できた気になってます。

    ちなみに、このフーリエ変換のイメージ、自称 ぐるぐるフーリエ変換

    フーリエ変換へ戻る

    コメント

    1. […] ーリエ変換を行うのが離散フーリエ変換となります。 […]