- 締切済み
2次元データの複素フーリエ変換するコードの作成
数値計算等の2次元や3次元の空間データ(実数)をFFTによって複素フーリエ変換する実際のプログラム化についてお尋ねします。プログラムの実装ということなので実際的な質問で長文になっています。すみません。 まず、手持ちに1次元のFFTプログラムがあるということを前提とします(逆フーリエ変換すると、元の実数の系列が出ることは確認済のコード)。そして2次元配列の実数のデータがあるとします。この2次元のデータを2次元の複素フーリエ成分に変換することが目的です。(私の分野では波数空間への展開ということになり、複素数ですから位相情報も含まれることになります。) 例えば、x,y方向に16x16のデータあるとすると、 do j=1,16 ここでjを固定してi:1~16の実数データについて1次元のFFTをかける。 このとき、FFTにかける16個の実数データを複素数の実部に入れて、虚部はゼロとする。 FFTの出力も複素数となっている。 ここで出てくる複素フーリエ変換の結果は実部・虚部で前半(0~7)であり、後半(8~15)はその対称とか点対称(符号が逆)とかになっている(虚部をゼロとしているから)。それを複素数の2次元配列として保存する。 enddo 次いで、 do i=1,16 iを固定してj方向にFFTをかける。このとき、FFTに放り込むデータは上記の複素フーリエ変換の出力結果である2次元データを使う。具体的には複素数の2次元データをj方向の1次元の複素数配列にコピーしてFFTをかけて、その出力結果を新たな2次元配列の複素数に保存する。 enddo この結果、得られた2次元の複素数のデータが、私の所望のデータである、ということです。 式が指し示すとおりのことをすればいいのだ、ということに尽きるのだろうと思いますが、アルゴリズム的にアンバランスのように見えてこれでいいのかなと思えてしまいます。最初に虚部をゼロにするというようなこととかです。そのため確信が持てません。また、結果を見てもわかりにくい面があります。 このような考え方で実装するということいいのでしょうか。全く間違っているでしょうか。もしその場合、考え方の間違いを指摘して頂けると助かりますが(根本的な間違いだったら指摘しようがないということにもなりますが。) また、例えば、始めから実数の2次元配列をすぐに2次元複素数の実部に入れて、虚部をゼロとしてそこからコード方がすっきりするのかなと思いますが。 この辺が確定すると、3次元は同じことということになります。 サンプルコードがネットに出ているという面もありますが、自分でやる方が組み込みやすいのでお尋ねしました。 長文で申し訳ありませんが、よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- imoriimori
- ベストアンサー率54% (309/570)
そのやり方で良いと思いますよ。 ただ、もしかしたら最後にx方向とy方向の転置が必要かも知れません。 私がやってみると、そういうことになってしまったので(私のミスかも知れませんが)。 「また、例えば、始めから実数の2次元配列をすぐに2次元複素数の実部に入れて、虚部をゼロとしてそこからコード方がすっきりするのかなと思いますが。」については私はそういうのを知りません。専門家のご登場待ちとなります。
お礼
回答ありがとうございます。お礼が遅れてすみません。”最後に転置”というところをもう少し詳しく教えて頂ければと思います。最後の出力結果(複素数の2次元配列)の加工ということでしょうか。 また、実験された結果で気がつかれたということだろうと思います。どのように実験されたのでしょうか。例えば、スペクトル情報を先に与えて、それからなんらかの方法で空間データを作成し、その2次元のフーリエ変換の結果が最初に与えたスペクトル情報と合致することの確認かなと思います。その”なんらかの方法”がフーリエ逆変換というわけにはいかないと思います。その妥当性をチェックしようとしているからですが。いかがでしょうか。