• ベストアンサー

デルタ関数のフーリエ変換

デルタ関数をフーリエ変換するプログラムを作成したいと思っています。 フーリエ変換自体のプログラムは出来上がりました。(いくつかの計算例で確認しました。) そこで質問ですが、デルタ関数はどのように入力すれば良いのでしょうか? F( 1 )=大きな数字、 F( 2 以降) =0 でしょうか? デルタ関数をフーリエ変換すると、『1』になるのを確認したいと思っています。 プログラム言語は『Fortran』を使用しています。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

本物のデルタ関数は入力できません。 巾と高さの積が1になる擬似デルタ関数をいろいろ作って 変換してみるのがおもしろいと思いますよ。 擬似デルタ関数と離散フーリエ変換では予想と違うものが 計算されると思います。

atsuni34ku
質問者

お礼

回答ありがとうございました。 早速、計算してみようと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.2

 「フーリエ変換」と一口に仰るけれども、(Mathematicaのような数式処理プログラムなら話は別ですが)Fortranで書いた数値計算プログラムが周期のない連続関数(たとえばf(x)=exp(-(x^2))))をフーリエ変換できる筈がありませんよね。そのプログラム(DFT: discreet Fourier transform)で扱えるのは、「周期関数をサンプリングしたもの」だけです。  「周期関数」ってのは、入力する関数がたとえばF(1), F(2), …, F(1024)でおしまいであって、その前(F(0), F(-1), …)も後(F(1025), F(1026), …)も与えられていないということ。その数学的な意味は、「F(m)のmはどんな整数でもいいのだけれど、周期を持っていて F(m) = F(m+1024) という関係を満たす。なので、F(1), F(2), …, F(1024)を指定すれば全部決まる」ということです。  また「サンプリングしたもの」というのは、入力が連続関数ではないということ。F(1), F(2), …の値は与えられているが、その中間、たとえばF(√2)が幾らなのか、ということは与えられていない、ってことです。これを数学的に表すと、入力関数は実は無限個のδ関数の和   f(x) = Σ{n=-∞~∞} F(n)δ(x - 2π(n-1)/1024) に他ならない。δ関数の中心の位置が一定間隔(2π/1024)で並んでいる訳です。  このとき、f(x)のフーリエ変換   g(ω) = ∫{x=-∞~∞) f(x) exp(-2πiωx) dx (iは虚数単位) もまた、   g(ω) = Σ{n=-∞~∞} G(n)δ(ω - 2π(n-1)/1024) というδ関数の和になり、G(n) = G(n+1024)という周期を持つ。(証明するのはなかなか大変ですが。)で、ご質問のプログラムが計算するのはこのG(n)の値です。  というわけで、「デルタ関数を入力する」のに最も近いことをやるには、   F(1)=1, F(2)~F(1024)=0 とする。ただしこれで作れる関数f(x)は   f(x) = Σ{N=-∞~∞} δ(x - 2πN) という、2πの周期を持つ周期関数であって、本物のδ関数ではない。なので、g(ω)は定数(これは連続関数)にはならず、上記の通りδ関数の和になります。そして、その係数G(n)がどのnについても同じ値になる。  やってみれば、これが確認できることでしょう。(ってか、何でまだやってないの?)  なお、この計算の場合にはF(n), G(n)の虚数成分はすべて0だけれども、一般にはF(n), G(n)はどっちも複素数であることにご注意。

atsuni34ku
質問者

お礼

回答ありがとうございました。 参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • フーリエ変換のプログラム

     プログラム言語の種類は問いません。 入力数値データを読み込み(ファイルからでも直接入力によるものでもかまいません)、 フーリエ変換を行うプログラムの基本的な考え方を教えてください(プログラムそのものは求めません。考え方を教えてください)。  しばらくの間フーリエ変換について勉強してはいるものの、まだよく理解していない状況ですし、プログラムに関してもまだまだ未熟者です。 しかし、どちらも勉強しながらこのプログラムを作ってみようと思っています。  けれども、フーリエ変換の指数関数を用いた式だと虚数を扱わなければならないし、 sin, cosを使った式だと計算量が膨大になってしまいそうで(指数関数を用いた式でもそんなに変わらないとは思いますが)、 どこから手をつければよいかまったく見当がつきません。 考え方を教えていただければ結構ですので、よろしくお願いします。

  • フーリエ変換

    Fortranでフーリエ変換のプログラムを書くにあたって、フーリエ変換の勉強を理論からプログラムまで学びたいのですが、何かよい参考文献があれば教えて下さい。よろしくお願いします。

  • 離散フーリエ変換をC言語でどの様に書けばいいですか?

    C言語でDFT離散フーリエ変換を書くにはどの様に書けばよろしいですか? Googleで検索すれば書き方は出てくるのですが、使ってる関数がいまいちよく分かりません。 ・データの入力 ↓ ・フーリエ変換の計算 ↓ ・結果の出力というのをやればいいのは理解できるのですが、C言語でどの様に書けばいいか分からなくて…

  • sech関数のフーリエ変換

    sech関数のフーリエ変換についてです。 公式集やネットによるとsech関数のフーリエ変換は f(x)=sech(ax)とすると、F(ω)=(π/a)sech(πω/2a) となるようなのですが、どのような過程でこうなるのかがわかりません。 このフーリエ変換の導出について教えていただきたいです。よろしくお願いします。

  • フーリエ変換

    【1】次のような関数をフーリエ変換するにはどうしたらよいのでしょうか? f(t) = 1 ( nT-d <= t <= nT+d )     0 ( (n-1)T+d < t < nT-d )     n = 0, ±1, ±2, ±3, ... ..., 0, 1, 0, 1, ... を繰り返す周期関数のようですが,周期関数のフーリエ変換はどのようにするのでしょうか.また,範囲を表すのに文字が三つも使われていて,うまくイメージできないのですが,グラフに描くとどのようになりますか? 【2】二つの関数 f(t), g(t) の積 f(t)g(t) をフーリエ変換するにはどうしたらよいのでしょうか? 詳しい手順を教えてください.また,具体例を示していただけるとうれしいです. 「たたみこみ」が関係しているようですが,いまひとつよくわかりません. F[f(x)g(x)](ω) = (1/(2π))F*G(ω) の右辺の意味がわかりません. 【3】エネルギースペクトルを求めるにはどうしたらよいのでしょうか? 「パーセバルの等式」を使うのでしょうが,使い方がわかりません. 詳しい手順を教えてください.また,具体例を示していただけるとうれしいです.

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

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

  • 離散フーリエ変換をC言語で書く方法について

    C言語でDFT離散フーリエ変換を書くにはどの様に書けばよろしいですか? Googleで検索すれば書き方は出てくるのですが、使ってる関数がいまいちよく分かりません。 ・データの入力 ↓ ・フーリエ変換の計算 ↓ ・結果の出力というのをやればいいのは理解できるのですが、C言語でどの様に書けばいいか分からなくて…

  • 特殊関数のフーリエ変換

    関数f(t)=const*|t|^(-1/2)をフーリエ変換することを考えます。 constは任意定数です。 このようなt=0で無限大に発散する関数を数値的に フーリエ変換する場合の一般的手法をご存知の方がいらしたら、 ご教示いただけないでしょうか?

  • フーリエ変換が恥ずかしながらできません

    波形X(t)=10cos(1000t+π/3)+20cos(2000t+π/6)をフーリエ変換して帯域幅のfmを求めて最大許容サンプリング間隔Tsを得たいのですが、自分がフーリエ変換してみると、デルタ関数が四つ出てきてうまくfmが求まりません。自分のやり方が間違っているようなので、アドバイスを下さい。

  • フーリエ変換した結果がおかしなことになってしまいました。

    f(t)をフーリエ変換した結果、F(ω) = 0 になることはあるのでしょうか? というのは、f(t)=exp(-at^2) × {cos(bt)}^3 × log(1+t^2) × δ(t) (δ(t)はデルタ関数) をフーリエ変換する問題がありまして、f(t)δ(t)をフーリエ変換するとf(0)になる という性質を用いて計算したところ、F(ω) = 0 となりました。 F(ω) = 0 ということは全周波数成分の強さが0ということですよね? 問題の関数を見る限りそんな気はしないのですが・・・。 どなたかアドバイスよろしくお願いいたします。