オンライン健康相談、gooドクター

ある時間関数を離散フーリエ変換して得られるフーリエスペクトルの
振幅値について教えて下さい。

今想定している離散フーリエ変換の式は一般的なもので
Σ(k=0~N-1) f(k)exp(-2πkni/N)
を考えています。
また、離散フーリエ変換して得られるスペクトルは
√(Re^2+Im^2)
で計算します。

離散フーリエ変換を適用する関数を、
振幅1の直流、及び振幅1で周波数5[Hz]の正弦波とします。
(この2つの信号は別々の信号で合成されていません。)
サンプリング周波数を20[Hz]とした場合、
サンプリングして得られるデータ列はそれぞれ、
直流: 「1, 1, 1, 1」
正弦波: 「0, 1, 0, -1」
となると想定されます。
(正弦波をサンプリングする場合は位相が関わってきますが、
今回は気にしないで下さい。)

このデータ列に対して上記の離散フーリエ変換を適用した場合、
得られるフーリエスペクトルの振幅値はそれぞれ、
直流: 「4」(直流のフーリエスペクトルの振幅値値)
正弦波: 「2」(5[Hz]のフーリエスペクトルの振幅値)
となります。
(データ点数は上の通り4点)

ここで質問なのですが、
離散フーリエ変換して得られるスペクトルの振幅値から
元の関数の振幅値を求める場合、
フーリエスペクトルをサンプリングの総データ点数で割ることは
数学的に納得できます。
しかしこの例の場合、フーリエスペクトルを総データ点数で割ると、
直流: 「4 -> 1」
正弦波: 「2 -> 0.5」
となってしまい、直流は正しいのですが、
正弦波の元の振幅値を正確に求めることは出来ません。
フーリエスペクトルの振幅値から正弦波の振幅値を正しく求めるには、
「フーリエスペクトルの振幅値*2/データ点数」
としてやらなければいけません。

上記のことに関して、
なぜこのようになるのかを(2をかける理由を)教えて頂けないでしょうか。

gooドクター

A 回答 (4件)

離散フーリエ変換というのは、実質離散フーリエ級数展開なので、


フーリエ級数展開を考えます。

f(t) = a0/2 + Σ[n=1→∞] { an cos (nωt) + bn sin (nωt) }

f(t)の周期をTとして、ω=2π/Tです。

直流成分の振幅といっているのはこの第1項a0/2のことで、
サイン成分の振幅はbnのことです。

問題文の離散フーリエ変換の式

>Σ(k=0~N-1) f(k)exp(-2πkni/N)

は複素フーリエ級数展開なのでオイラーの公式

cos nωt = [e^{inωt}+e^{-inωt}]/2
sin nωt = [e^{inωt}-e^{-inωt}]/2i = = -i [e^{inωt}-e^{-inωt}]/2

を使って書き直すと、

f(t) = a0/2 + Σ[n=1→∞] { ([an -i bn]/2) e^{nωt} + ([an +i bn]/2) e^{-inωt} }

an = a(-n), bn = -b(-n)の関係があるので、

cn = ([an -i bn]/2), c(-n) = ([an +i bn]/2)

と置くことができ、a0/2をc0と定義し直せば、

f(t) = Σ[n=-∞→∞] cn e^{nωt}

したがって、複素フーリエ係数が求めているのはcn = (an-ibn)/2で、その実数部はan/2、虚数部は-bn/2です。

こうなる理由は、サイン、コサインのときは正の整数だったnを複素数で取り扱うときにマイナス側に拡張したことで、同じ係数が+側と-側にわかれたためです。

離散的な場合は和が-N/2~N/2の範囲の有限項で打ち切られ、
-N/2~0の範囲が一周期ずらされてN/2~Nになっています。
    • good
    • 1
この回答へのお礼

回答、ありがとうございます。
おかげ様で納得することが出来ました。

皆様、丁寧に対応して下さり、ありがとうございました。

お礼日時:2010/03/25 12:52

また別の説明をしてみる:


今は, 与えられた波形を「exp(-2πkni/N)」の重ね合わせで表現しようとしています. つまり
f(t) = a0 e^(i0t) + a1 e^[(iπ/2)t]) + a2 e^(iπt) + a3 e^[(i3π/2)t]
の形で表わそうということですね. で, まず
e^[(i3π/2)t] = e^[(-iπ/2)t]
から上の式は
f(t) = a0 e^(i0t) + a1 e^[(iπ/2)t]) + a2 e^(iπt) + a3 e^[(-iπ/2)t]
と等価です. そして, この式と
1 = e^(i0t)
1・sin (π/2)t = {e^[(iπ/2)t] - e^[(-iπ/2)t]}/(2i)
を比較すれば「なぜ直流分に対して正弦波のスペクトルが半分しかないのか」が分かります. 正弦波の方にいる, 分母の「2」が原因です.
なお, この分母の「2」は「10 Hz 余弦波」でも消滅します. 従って, さらに「振幅 1 の 10 Hz 余弦波」を重畳すると, 10 Hz のフーリエスペクトルの振幅値として 4 が得られるはずです. 確認してみてください.
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

完全ではないですが、何となく理解できました。
後は自分で計算して、結果を追ってみます。

正弦波をフーリエ変換して得られたフーリエスペクトルの振幅値から
元の正弦波の振幅値を求めるには、
「フーリエスペクトルの振幅値*2」
をすれば良い、ということが間違っていないと確認できて、安心しました。

お礼日時:2010/03/25 12:43

基本的にフーリエ変換はある周波数の成分を掛けて積分すると、


同じ位相と周波数の成分のもののみ取り出せることを利用しています。
要するに、同じ周波数と位相のものは自乗されるので値が残ることになります。
ここら辺は基礎の所でやるので調べて下さい。

そして、その結果自乗の積分になるのですが、
直流の場合は常に一定値であるのに対して、正弦波の自乗はそれの半分の直流分しか持ちません。
ですので、積分した値を倍にすることで直流と等価になります。

ちょっと説明が下手ですが疑問点あれば教えて下さい。

この回答への補足

自分で考えてみて、下のように理解したのですが合っているでしょうか。

振幅Aの正弦波の実効値は「A/sqrt(2)」ですよね。
フーリエ変換ではその実効値と「exp」の項との積が積分されるので、
結果的に「A/2」というフーリエスペクトルが生成されることになる。

補足日時:2010/03/25 11:15
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

「正弦波をフーリエ変換して得られるスペクトルの振幅値 * 2」
で元の正弦波の振幅値が得られる、ということが間違っていないようで
安心いたしました。

もう少しだけ教えて頂きたいのですが、
「正弦波の自乗はそれの半分の直流分しか持ちません」
というのは、フーリエ変換の計算の特徴なのでしょうか。
フーリエ変換の定義式を眺めると、理解できる事項ですか・・・?

このような質問をさせて頂いた事情を少しお話すると、
高調波が入り混じった電圧と電流の時間波形があり、
この電圧波形と電流波形の積(= 瞬時電力波形となります)に対して
離散フーリエ変換を適用し、どの周波数がどの程度の電力値があるのか、
を正確に知る必要がありました。

やはり正弦波同士の積をフーリエ変換した場合でも、
「計算して得られたフーリエスペクトルの振幅値*2」
で元の時間波形の振幅値が求められるのでしょうか。

お礼日時:2010/03/25 11:09

計算すると正弦波は「2 -> 0.5」になります。

    • good
    • 0
この回答へのお礼

迅速な回答、ありがとうございます。

確かに上記の例で正弦波のフーリエスペクトルを計算すると「0.5」となります。
しかし、元の正弦波の振幅値は1であり、
フーリエスペクトルの振幅値とは異なっています。

ここで言う「正弦波の振幅値」とは「peakの値」のことなのですが、
そもそも
「正弦波の振幅値(peak値) = フーリエスペクトルの振幅値」
という考え方が間違っているのでしょうか。

お礼日時:2010/03/25 10:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このカテゴリの人気Q&Aランキング