• 締切済み
  • 困ってます

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

ある時間関数を離散フーリエ変換して得られるフーリエスペクトルの振幅値について教えて下さい。 今想定している離散フーリエ変換の式は一般的なもので Σ(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をかける理由を)教えて頂けないでしょうか。 当方、数学についてはあまり詳しくないため、簡単に説明して頂けると幸いです。

noname#108234
noname#108234

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数5049
  • ありがとう数6

みんなの回答

  • 回答No.2

>「F(0)=F(2)=0,F(1)=-2i,F(3)=2iとなり、2つの成分にスペクトルが現れる。」 >というのは、標本化定理を満たさなかったためにエリアシングが生じた、 >という理解でよろしいのでしょうか。 F(1)およびF(3)すなわち、5Hzと15Hzにスペクトルが現れていますが、 サンプリング周波数の半分10Hzに対して、振幅スペクトルが対称に 現れていることの一例です。 つまり、F(3)の分はaliasing周波数成分です。 >私の例の場合ですと、信号周波数5[Hz]に対してサンプリング周波数20[Hz]ですので、 >元信号復元のために必要なサンプリング周波数は満たしています。 >この場合でも、説明して下さったような現象(?)が起こるのでしょうか? >(この状態でフーリエ変換を行った場合、 >サンプリング周波数20[Hz]の半分、つまり10[Hz]を中心にして >左右対称なフーリエスペクトルが生成されると考えられます。) 信号周波数がサンプリング周波数の半分よりも小さく(※)ても、aliasing周波数 成分は発生し、左右対称な振幅スペクトルとなります。 ただしご指摘のように条件(※)を満たしていますので、alias「歪み」が生ずる ことはありません。したがって、信号の復元はサンプリング周波数の半分以下の 成分だけからも可能ですが、その場合には振幅スペクトルを2倍にする必要があ ります(2倍が不要なのは、直流成分および、サンプリング周波数のちょうど半分の 周波数を持つ成分の場合です)。 以下は参考になると思います。 http://www.cqpub.co.jp/hanbai/books/30/30901/30901_2Syo.pdf (特に35,36ページ目)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

aquatarku5さんの説明と紹介して頂いたURLの情報を頼りに考えてみたところ、 納得することが出来ました。 丁寧に対応して頂き、ありがとうございました。

  • 回答No.1

信号f(k)のDFTをF(n)(n=0~(N-1))とすると、 F(n)=Σ(k=0~N-1) f(k)exp(-i2πkn/N) ということなので、 f(k)=1/N・Σ(n=0~N-1) F(n)exp(i2πkn/N) となる。 ○直流の場合(「1, 1, 1, 1」を例に計算)  F(0)=4,F(1)=F(2)=F(3)=0であり、直流成分のみスペクトルが現れる。  f(k)=1/4・{4 + 0・exp(iπk/2) + 0・exp(iπk) + 0・exp(i3πk/2)} ○正弦波の場合(「0, 1, 0, -1」を例に計算)  F(0)=F(2)=0,F(1)=-2i,F(3)=2iとなり、2つの成分にスペクトルが現れる。  f(k)=1/4・{0 + (-2i)・exp(iπk/2) + 0・exp(iπk) + (2i)・exp(i3πk/2)} =1/4・{2sin(πk/2)-2sin(3πk/2)}  sin(πk/2)は、k=0~3において値「0,1,0,-1」をとる。  sin(3πk/2)は、k=0~3において値「0,-1,0,1」をとる。  よって、2重にカウントされることにより、スペクトルの振幅値*2として計算する  必要があります。  この例では、標本周波数=1、信号周波数=1/4ですが、標本周波数の半分に対して  左右対称なDFTスペクトルになるんじゃなかったかと思います(正確なところは  ちょっと失念)。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答、ありがとうございます。 何となく理解はできたのですが、 「F(0)=F(2)=0,F(1)=-2i,F(3)=2iとなり、2つの成分にスペクトルが現れる。」 というのは、標本化定理を満たさなかったためにエリアシングが生じた、 という理解でよろしいのでしょうか。 私の例の場合ですと、信号周波数5[Hz]に対してサンプリング周波数20[Hz]ですので、 元信号復元のために必要なサンプリング周波数は満たしています。 この場合でも、説明して下さったような現象(?)が起こるのでしょうか? (この状態でフーリエ変換を行った場合、 サンプリング周波数20[Hz]の半分、つまり10[Hz]を中心にして 左右対称なフーリエスペクトルが生成されると考えられます。)

関連するQ&A

  • フーリエスペクトルの振幅について

    ある時間関数を離散フーリエ変換して得られるフーリエスペクトルの 振幅値について教えて下さい。 今想定している離散フーリエ変換の式は一般的なもので Σ(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をかける理由を)教えて頂けないでしょうか。

  • 離散フーリエ変換のスペクトルについて

    関数f(x)=2sin(πx)をx=0~2まで等間隔1000点でサンプリングし、 離散フーリエ変換 Σ(k=0~N-1) f(k)exp(-2πkni/N) の式から、言語プログラムで計算する式をつくり、1000個の実数Reと虚数Imを得ました。 ピークはもちろん周波数πのときで、スペクトルの値が1000でした。 √(Re^2+Im^2)をスペクトル値、√なしをパワースペクトル値をいうそうですが、元の関数の振幅2とこのスペクトル値とはどのような関係があるのでしょうか? 異なる正弦波を混ぜれば、スペクトル値を見ることによって振幅の比は分かりますが、スペクトル値と振幅には式的になんらかの関係は存在するのでしょうか?  波のエネルギーは振幅の2乗になると思い、2^2=4がスペクトル値としてでる事を期待していましたが途方もなく異なる値が出てしまいました。 どうぞよろしくお願いします。

  • 振幅を求めるのに最適な窓関数

    サンプリング周期1usで収集した10万点(0.1秒間連続測定)のデータがあります。 これは正弦波信号+ノイズというもので、正弦波の周波数は約100kHzです。 この正弦波の時間的なゆらぎを求めたいので、例えば5万点づつにデータを分割し、その5万点にDFTを行ってピークとなる振幅を求める方法を考えました。 この場合5万点のデータ数だと周波数分解能は100Hzとなるため、もし本来の周波数が例えば100.03kHzだとするとその振幅情報は本来の振幅に比べてかなりずれてしまいます。 これは解析対象区間に含まれる正弦波の数が整数個でないことに起因するのですが、このような場合窓関数を使うように言われていますが、振幅の誤差が1%以下とするためにはどのような窓関数を使ったらよいでしょうか? または、別の方法で振幅を1%以下の精度で求められるという情報でも助かります。

  • 離散フーリエ変換について

    離散フーリエ変換によって得られた値についての質問です。 多くのサイトでその値は Σ(k=0~N-1) f(k)exp(-2πkni/N) という式から求められるとあります。 離散フーリエ変換は本来、ある周期関数が、どのくらいの振幅でどのくらいの周波数の波からできているかを調べるために行うものだと思います。 しかし上記の公式から得られるスペクトル(sqrt(Re^2+Im^2))では振幅の値は得られません。振幅を得るには刻み幅Δ(関数をサンプリングした際の幅)を乗じて Σ(k=0~N-1) f(k)exp(-2πkni/N)*Δ とすれば得られることが分かりました。 最初の公式から得られるスペクトルはなにを表しているのでしょうか?またなぜ刻み幅Δを乗じることで、振幅が求まるのでしょうか? よろしくお願いします。m(__)m

  • MATLABによるFFTと位相スペクトルについて

    純粋な正弦波信号 y=sin2πft ただし周波数f=500MHz をサンプリング周波数2.5GHz,サンプリング数128,256,512,1024の四パターンMATLABでFFTし、パワースペクトルと位相スペクトルを求めました。 結果、パワースペクトルは予想通り500MHzでピーク値をとったのですが、位相スペクトルは各サンプリング数ごとに全く違う値を取りました。 というわけで、 (1)理論上、正弦波の位相スペクトルはどのような値になるのか (2)なぜサンプリング数ごとに位相スペクトルの結果が大きく変わったのか この二点をご教授ください。よろしくおねがいします。

  • 離散フーリエ変換

    今、離散フーリエ変換の値が求まっています。 これから、振幅の値を出すのは、どうしたらいいのでしょうか? 自分で調べたところ、離散フーリエ変換の値に標本化関数のフーリエ変換をかけて、サンプリングの間隔で割ればいいのでは、と考えているのですが、標本化関数というものがよくわかりません。このやり方で良いのかもわかりません。 アドバイスお願いします。

  • 連続時間正弦波信号と離散時間信号

    デジタル信号処理のレポートでこんな問題が出されたんですが解き方が解らなくて苦戦してます!!!。どなたか教えて頂けませんか? 問題: 周波数11[Hz]の連続時間正弦波信号をサンプリング周波数 8[Hz] でサンプリングした。 サンプリングによってこの離散時間信号と全く同じ波形となる連続時間正弦波信号の うち、最も低い正の周波数をもつ正弦波の周波数は何[Hz]か?

  • 振幅スペクトル グラフ

    振幅スペクトルが X(Ω)={1, |Ω|<ΩB,0, |Ω|>=ΩB である連続信号x(t)を考える.連続時間信号に含まれる最大周波数が10kHzの時,(a)32kHz,(b)16kHzでサンプリングした際のグラフの描き方を教えてもらえませんか?範囲は-50kHz~50kHzです.ΩBは原信号の最大角周波数です.周波数領域での位相がゼロである信号を仮定する.

  • H8マイコンでの正弦波の電圧振幅

    現在H8マイコンを用いて趣味で電子工作をしている者です。スピーカーを鳴らすために、H8マイコンのD/Aコンバータを用いて正弦波を発生させたいと考えております。私が持っている参考書では正弦波は以下のように発生させるものだと書いてあります。 unsigned char sindata[128] ={127,133,139,146,152,158,164,170, 176,181,187,192,198,203,208,212, 217,221,225,229,233,236,239,242, 244,247,249,250,252,253,253,254, 254,254,253,253,252,250,249,247, 244,242,239,236,233,229,225,221, 217,212,208,203,198,192,187,181, 176,170,164,158,152,146,139,133, 127,121,115,108,102,96,90,84, 78,73,67,62,56,51,46,42, 37,33,29,25,21,18,15,12, 10,7,5,4,2,1,1,0, 0,0,1,1,2,4,5,7, 10,12,15,18,21,25,29,33, 37,42,46,51,56,62,67,73, 78,84,90,96,102,108,115,121}; と定義して、(254が振幅の一番上、0が振幅の一番下、127がちょうど真ん中になります)このデータを割り込みを使って、自分の使いたい周波数の正弦波を出す、ということになっています。 ここでふと思ったのが、この正弦波は振幅5V(H8マイコンの動作電源が5V)しか出ないのではないんじゃないかと。振幅を変えるためにはどうしたらいいんでしょうか?上記の128個のデータを全て書き直すしかないのでしょうか?それとも×3/5とかにしてデータを小さくしたらいいんですか?でもそれだとデータが整数じゃなくなってしまいますよね?どうしたら振幅を変えられるのでしょうか?どなたかご教授願います。

  • FFTデータ数が少ないと直流成分が大きく変動する?

    FFTの振幅スペクトルから実効値算出のために単一正弦波をFFTしてみると、(1)のように計算データ点数が少ない場合、窓関数の位置によって「0Hz直流成分」のFFT結果値が大きく変動してしまいます。((2)(3)は窓関数がどの位置でも問題ありません。) この(1)(1サイクル64点=FFTデータ数64個)のような計算の場合、どのように実効値算出すればよいでしょうか?  また、正常な場合でもこれらのサンプル間隔(0、30Hz、60Hz等)の"すき間の部分”は考慮しなくても、全て計算結果に出力されているということでよいでしょうか? 単一正弦波(60Hz)   ((最大値5388.9v=実効値3810.5v)、サンプリング3.84KHz=1サイクル64点)   (実効値換算式=前半の√(実数^2+虚数^2)の合計/(FFTデータ数/2)/√2) (1)FFTデータ数 64個⇒0Hz(0.00~1905.2)???、60Hz(1905.2),120Hz(952.6)、180Hz(0.0)、          ⇒合計( ??? ) (2)FFTデータ数128個⇒0Hz(0.0), 30Hz(952.6),60Hz(1905.2),90Hz(952.6), 120Hz(0.0)、          ⇒合計(3810.4) ≒実効値 (3)FFTデータ数256個⇒0Hz(0.0),15Hz(0.0),30Hz(0.0)、                45Hz(952.6),60Hz(1905.2),75Hz(952.6), 90Hz(0.0),           ⇒合計(3810.4) ≒実効値