- ベストアンサー
離散フーリエ変換(DFT)の公式について
離散フーリエ変換の公式は、参考書等によりますと色々な記述があります。 今回は2例の違いを教えていただきたいのです。 1)F(u)=1/NΣf(x)・・・・ 2)F(u)=Σf(x)・・・・ との式があります(両式とも詳細は省いて記述しました)。この規格化定数(1/N)がある公式1)と、ない公式2)があります。 本来の周波数スペクトル(振幅)を表しているのは1)式であると考えていますが いかがでしょうか? 公式2)を使用して算出した場合には、その値をサンプリング数で除すれば公式1)同じ結果となるのですが、なぜ公式2)が記述してあるのでしょうか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
戻って来ました。 No.7の補足に対してです。 答は、「そのとおり」です。(^^) 蛇足になりますが、この時の1/Nは形式的には サンプル数で割っていますが、考えるときは、 F[0]=1が周波数内にしめる割合が1/8と考える方が 分かり易いかもしれません。 何度も書くようですが、周波数が標本化周波数 (標本化間隔の逆数)の1/2を超えるときは注意しましょう。 例の場合、周波数7/8は-1/8と同様に表せるだけでなく 15/8, 23/8,… ,-9/8,-17/8… としても同様に表せます。 この任意に表せる周波数の内どれが一番妥当かも考えてみましょう。 (参考) 折り返し雑音、エイリアシング(aliasing) 以上です。
その他の回答 (7)
No.5の補足に対してです。 あなたの行なっていることが、まさに逆変換そのものです。 その逆変換を行なうときに係数を付けるのを嫌った公式が1)になります。 これは、あなたのおっしゃる画素の様な本質的に離散化されたものであれば 式の形も簡単になりますし直感的にも合いやすいと思います。 が、それとは別に次の様な事を考えて見ましょう。 例えば、あなたが原っぱに寝転がっているとします。 日の光が体に降り注ぎますが、あなたはどれくらい日の光をあびているのでしょう。 光を浴びている量に瞬間値はありません。ある時間から別の時間までの積算量が あるだけです。こういう瞬間値が無いものは、常にある時間から別の時間までの 積算量としてあつかってもいいですし、単位時間あたりの積算量を もって瞬間値としてあつかうという方法もあります。 この様な積算量の周期はどうなっているのでしょう。 本来瞬間値の無いものですから、周期に関しても本来、瞬間値はありません。 この様な連続関数を強引に離散化する場合、 離散化した値は、ある単位当りの量を考えることも出来ますし、 ある点から別の点までの積算量と考えることも出来ます。 この(ある周波数から別の周波数までの)積算量で考えたものが公式2)です。 フーリエ変換で、こちらの考え方を(無理にでも)用いた方が有利なものは、 No.5でも書いたパーセバルの公式等を利用する場合です。 これは、連続関数で元の関数と変換後の関数の量的な関係を表したものですが、 離散化してしまうと各々の量を積算量として捕えないと成り立たなくなって しまいます。 最後にもう一つ、 「ナイキストの臨界周波数」 標本化(サンプリング)間隔をΔとすると 1/(2Δ)をこえる周波数は表現できない。
お礼
ありがとうございました。 例え話で少し(完全とは言えませんが)理解できてきた感じがします。 いつもお忙しい中、ご親切にご回答いただきまして恐縮しております。 No7のご回答はよく理解できました。 ご出張とのことで、お疲れとは存じますがNo5の補足に対するお答え を、時間がお許しになられましたらいただけませんでしょうか? お願い申し上げます。
補足
No5に対する補足ですとのご返事を飛ばして読んでしまいまして、お礼にNo5の回答をお願いしますとわけのわからないことを書き申し訳なく思っています。一点だけ教えていただきたいのですが、何度も書いていることですみませんが、離散フーリエで1/Nにしなかったら u=0(周波数0/8) のとき F[0]=1 u=1(周波数1/8) のとき F[1]=0.856 u=2(周波数2/8) のとき F[2]=0.496 u=3(周波数3/8) のとき F[3]=0.144 u=4(周波数4/8) のとき F[4]=0.000 u=5(周波数5/8) のとき F[5]=0.144 u=6(周波数6/8) のとき F[6]=0.496 u=7(周波数7/8) のとき F[7]=0.856 となることをご確認していただきました。 そうなるとこの関数はNo5で記述しましたように この0.25,0.5,0.25の波f(x)は以下の周波数の波の合成 f(x)=F(0)+F(1)cos(2π×1/8×x)+F(2)cos(2π×2/8×x)+・・・・・ ・・・・・・・・+F(6)cos(2π×6/8×x)+ F(7)cos(2π×7/8×x) =1.0+0.856cos(2π×1/8×x)+ 0.496cos(2π×2/8×x)+ ・・・ 0.0496cos(2π×6/8×x)+ 0.856cos(2π×7/8×x) となってしまいます。 上の式に x=0 を代入してf(1)を求めると 1+0.856+0.496+0.144+0.00+0.144+0.496+0.856=4 x=1 を代入してf(2)を求めると 2 x=3~6を代入すると 0 x=7を代入してf(7)を求めると 2 となり、定数項は最初の関数値0.5の8倍になってしまいます。 ここのところでわからなくなってしまったみたいです。 1/Nしていない離散フーリエ変換を行ったときは上記の 合成波を示す式は f(x)=F(0)+F(1)cos(2π×1/8×x)+F(2)cos(2π×2/8×x)+・・・・・ ・・・・・・・・+F(6)cos(2π×6/8×x)+ F(7)cos(2π×7/8×x) ではなく、1/Nを付加させ f(x)=1/N{F(0)+F(1)cos(2π×1/8×x)+F(2)cos(2π×2/8×x)・・・・ ・・・・・・・・+F(6)cos(2π×6/8×x)+ F(7)cos(2π×7/8×x)} と記述しなければいけないと言う事なのですね? ご回答の中で「あなたの行なっていることが、まさに逆変換そのものです。」が大きなヒントになったようです。ご確認よろしくお願いします。
ちょっと忙しくて内容を斜め読みしており、 x[2]~x[6]=0の記述も読み飛ばしていました。 度々すいません。 記述の通りですと標準化間隔(サンプリング幅)は1ですね。 この場合 公式1) Δ=8x1=8 公式2) Δ=1 になります。 計算についてですが、 手元のツールで(簡単な自作のもの)確認したところ ΔF[0]=1.000000 ΔF[1]=0.853553 ΔF[2]=0.500000 ΔF[3]=0.146447 ΔF[4]=0.000000 ΔF[5]=0.146447 ΔF[6]=0.500000 ΔF[7]=0.853553 になりましたので、問題無いと思います。 繰返しになるとも思いますが、フーリエ変換の値の見方は、 逆変換やパワースペクトルの捉え方で変わります。 逆変換に係数を付けたく無ければ、公式1)が正当になりますし、 上記の例にしてパワースペクトルで考えると、 周波数-1/16~1/16(0±1/16)までのパワーは1になり、 1/16~3/16(1/8±1/16)のパワーは0.853553になりますので、 公式2)が正当になります。 あと一つ、周波数のところが少し気になりました。 1の間隔でサンプリングすると周波数の上限は1/2になります。 (ナイキスト(Nyquist)の臨界周波数) ので4/8より大きな周波数はありえません。 F[5], F[6], F[7]の周波数はそれぞれ-3/8, -2/8, -1/8になります。 今度は、答になっていますでしょうか? 私事ですが、私は明日から出張になります。 つづけて質問されても、週末まで来れないかもしれません。
日曜は休んでました。すいません。 文献にDFTの公式が載っているのは良心的ですね。 (値だけのものも結構あります。) ところで、フーリエ変換したデータは何に使うのでしょうか? 大抵は、どの周波数が優勢かを判定するのに使うと思うので、 どちらの公式を使っても問題ないと思います。 (畳み込みや相関のみでも問題はありません。) 注意点としては、パワースペクトルを求めたり逆変換をする時に、 公式としてどちらを用いたかは明確にする必要があります。 加えて、連続関数を解析的に変換したものと比較する場合は、 No.2やNo.4で書いたようにΔを掛けてやる必要があります。 下の計算ですが、元の全データがないので逆変換からの推測ですが、 おそらくあっていると思います。(丸め誤差の範囲で) 標本をどの様な間隔で取っているのか書いていないので標本化間隔を (例えば)0.2とすると、公式1)の時のΔ=8*0.2=1.6であり 公式2)の時のΔ=0.2となってどちらも、ΔF(0)=0.200,ΔF(1)=0.021… となって一致します。 (これを持って本当の値とするかは疑問ですが、)パワースペルトルの パーセバル(Parseval)の定理などはこの様にすると一致します。 ずらずらと書いてしまいました。 答えになっているか分かりませんが、お役に立ちましたでしょうか。
補足
何度も申し訳ありません。 フーリエ変換を何に使うかについては特別ありません。 たしかに、フーリエ変換と逆変換を同時に使用するときは1/Nであろうがなんであろうが問題ないと思っていますが、フーリエ展開(?数学的意味は明確でないのですが・・・)したときの関係がわからないのです。 離散フーリエは周期が∞になったときの場合ですから、これからお聞きする点は間違っているかもしれませんがお聞きください。(フーリエ級数と混同しているかもしれません。) 周期関数は三角関数の波の合成でされていることを習いました。 前回の補足で0.25,0.5,0.25の8画素のF(u)を求めました。 結果は u=0(周波数0/8) のとき F[0]=0.125 u=1(周波数1/8) のとき F[1]=0.107 u=2(周波数2/8) のとき F[2]=0.062 u=3(周波数3/8) のとき F[3]=0.018 u=4(周波数4/8) のとき F[4]=0.000 u=5(周波数5/8) のとき F[5]=0.018 u=6(周波数6/8) のとき F[6]=0.062 u=7(周波数7/8) のとき F[7]=0.107 となりました。 この0.25,0.5,0.25の波f(x)は以下の周波数の波の合成 f(x)=F(0)+F(1)cos(2π×1/8×x)+F(2)cos(2π×2/8×x)+・・・・・ ・・・・・・・・+F(6)cos(2π×6/8×x)+ F(7)cos(2π×7/8×x) =0.125 +0.107cos(2π×1/8×x)+ 0.062cos(2π×2/8×x)+ ・・・0.062cos(2π×6/8×x)+ 0.107 cos(2π×7/8×x) とは考えられないのでしょうか? 上の式に x=0 を代入してf(1)を求めると 0,125+0.107+0.062+0.018+0.00+0.062+0.107+0.125=0.5 x=1 を代入してf(2)を求めると 0.125+0.0756+0.00 ・・・・・・・・・・・+0.0756=0.25 x=3~6を代入すると 0 x=7を代入してf(7)を求めると 0.25 となり、もとの関数を表せたことになると思います。 いままで求めたものは 定数項 0.125(定数項) (周波数1/8) の波の係数 F[1]=0.107 (周波数2/8) の波の係数 F[2]=0.062 (周波数3/8) の波の係数 F[3]=0.018 (周波数4/8) の波の係数 F[4]=0.000 (周波数5/8) の波の係数 F[5]=0.018 (周波数6/8) の波の係数 F[6]=0.062 (周波数7/8) の波の係数 F[7]=0.107 でこれをグラフにしたものなのではないでしょうか? 説明が明確でなく申し訳ありません。 ここのところをご指導ください。
デルタ関数じゃありません。 公式2)の方に従うとΔは「標本化間隔」という名前が付いています。 原関数f(x)のデータの位置を x0,x1,…,x(N-1) (数字と括弧の中は下付のつもり) とすると Δ=x(k+1)-x(k) {k=0,1,2,…}です。 これは、DFTを行なうと x(k)=kΔ {k=0,1,2,…} u(n)=n/(NΔ) {n=-N/2, -(N-1)/2, …, N/2} と表すことが出来て、 H(n)=∫f(x)exp{2πiux}dx≒Σf(x)exp{2πikn/N}Δ (∫は-∞~∞, Σはk=0~N-1) となりますが、公式2)の様なものだと、 F(u)=Σf(x)exp{2πikn/N} となっているため、 H(n)=ΔF(u) となる。と言うことをいっています。 補足になりますが、連続関数で(解析的に)フーリエ変換をするときに、 eの冪数に2πを付けずに周期2πで割ったりしますが、この時にでてくるNは、 離散化するために出てくるもので連続関数の周期とは別物だと思っておいた方が 良いでしょう。(よく似ているのですが) 公式1)については支持してらっしゃる方がいますし、長くなるので 省略します。
補足
ご回答ありがとうございました。 再度教えていただけませんでしょうか? nubouさんへの補足として記述させていただきました点について再度質問させていただきます。よろしくお願いいたします。 例として1,2,1の平滑化フィルタの離散フーリエ変換についての計算ですが、これのサンプリング数を8として質問させていただきます。 この計算をする際に、 N個の実数x[0],x[1],x[2],・・・,x[7]が x[0]=0.5,x[1]=0.25,x[2]~x[6]=0,x[7]=0.25 となるように配置させ、公式1)で計算しますと 結果は u=0(周波数0/8) のとき F[0]=0.125 u=1(周波数1/8) のとき F[1]=0.107 u=2(周波数2/8) のとき F[2]=0.062 u=3(周波数3/8) のとき F[3]=0.018 u=4(周波数4/8) のとき F[4]=0.000 u=5(周波数5/8) のとき F[5]=0.018 u=6(周波数6/8) のとき F[6]=0.062 u=7(周波数7/8) のとき F[7]=0.107 となります。 また、同じN個の実数の配列で公式2)で計算しますと 結果は u=0(周波数0/8) のとき F[0]=1 u=1(周波数1/8) のとき F[1]=0.856 u=2(周波数2/8) のとき F[2]=0.496 u=3(周波数3/8) のとき F[3]=0.144 u=4(周波数4/8) のとき F[4]=0.000 u=5(周波数5/8) のとき F[5]=0.144 u=6(周波数6/8) のとき F[6]=0.496 u=7(周波数7/8) のとき F[7]=0.856 となり、F(u)の値は公式1)のN(8)倍のとなります。 これらの関係を示した図(周波数特性?uを横軸、F(u)を縦軸にしてuとF(u)の関係をプロット)のF(u)の値は公式1)で算出した値で記述してあるものと、公式2)で算出した値で記述してあるものがあります。 これらを比較するとちらが本当なのか?疑問になるのです。 私の記述した(平滑化フィルタ)での公式1)2)の計算方法は間違ってないでしょうか? 配列の方法に誤りがあるのでしょうか? 長くなりましたがご回答いただけたら うれしく思います。 よろしくお願いいたします。
- nubou
- ベストアンサー率22% (116/506)
真の係数(ここでは振幅)はサンプリング数で除さないといけないのではないでしょうか?: スペクトルという言葉はいろいろな意味に使われ曖昧なのでフーリエ変換を使います v(t)のフーリエ変換V(f)の定義は V(f)≡∫(-∞<t<∞)dt・v(t)・exp(-j・2・π・f・t) です x(n+N)=x(n) (n=0,±1,±2,・・・)である 無数の実数x(n) (n=0,±1,±2,・・・)について x(t)=Σ(-∞<n<∞)・x[n]・δ(t-n/fs) とすると x(t)のフーリエ変換X(f)は X[n]=Σ(0≦k≦N-1)・x[k]・exp(-j・2・π・k・n/N)/N (n=0,±1,±2,・・・) としたとき X(f)=fs・Σ(-∞<n<∞)・X[n]・δ(f-n・fs) となります X[n] (n=0,±1,±2,・・・)はあくまでもフーリエ変換を表現するための数値に過ぎないのです δ関数がかかっていることを忘れてはなりません いわゆる輝線スペクトルですね だからスペクトルという言い方をすればその周波数のスペクトル成分は無限大なのです もし X[n]=Σ(0≦k≦N-1)・x[k]・exp(-j・2・π・k・n/N) (n=0,±1,±2,・・・) とすれば X(f)=fs・Σ(-∞<n<∞)・X[n]・δ(f-n・fs)/N となって不細工になるだけです 私もNで割るほうを支持しますが本質的なものではなく好みの問題です あくまでもフーリエ変換X(f)が重要でそれを表現するためにX[n]が都合良く使われるだけです なお x(t)=Σ(-∞<n<∞)・x[n]・δ(t-n/fs)/fs とするやり方もありその手法を採用すると Nで割る方を採用すれば X(f)=Σ(-∞<n<∞)・X[n]・δ(f-n・fs) となりfsすらをかけなくても良くなります 制御では前者、信号処理では後者が適しています
お礼
ありがとうございました。これから勉強をしてみます。
nubouさんの言われる通り、公式が二つある理由は、 逆変換まで考えると1/Nの係数に任意性があるためなのですが、 振幅の事で少し気になったので書き込みます。 実は、1)も2)も振幅そのものは表していません。 実際の振幅を得るには(ある)間隔Δを掛けてやって ΔF(u)としなければいけません。 この間隔Δを、サンプル全体の間隔とすると公式 1)となり、 個々のサンプルの間隔とすると公式 2)が出てきます。 この議論は、原関数のデータが サンプル間の積算強度で表される事が多いためにでてくる議論で 密度関数で表されている場合にはあてはまりませんので御注意下さい。
補足
ありがとうございます。 再度、具体的に下記の内容を教えてください 「実際の振幅を得るには(ある)間隔Δを掛けてやって ΔF(u)としなければいけません。 この間隔Δを、サンプル全体の間隔とすると公式 1)となり、 個々のサンプルの間隔とすると公式 2)が出てきます」 δ関数を掛けることでしょうか? また、サンプル全体の間隔と個々のサンプル間隔の意味を 具体的にご指導いただけないでしょうか?
- nubou
- ベストアンサー率22% (116/506)
N個の実数x[0],x[1],x[2],・・・,x[N-1]に対して X[n]=Σ(0≦k≦N-1)・x[k]・exp(-j・2・π・k・n/N)/N (n=0,1,2,・・・,N-1) としたとき x[n]=Σ(0≦k≦N-1)・X[k]・exp(j・2・π・k・n/N) (n=0,1,2,・・・,N-1) となります これは周波数スペクトルがどうこうではなく N個の実数x[0],x[1],x[2],・・・,x[N-1] と N個の複素数X[0],X[1],X[2],・・・,X[N-1] の間に一般的に成立する関係です 最初に1/Nをかけなければ後の式に1/Nをかければいいのです x(n+N)=x(n) (n=0,±1,±2,・・・)である 無数の実数x(n) (n=0,±1,±2,・・・)について X[n]=Σ(0≦k≦N-1)・x[k]・exp(-j・2・π・k・n/N)/N (n=0,±1,±2,・・・) としたとき x[n]=Σ(0≦k≦N-1)・X[k]・exp(j・2・π・k・n/N) (n=0,±1,±2,・・・) となります fsを正の実数とし x(t)=Σ(-∞<n<∞)・x[n]・δ(t-n/fs) とし X(f)=∫(-∞<t<∞)dt・x(t)・exp(-j・2・π・f・t) とすると X(f)=fs・Σ(-∞<n<∞)・X[n]・δ(f-n・fs) となります だから1/Nを最初に付けた方が式がきれいになります しかしそれだけのことでどうでもいいことです
お礼
何度もお答えいただきましてありがとうございました。まだ明確には理解できませんが、もう少し勉強してみます。 いろいろお世話になりました。今後ともご指導お願い申し上げます。
補足
ありがとうございます。 質問内容が明確でなかったため再度教えてください。 nubouさんからご回答いただきました上記の内容は、離散フーリエ変換と 離散逆フーリエ変換の関係から 1/Nを離散フーリエ変換に付加したときは、離散逆フーリエ変換ではそのままで 1/Nを離散フーリエ変換に付加しないときは、離散逆フーリエ変換には1/Nを付加すれば良いと言われているのではないでしょうか。 このことは理解できるのですが、例を提示して質問させていただきます。 N個の実数x[0],x[1],x[2],・・・,x[7]が x[0]=0.5,x[1]=0.25,x[2]~x[6]=0,x[7]=0.25 と過程して、下記の式 F[n]=Σ(0≦k≦N-1)・x[k]・exp(-j・2・π・k・n/N)/N (n=0,1,2,・・・,N-1) で離散フーリエ変換しますと、結果は F[0]=0.125 F[1]=0.107 F[2]=0.062 F[3]=0.018 F[4]=0.000 F[5]=0.018 F[6]=0.062 F[7]=0.107 となります。 この関数は隅関数なので、sin部分のΣは0となりますので振幅もこの値になります。 したがって、横軸にn 縦軸にF[n]を取りプロットすると周波数スペクトル (振幅)を示したものとなると考えています。 1/NにしなかったらF[n]の値は先の値の4倍となってしまい、F[n]の値が 違ってきます。 2つの公式があるというのは、スペクトル分布の縦軸の値が違ってしまいますが問題ないのでしょうか?真の係数(ここでは振幅)はサンプリング数で除さないと いけないのではないでしょうか? お願いします。
お礼
お疲れのところご回答いただきまして、本当にありがとうごさいました。 ご指導いただきました内容は印刷して保存しておきます。 本当に長い間、お世話になりましてありがとうございました。 真剣にお教えいただきましたこと感謝しております。 今後ともご指導よろしくおねがい申し上げます。 ありがとうございました。