難解かな、フーリエ変換
 K氏に助けてもらいながら、本日〆切の画像処理のレポートを考えています。

 作るプログラムは、
二つの画像のPower成分と位相成分とを合成させるプログラム

なのですが、まずはフーリエ変換をプログラム的にどう処理しているのかから考えました(授業でも説明していただいているはずですが、どうも右から左へ抜けてしまったようで・・・)。

 しかし!プログラムを考える以前に、FFT1.h、FFT2.hが何をしているか、という時点で、何時間も悩んでおります。

 とりあえずわたっていることを整理しましょう。
・FFT1.hは、一次元のフーリエ変換を行っている。
・FFT2.hは、FFT1.hを使って、二次元のフーリエ変換を行っている。
程度のことはわかった(つもりになっている)のですが、
・FFT2.hのプログラムでは、
void FFT2( int flag )
/* 元データを data, jdata, num_of_data に代入してから使う */
/* flag = 1 : 2次元 FFT, flag = -1 : 2次元逆 FFT */
{
int i, j; /* ループ変数 */
static double re[FFT_MAX], im[FFT_MAX]; /* 作業変数 */

for ( i = 0; i < num_of_data; i ++ ){
for ( j = 0; j < num_of_data; j ++ ){
re[j] = data[i][j];←実数部の作業変数にデータを入れている
im[j] = jdata[i][j];←虚数部の作業変数にデータを入れている
}
FFT1( re, im, num_of_data, flag );←FFT1関数を発動
for ( j = 0; j < num_of_data; j ++ ){
data[i][j] = re[j];←今度は、FFT処理したデータを戻している
jdata[i][j] = im[j];←同上
}
}←ここで、一旦、すべての配列のデータがFFT処理されたことになる。
 ここで、わからないのは、以下。
for ( i = 0; i < num_of_data; i ++ ){
for ( j = 0; j < num_of_data; j ++ ){
re[j] = data[j][i];←ここでは、FFT処理したデータを作業部に入れている!
im[j] = jdata[j][i];←(続き)それも、今度は縦方向!なぜ?
}
FFT1( re, im, num_of_data, flag );←ここで、またFFT処理をしている
for ( j = 0; j < num_of_data; j ++ ){
data[j][i] = re[j];←ここで、FFT処理済データをさらにFFT処理してデータを戻す
jdata[j][i] = im[j];←同上
}
}
}

 なぜ、このようにしているのか。それは、講義ノートに答えがあった。重積分しているからだ!つまり、2回サンメンションしている、ということ(デジタルは非連続なので)。二次元のフーリエ変換は、2回サンメンションしないとフーリエ変換にならないんだ!

 

 




 今回は、何人かの力を借りて、なんとか完成。
 プログラム作成以前に、フーリエ変換について、かなり調べたので、ちょっとはわかったかもしれない。
a0014712_4413111.jpg


 フーリエ変換、オイラーの公式、マクローリン展開と、数学って、おもしろいな、と思った。もっと勉強したいな。

◎参考文献・リンク
うさぎでもわかるフーリエ変換
オイラーの公式(Wikipedia)
第5 回 フーリエ変換の実際の計算法(PDF). 断層映像研究会雑誌27巻3号,2000
http://www.metro-hs.ac.jp/rs/sinohara/
[PR]
by viewtleaf | 2005-02-10 01:30 | 画像処理
<< 中間発表、近づく もうすぐ修論の中間発表 >>



毎日起こった出来事を記入し、「振り返り」に活用したいと思います。写真は我が子の作品。
by viewtleaf
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31