• 締切済み

2次元データのフーリエ変換とデータ形式について

画像やエクセルシートのように平面2次元的に広がっているデータがあります。このデータについて2回(2方向)のフーリエ変換を取るのですが、1回(1方向)のフーリエ変換プログラムを2回(2方向)することになると思います。 複素フーリエなので、1回目は複素数型の配列の実部に解析したいデータ系列、虚部はゼロとしてフーリエ変換します。この場合の出力値(複素数配列)で意味があるのは、実部、虚部の配列の前半だけであり、後半は前半の対称とか点対称になっています(前半が分かれば後半がわかるのだから情報量としてはゼロ)。 1回目の出力結果を2回目の変換に渡すわけですが、1回目の出力としての複素数配列のデータはその意味のないところも含めてフーリエ変換に渡すのでしょうか。 フーリエ逆変換で元に戻すときは、”無意味”な対称・点対称成分も含めて逆変換するわけですからその部分も必要ということでしょうか。その方がプログラムとしてはラクではあります。何もしないということなので。 説明がヘタだなと思いますが、主旨を汲み取り頂いて回答して頂けると助かります。 よろしくお願いします。

みんなの回答

  • kiyos06
  • ベストアンサー率82% (64/78)
回答No.2

>その無駄な部分まで含めて処理する必要があるのだろうかと思っています。 10)対称性を利用して、積分をサボることはよく行われる。(メモリー節約も) 11)外側のフーリエ変換は、実数データに対して、ωyと-ωyに対するa(X, ωy)が共役になることを知っているので、片方を省略できる。 12)内側のフーリエ変換についても、a(X, ωy)が共役になっていることを知っているので、ωxと-ωxに対する積分で(符号に気をつければ)省略できる。 >出力されたフーリエ変換成分をデータ個数で除すという処理をユーザが自前ですることが前提になっているものもあります。 13)サボるときは、直流分だけ係数が特別扱いになることがあるのでご注意を 14)サボる論理のチェックをする時は、下記のチェックをすればok 14.1)模擬データとして全データを(U(X, Y) =)cとして、フーリエ計算結果が直流分だけcになるか? 14.2)模擬データとして単一振動データ(U =c sinX cos2Y等)を作成して、フーリエ計算結果が当該周波数成分だけcになるか?

参考URL:
http://qanda.rakuten.ne.jp/profile/answer/history/u946114.html#tabs
  • kiyos06
  • ベストアンサー率82% (64/78)
回答No.1

1)2次元のデータをどう表現するか 2)2次元の偏微分方程式のように考える。 3)U(X, Y) = ∫ [-∞, ∞] ∫ [-∞, ∞] a(ωx, ωy) e^(i ωx X) e^(i ωy Y) dωx dωy 4)数値計算として、X, Y軸方向をN分割する。 5)外側のフーリエ変換 5.1)X/N毎にY軸方向に数値フーリエ変換を(N回)行う。 6)内側のフーリエ変換 6.1)ωy毎にa(X, ωy)をX軸方向に数値フーリエ変換を(N回)行う。

参考URL:
http://note.chiebukuro.yahoo.co.jp/detail/n296821
skmsk1941093
質問者

お礼

回答ありがとうございます。実数のデータ(512個)を複素フーリエ変換(512個の複素数)した場合、実部(512個)と虚部(512個)があるので1024個のデータとなります。複素フーリエ変換は無駄な情報(冗長なデータ)が含まれているわけです。内側のフーリエ変換(2回目のフーリエ変換)はその無駄な部分まで含めて処理する必要があるのだろうかと思っています。いろいろ考えないで出てきたものをあれこれと加工せず、そのまま変換すればよいということでしょうか。FFTのルーチンのプログラムによっては出力されたフーリエ変換成分をデータ個数で除すという処理をユーザが自前ですることが前提になっているものもあります。それはやらなければいけないだろうなとは思いますが。そのあたりがこんがらがる気がするのですが。

関連するQ&A

  • 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次元は同じことということになります。 サンプルコードがネットに出ているという面もありますが、自分でやる方が組み込みやすいのでお尋ねしました。 長文で申し訳ありませんが、よろしくお願いします。

  • 画像の離散フーリエ変換

    現在画像の離散フーリエ変換をしており、 「c言語で学ぶ実践画像処理」という本には、 水平方向に1次元の離散フーリエ変換をした後、垂直方向に1次元の離散フーリエ変換をすれば良いと書いてあるのですが、 疑問があります。 最初に実部用の配列と虚部用の配列を用意します。 原画像を水平方向に離散フーリエ変換します。 そうすると、初めに用意した実部、虚部用の配列に値が入ります。 ここからさらに垂直方向の離散フーリエ変換をすると、 実部の垂直方向の離散フーリエ変換から実部と虚部が出て、 虚部の垂直方向の離散フーリエ変換から実部と虚部が出て、最終的には実部用の配列が2個、虚部用の配列が2個必要で、 ここからどうやって離散逆フーリエ変換や、振幅スペクトルを求められるのだろうかと混乱しております。 水平方向に1次元の離散フーリエ変換をした後、垂直方向に1次元の離散フーリエ変換はどのようにすれば良いのでしょうか? よろしくお願いいたします。

  • フーリエ変換のデータ点数を増やしたい

    現在はエクセルでフーリエ変換・逆フーリエ変換を行っていますが、最大で4096点までしか扱えないそうです。 都合上、16384点のデータをフーリエ変換・逆フーリエ変換を行いたいと思っています。そこで、フリーソフトのFFT君を試してみたのですが、逆フーリエ変換の際に1つのデータしか変換できないみたいです。つまり、複素数の実部・虚部の2つのデータを一度に逆フーリエ変換したいということです。 何かよい方法がありましたら教えていただけないでしょうか。よろしくお願いします。

  • 複素数と実数が混在するように見える式について

    時系列解析で、自己相関係数のフーリエ変換がパワースペクトルになるというウィナーキンチンの関係というものがあります。その式では複素数が含まれているので、実数を入力として複素数が含まれている式で計算された出力結果は普通は複素数ということになります。しかし、自己相関係数は実数の系列で、パワースペクトルも実数になると思います(実部と虚部の2乗和なので)。実数に複素数を絡ませて変換して出てきたものが実数になるということになってしまいます。ここが理解できないのですが、どのように考えていくのでしょうか。絶対に虚部がゼロになるから、ということなのでしょうか。 一般にFFTによるスペクトル変換では実数列は複素数の実部にあてて変換する(例えば虚部はゼロにしておくとか)ので複素数から複素数を入出力するということで理解できます。 実際にプログラムでの処理を考えているので概念的な説明だけでは実装することできません。 なお、私は常に標準的なFFTでフーリエ変換しているので複素数での入出力ということなので実数となる系列では先に進めないという感じなのですが。もし出力が実数ということになったとき実部がそれ、虚部がそれ、実部と虚部の2乗和がそれ、というのならわかるのですが。 よろしくお願いします。

  • 音の逆フーリエ変換

    音のデータをFFTし、目的の周波数帯を削ってRFTするソフトを作っています。しかし、実部の削り方は分かっても、虚部のどこを削ると、目的の周波数帯を削ることができるのか分かりません。あるいは虚部には触れなくてよいのでしょうか。実部だけ目的の部分を削ってRFTすると、意外な音が聞こえてきました。 音声加工、(逆)フーリエ変換について教えてください!

  • デルタ関数のフーリエ変換について

    デルタ関数のフーリエ変換後の波形について質問です よく見かけるδ(t)のフーリエ変換は1になり、実部で周波数軸に平行の波形になるのはわかるのですが t=aの位置にデルタ関数のあるδ(t-a)のフーリエ変換後は波形はどうなるのでしょうか? 私の計算結果だと実部はcos関数、虚部はsin関数になるのですが ある参考書を見たところ定数になっていて、何が正しいのか不明な状況です。 詳しい方がいらっしゃいましたら、是非ご教授お願い致します。

  • fortranでフーリエ変換→パワースペクトル算出

    プログラミング全くの初心者です タイトル通り、任意のデータ(100個ほど)による波長をフーリエ変換し、 そのパワースペクトル算出をfortranで行いたいのです。 (横軸時間、縦軸大きさのデータです) フーリエ変換の理論上の原理、およびパワースペクトル(=虚部の二乗+実部の二乗) という定義は、教科書から理解できたのですが、 実際に任意のデータに対してフーリエ変換を施す、となると、一体全体何からはじめていいかわからないのです。 そもそもフーリエ変換をしてデータを補間し、100個をさらに分割して増やさなければならないと思うのですが、(違うかもしれませんが) 何をしたらいいのかわからず途方にくれています。 フーリエ係数を求めるのに積分が出てきますが、これもプログラムでどう表現していいのかわかりません 無教養で申し訳ありません。 どうにもこうにも調べ方がわかりませんでしたので質問させていただきます どなたかヒントをお願いします・・・・・

  • フーリエ変換の振幅について教えてください。

    エクセルアドインを使って下記サイン波をフーリエ変換しました。 振幅3mm、周波数4Hz、サンプリング周波数256Hzの波形であり、 つまり、フーリエ変換したい波形は3×SIN(2×PI()×4)です。 アドインでフーリエ変換を行い、出てきた複素数の絶対値つまり√(実部^2+虚部^2)を計算すると3を示すと思っていたのですが、実際は周波数4Hzで384 という値になりました。 周波数分析して周波数4Hz時の振幅が3となるようにするには振幅はどう計算すればよいのでしょうか?またいろいろな振幅や周波数の混ざったランダム波でも各周波数での振幅を求めるにはどう計算したらよいのでしょうか?素人ですが教えてください。

  • 離散フーリエ変換

    フーリエ変換を計算機で扱う場合について聞きたいです。 ある関数(例えばsin(x))を離散フーリエ変換しようとして、まずxを0.1ずつ増やしながらsin(x)をサンプリングします。これを虚部を0として複素数にします。 この後、複素数のフーリエ変換を行い結果が得られます。 と、ここまでは正しいと思うのですが、 その後が分かりません。 文献などに載っているフーリエ変換後のグラフは、横軸が周波数νで、縦軸がf(ν)です。 このグラフと合うようにするには 横軸・縦軸には何をとればいいのでしょうか? 横軸が周波数って言うのは、この場合は1/0.1のことでしょうか? 教えて頂きたいです。お願いします。

  • 複素フーリエ変換の位相について

    画像のとおり位相0度から始まるA列の正弦波を複素フーリエ変換しました。 その実部、虚部のグラフがReal、Imagです。 虚数のみ正弦波の周波数のところにピークがあって、実部は0です。つまりこれは位相が90度又は-90度という事になります。 試しに45度から始まる正弦波を複素フーリエ変換すると、上記は-45度になりました。 フーリエ変換の位相というのはそれぞれの周波数成分を正弦波として開始時の位相を求めるものと思っていましたが、実は余弦波だとしているという事なのでしょうか?