• 締切済み

2次元FFTとFFTについて

FFT結果は実部と虚部に分かれています。 ってよくあるのですが、2次元FFTの結果も実部と虚部に分かれているのですか? でも、調べてみると2次元FFTの結果は、実部だけとあります。 FFTは、実部と虚部の絶対の2乗、2次元FFTは、実部だけ?矛盾しているような? もし、2次元FFTの結果が実部だけでしたら、虚部はどのようにすればいいのですか? 実部と虚部とは、なんですか?正弦波をFFTすると実部と虚部をどのように分かれるのですか? ご指導の方、よろしくお願いします。

みんなの回答

  • nubou
  • ベストアンサー率22% (116/506)
回答No.4

フーリエ変換で連続関数と複素数展開するものと2つの定義式があるのですが、 2つの違いは何ですか?: 質問の意味がわかりません (1)フーリエ変換において連続時間信号と離散時間信号について2つの式があるのですが・・・ なのか (2)連続時間信号のフーリエ変換において複素数値関数になるものと実数値関数になるものがあるのですが・・・ なのか (1) フーリエ変換の定義式は係数の違いを除いて1つです x(t)のフーリエ変換をX(f)とすると X(f)=∫(-∞<t<∞)dt・x(t)・exp(-j・2・π・f・t) です x(t)をサンプリングされた周期関数とするとDFTがδ関数の係数として出てきます ただしx(t)をサンプリングした関数はδ関数によって表現します (2) x(t)が実数のときx(-t)=x(t)であれば X(f) =∫(-∞<t<∞)dt・x(t)・exp(-j・2・π・f・t) =2・∫(0<t<∞)dt・x(t)・cos(2・π・f・t) であるからX(f)は実数値関数になります ただし簡単のためにδ(t)の項が存在しないとした jは工学の慣習に従って虚数単位です

noname#11476
noname#11476
回答No.3

複素数で波を表すと、いま簡単に一つの各周波数ωの波として、 f(t) = A * exp[i*ω*t] と表されます(iは虚数)。これは、 f(t) = A * [ cos(ωt) + i * sin(ωt) ] と同じことです。 これの絶対値をとると振幅が求まります。 |f(t)| = sqrt[ f(t) * f'(t) ] ここで、f'(t) はf(t)の複素共役とします。 = sqrt [ |A|^2 * exp{iωt} * exp{-iωt} ] = sqrt [ |A|^2 * 1 ] = |A| さて、上記の式f(t)には「位相」の項({ωt + φ} のφのようなもの)がありませんね? では位相はどうなっているのかというと、複素数Aの中に入っています。 簡単に、t = 0 で 1となる波であれば、 f(t) = exp[iωt] です。(A=1とした) Re[ f(t) ] ととると cos(ωt) ですから解りますね。 ここで、t=0で0となる波であればどうでしょうか。(大きさは1とします) f(t) = -i exp[iωt] とすると(A= -i)、 Re[ f(t) ] = sin(ωt) でsinになりますね。つまり先ほどと比べると位相が90度異なった波を表しています。 途中の位相も複素振幅Aで表すことが出来ます。 このように複素振幅Aを求めると、その波の位相がわかるのです。 フーリエ変換とは、各ωについての複素振幅A(ω)を求める作業です。 では。

  • nubou
  • ベストアンサー率22% (116/506)
回答No.2

FFTは単にDFTを高速に計算する技術なので質問はFFT→DFTと書くべきです 係数を別にすればDFTの定義は 1次元: X[n]= Σ(0≦k<N)・x[k]・exp(-j・2・π・k・n/N) (n=0,1,2,3,・・・,N) 2次元: X[m,n]= Σ(0≦k,l<N)・x[k,l]・exp(-j・2・π・(k・m+l・n)/N) (m,n=0,1,2,3,・・・,N) となりDFTは一般には複素数になります 1次元においてx[N-n]=x[n]であればX[m,n]は実数になり 2次元においてx[N-m,N-n]=N[m,n]であればX[m,n]は実数になります 簡単ですから補足で証明してください 時間があればもっとゆるい条件を示してください

na-asuka
質問者

補足

すいません。考えたんですけど、よくわかりませんでした。 勉強不足です。。。。。 式は覚えているのですが、使い方がいまいちよくわかっていません。 ヒントのほうよろしくお願いします。 お聞きしたことがあるのですが、 フーリエ変換で連続関数と複素数展開するものと2つの定義式があるのですが、 2つの違いは何ですか? ご指導の程、よろしくお願いします。

noname#11476
noname#11476
回答No.1

一次元FFTでも二次元FFTでもはたまた多次元FFTでも、複素フーリエ変換もあれば、実数フーリエ変換もあります。 実数フーリエ変換は工夫すると大幅に複素FFTよりも演算量を減らせるので二次元では必要なければ実数FFTにしますが、複素FFTがないという訳ではありません。 使用するのが実数だけである場合は、実数FFTが高速なのでそれを使います。 複素FFTでは、複素数の絶対値が強度を表します。(厳密な定義はここでは省略します。) 複素数の位相(実部と虚部の複素平面上の位相)は、その信号の位相遅れを意味します。 それが物理的にどんな意味があるのかというのは、適用する分野によって異なります。 (フーリエ変換は純粋に数学的な議論であるため)

na-asuka
質問者

補足

ご返信ありがとうございました。 >複素数の位相(実部と虚部の複素平面上の位相)は、その信号の位相遅れを意味します。 とあるのですが、よくわかりません。sin波を、cos波を位相遅れを考慮して考えると実部を取り出したりできるってことでしょうか? cos波、sin波が実部、虚部になるとありますが、もうひとつ実部と虚部の考え方がわかりません。 ご指導の程、よろしくお願い致します。

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

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

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

  • VBを使った自作の逆FFT

    2次元FFT図を逆FFTし元の画像を得るプログラムを作ったのですが、得られた画像は、右斜上方向に数本の線やら何か入っててその線によって画像の濃度を逆転したりしています(説明が悪くてすいません)。その障害はありますが、少し画像は得られてます。 2次元FFT図は、自分で作ったものです。picture.backcolor=RGB(0,0,0)でスペクトルの点は、半径1、RGB(255,255,255)です。サイズは256*256です。一点かき、逆FFTで水平方向に白、黒、白・・・・(画像)を得ることを目的としております。 画像を読み込みの時、 For j = 1 To Size For i = 1 To Size rTemp(i) = Picture.Point(i, j) And &HFFFFFF iTemp(i) = 0# Next i For i = 1 To Size rData(i, j) = rTemp(i) iData(i, j) = iTemp(i) Next i Next j (r-実部、i-虚部) このように白い点だけ実数部に読み込ませて、逆FFTをしています。 虚部もよみ込ませる必要あるのですか? 読み込ませるとしたら、値をどのように与えてやればいいのですか? それか結果(得られる画像にいろんな障害がある)の原因は別のところにあるのですか? 説明が不十分や悪いとは思いますが、宜しくお願い致します。

  • FFT(高速フーリエ変換)について

    直流成分0の正弦波と矩形波形をFFTするとFFTグラフには 正弦波・・・・一本の線のピーク 矩形波形・・・・複数の線のピーク となっているのですが、 FFTグラフの横軸と縦軸はなんでしょうか? FFT結果を複素数の絶対値を計算しグラフ化するのですが 何故、FFT結果が複素数なのですか? 定義式(g(t)=直流成分+Cos成分+Sin成分)をみる限り 複素数にならないと思います。 それか見ている式が違うのでしょうか? あと定義式(ある時間信号g(t)が、ある周期Tを持つ連続関数である時) であるのですが、”ある時間信号g(t)”っていうのはよくわかりません。 このgを求めることが 正弦波・・・・一本線のピーク 矩形波形・・・・複数の線のピーク になる理由がわかるのですか? ご指導の程、よろしくお願い致します。

  • FFTのサンプル点について

    FFTについて質問したいのですが、ある本を読んでいたら正弦波を時間軸に離散化(そこでは、一周期8サンプル)して、この離散時間信号のスペクトルを 512 点 FFT を用いて見てみましょう、と書いてありその周波数特性の結果がありました。 僕は、今まで512 点 FFT の512点というのは時間軸に一周期内で512点と思っていたのですが、違うのでしょうか?

  • FFTサンプル点について

    FFTについて質問したいのですが、ある本を読んでいたら正弦波を時間軸に離散化(そこでは、一周期8サンプル)して、この離散時間信号のスペクトルを 512 点 FFT を用いて見てみましょう、と書いてありその周波数特性の結果がありました。 僕は、今まで512 点 FFT の512点というのは時間軸に一周期内で512点と思っていたのですが、違うのでしょうか?

  • 音の逆フーリエ変換

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

  • MATLABを用いたFFT

    現在40kHzの正弦波をMATLABを用いてFFTをかけましたがしかし思った結果になりません。作成したmファイルの内容は以下のとおりです。 data = xlsread('test001.xls','Sheet1');   %excelファイルの読み込み data = data(:,2);   %2列目を選択 Y = fft(data);    %fft Pyy = Y.*conj(Y)/2500; %スペクトルを求める f = 40000 * (0:2499)/2500;          %範囲を指定 plot(f,Pyy(1:2500))             %グラフを作成 本当に困っているので、解答お願いします。

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

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

  • FFTを使って信号から特定の周波数を抜き去る方法

    FFTを用いてある時系列データから特定の周波数の成分を抜き去ろうと思っていますが、 うまくいかないのでお伺いします。 調べてみると、スペクトルを出すとき、例えば同じ振幅で周波数の異なるの正弦波を 10個入れても全て同じ振幅にならず、振幅の大きさにばらつきが出ていて周波数成 分の成分の推定がうまくいっていないようです。FFTの2乗のデータを小さな周波数区 間で積分してスペクトル密度にしても、先ほどの10個の正弦波の振幅がそろわない のと、周波数推定が悪くなりうまく、引き去れなくなっています。 よくある状況だと思いますが、どういう工夫が必要なのでしょうか。 ちなみに、FFTのルーチンはnumerical recipeとFFTWの二つで試しました。