レンズのフーリエ変換作用とは何かわかりやすく教えて下さい。
または、光学的な計算・解析でのフーリエ変換の意味を教えて下さい。
なお、私一応、数学のフーリエ変換をわかっているつもりです。
これをどうレンズに応用するのか、よくわからないのです。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

既にある程度の予備知識はお持ちのようなので、簡単に説明しますね。


詳しくは光学の割と基本的な本を参考にして下さい。

出発点はキルヒホッフの回折理論になります。
で、今光源があり、その先に開口がある場合、開口を通った像は上記理論の式で計算できます。
この像は要するに回折像になります。
さて、この像は、開口とスクリーンの距離によって、フレネル回折像(近いとき)、フランフォーファ回折像(遠いとき)と区別して計算します。
というのも、それによって近似の仕方が異なるためです。
さて、ここで、開口の後ろにレンズを入れてその焦点距離にスクリーンを置くと、レンズの働きにより丁度開口とスクリーンの距離を無限遠にしたときに相当します。
さて、こうやって立てたレンズによるこのフランフォーファ回折像の式を眺めると、丁度フーリエ変換式と同じ形になります。
(開口の関数をフーリエ変換した形になる)

これが基本となります。
おもしろいのはこの近似のなれの果てのような形で出てきたフーリエ変換による取り扱いが光学ではかなり本質的な意味をもちフーリエ光学として発展しました。
詳しい計算は省略しますが、開口による「フランフォーファ回折」の計算が載っていればその式を眺めてみることが出来ますよ。
    • good
    • 1
この回答へのお礼

大変わかりやすい説明で、参考になりました。
再勉強しようと思います。
これからも、皆さんのために
わかりやすい回答をお願いします。

お礼日時:2001/09/15 23:47

ちょっと古い本ですが、「フーリエ結像論」(共立出版)が分かりやすく、手許に置いています。



 光学系に点光源から光を入れたとき、それがどういう像を結ぶか、というのをOTF(optical transfer function)と言います。これが光学系の特性を表している。画像Pを入力したとき、出力はP*OTFになるからです(*は畳み込み積分)。つまり光学系はフィルターの一種であると考えることができる。幾何光学でも波動光学でもこの考え方は通用しますが、特に波動光学において重要です。OTFを複素関数として扱うことによって、光波の位相まで記述でき、これがホログラムなどの干渉現象では重要な役割を果たします。

 ご質問については、(おおざっぱな話ですが、)光学系が像を結んでおらず、平行光線を出力しているとき、これが像のフーリエ変換になっている。ですからここに絞りをいれてやると、特定の周波数成分を削ることができる。真ん中に邪魔物を入れれば直流成分を削って輪郭強調像が作れる訳です。もちろん、光がレーザー光などのように可干渉性(coherence)を持つことが前提ですけど。
    • good
    • 0
この回答へのお礼

大変詳しく、かつ、わかりやすい説明で、有難うございます。
私も「レンズ設計のための波面光学」(草川徹 著 東海大学出版会)で、
OTFと関係があることはわかったのですが。
回答の前半はよくわかりました。
後半の「光学系が像を結んでおらず、平行光線を出力しているとき、これが像のフーリエ変換になっている」という部分がちょっと、まだ私には理解ができていません。
これからも勉強したいと思います。
ありがとうございました。

お礼日時:2001/09/09 23:46

私もよくわからないのですが、興味があって調べて見ました。


レンズと言うよりも、開口には光の回折作用があり、この結果(回折画像)がもとの光の二次元フーリエ変換になり、これにレンズを組み合わせてレンズのフーリエ変換作用と言うようです。
下記URLもどうぞ

参考URL:http://www.newport-japan.co.jp/tutorial/opt_113_ …
    • good
    • 0
この回答へのお礼

早速の御回答、有難うございます。
私も「レンズ設計のための波面光学」(草川徹 著 東海大学出版会)で、
OTFと関係あるらしく、特に回折に関係深いらしいことはわかりました。
また私もhttp://www.newport-japan.co.jp/tutorial/は前から見ていました。
わかりやすいですね。
さらにレンズとFFTとの関係とかわかるとありがたいですが。
多分光線追跡の計算手法だと思いますが。
ありがとうございました。

お礼日時:2001/09/09 23:52

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

C言語でDFT離散フーリエ変換を書くにはどの様に書けばよろしいですか?

Googleで検索すれば書き方は出てくるのですが、使ってる関数がいまいちよく分かりません。


・データの入力

・フーリエ変換の計算

・結果の出力というのをやればいいのは理解できるのですが、C言語でどの様に書けばいいか分からなくて…

Aベストアンサー

学習中である場合とする解答です。使用パソコンは Linuxまたは Mac OSX などの UNIX系OSです。

<・データの入力>
1)エディタで専用データファイルを作ることから始めます。
 マトリックスは、それに対応した数値をファイル内配置します。

  N
  W0 W0 W0 W0 ....
  W0 W1 W2 W3 ....
  W0 W2 W4 W6 ....
  ....
  N0
  N1
  N2
   .
   .

 上記定義されたマトリックスを ↓のようにファイルに書き込む
 仮に整数値としていますが、実数ならば実数値を書き込んで下さい。

5
  0 0 0 0 ....
0 1 2 3 ....
0 2 4 6 ....
  ....
  0
  1
  2
  .
  .


 各数値間は半角スペースで区切ってそれぞれの数式定義対応マトリックスを作ります。
 ファイル名は半角英字がエラーなく行えるので英字ファイル名を使うことを勧めます。

2)データの読み込み
 データの入力は scanf() を使います。
 最初にNを読み込めば、マトリックス行数がわかるため for() を使ってプログラムしますが、慣れない場合は腕力で scanf() 関数を連発するのもひとつの方法です。
 データファイル読み込みに際しての疑問は、作成したプログラムを起動する際、ターミナルのシェルプロンプトとから
   ./a.out<データファイル名
 と打鍵すればデータファイルを取り込むことができます。
 以上をCで表すと次のようになります。scanf() はそちらで勉強して下さい。
 プログラム作成に際しては、一気に書き込まず。途中で printf() を入れてデータ取り込みを確認されることを勧めます。

3)Cプログラム
 /* magatai.c DFT program
  * file name: magatai.c
  * compile: gcc magatai.c
  * execution: ./a.out<data_file
  */

 #define N 10 取り込みデータ数+α

 double n;
 double w[N][N];
 double x[N];

 int main(void)
 {
  int i, j;
  scanf(%d, &n);
  for (i = 0; i < n; i++)
   scanf(%......
   .... ↓のフーリエ式が入る。
   .... ↓↓の結果の出力が入る。
  return 0;
 }


<・フーリエ変換>
 これは for() の入れ子になります。
  for (i = 0; i < n; i++) {
   for (j = 0; j < n; j++ {
    フーリエ変換式;
   }
  }


<・結果の出力>
 printf() を使います。↑のフーリエ・プログラムに続いて書きます。
  for (i = 0; i < n; i++ )
   printf("%f?n", x[i]);

 計算結果を特定のファイルに残したいという場合は、プログラム起動の際、リダイレクトを使います。
   ./a.out<データファイル名>書き込むファイル名
 後は、 cat などを使ってファイルをリストすれば良いでしょう。

参考URL:http://laputa.cs.shinshu-u.ac.jp/~yizawa/InfSys1/basic/chap6/index.htm

学習中である場合とする解答です。使用パソコンは Linuxまたは Mac OSX などの UNIX系OSです。

<・データの入力>
1)エディタで専用データファイルを作ることから始めます。
 マトリックスは、それに対応した数値をファイル内配置します。

  N
  W0 W0 W0 W0 ....
  W0 W1 W2 W3 ....
  W0 W2 W4 W6 ....
  ....
  N0
  N1
  N2
   .
   .

 上記定義されたマトリックスを ↓のようにファイルに書き込む
 仮に整数値としていますが、実数ならば実数値を書き込んで下...続きを読む

Q高速フーリエ変換とフーリエ変換の違い

高速フーリエ変換とフーリエ変換の違いについて教えて下さい。
高速フーリエ変換は何か近似を行うことによって、計算速度を速くしているのでしょうか?
もし、何かの極限で出てくる結果が違う場合などがあれば教えて下さい。

Aベストアンサー

>出てくる結果は全く同じだということなのでしょうか?
その通りです。

QC言語でフーリエ変換を作成したいです。

(d^n/dx^n)f(x)=1/2π∫(∞to-∞)(ik)^nF(x)*e^ikxdk
をC言語で表したいのですが、上手くいきません。
nは実数でF(x)はf(x)の微分です。

アイデアだけでもいいので教えてください。

Aベストアンサー

フリーのライブラリを一つ紹介します。

汎用 FFT (高速 フーリエ/コサイン/サイン 変換) パッケージ
Copyright Takuya OOURA, 1996-2001

設計方法も説明されていますので、参考にされてはいかがでしょうか。

参考URL:http://momonga.t.u-tokyo.ac.jp/~ooura/fft-j.html

Q光学 感受率 フーリエ変換

フーリエ変換を調べると時間領域から周波数領域に変換するときには
exp[-iωt]
をかけているのですが,光学の本では
exp[iωt]
をかけています.なぜ統一しないのですか?

感受率を計算するとき
exp[-iωt]
を用いると実部に負号が出てきてしまいます.この負号をなくすためですかね?

Aベストアンサー

なぜと言われても、同じ光学の本の中でも

>exp[-iωt]



>exp[iωt]

の2系統がありますから、著者の趣味の問題としか・・・・

光学で単色光を扱う場合、時間因子を落とした複素振幅で計算する場合が多く、その時、座標に依存する因子(e^{ikr}とか)の指数部が正になるのでe^{i(kr-wt)}の形のほうが私は好きです。

フーリエ変換とのからみでは、数学的にはマイナスがついてる方がフーリエ変換、+の方が逆変換なのでexp[-iωt]にしておけば時間から周波数空間への変換がフーリエ変換になるので時間に関しては都合がいいのは確かですが、その場合、e^{i(kx-wt)}という波動の空間部分のフーリエ変換が+が座標空間から波数空間へ変換になってしまうので、物理としてはあまり符号にこだわらなくてもいいのではと思います。

Qフーリエ変換のC言語プログラムについて

正弦波(およびガウス性雑音)をフーリエ変換(離散)→逆フーリエ変換するというプログラムを組みました。正弦波をフーリエ変換すると実部は2回ピークがくるはずなのですが、すべて「0.000000」または「-0.000000」と表示されてしまいます。虚部は正常なようで実装の仕方もさほど違わないので、何が問題なのかわからずにいます。念のためコードはすべて載せますが、該当箇所は関数Fourierの
fp = fopen("reX.txt", "w");//書き込む
あたりです。問題点を教えていただけないでしょうか。お願いします。


//gauss.txt, sin.txt:発生させたガウス性雑音&正弦波
//reX, imX:フーリエ変換の実部と虚部
//re-1, im-1:逆フーリエ変換の実部と虚部

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define PI3.14159265358979323846
#define N256

//n:長さ, w:角周波数, p:位相(phase), a:振幅
void SinCurve(int n, double w, double p, double a)
{
FILE *fp;
double x;
int t;

fp = fopen("sin.txt", "w");//書き込むので"w"
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(t = 0; t < n; t++)
{
x = a * sin( w*(double)t + p );
fprintf(fp, "%f\n", x);
}
}

fclose(fp);
}

//n:長さ, s:分散, m:平均
void Gauss(int n, double s, double m)
{
FILE *fp;
double x, x1, x2, y1;
int t;

srand((unsigned) time(NULL));

fp = fopen("gauss.txt", "w");//書き込むので"w"
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(t = 0; t < n; t++)
{
x1 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0);
x2 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0);
y1 = pow(-2.0*log(x1), 0.5) * cos(2.0*PI*x2);
y1 = s * y1 + m;
fprintf(fp, "%f\n", y1);
}
}

fclose(fp);
}

//ファイル名sのデータをフーリエ変換し、実部と虚部をreX, imXに保存
void Fourier(int num, char *s)
{

FILE *fp;
int k, n;
double largeX, x[N+100], t;

fp = fopen(s, "r"); //読み込み
if(fp == NULL)
{
printf("file open error\n");
} else
{
//printf("%s\n", s);
for(k = 0; k < num; k++)
{
fscanf(fp, "%lf", &x[k]);
printf("x[%d]=%f\n", k, x[k]);
}
}

fp = fopen("reX.txt", "w");//書き込む
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(k = 0; k < num; k++)
{
largeX = 0.0;
t = 2.0*PI*(double)k / (double)N;
for(n = 0; n < num; n++)
{
largeX += x[n] * cos((double)n*t);
//printf("%f\n", largeX);
}
fprintf(fp, "%f\n", largeX);
printf("reX[%d]=%f\n", k, largeX);
}
}

fp = fopen("imX.txt", "w");//書き込む
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(k = 0; k < num; k++)
{
largeX = 0.0;
t = 2.0*PI*k / (double)N;
for(n = 0; n < num; n++)
{
largeX -= x[n] * sin(n*t);
}
fprintf(fp, "%f\n", largeX);
}
}

fclose(fp);
}

void InverseFourier(int num)
{
FILE *fp;
int k, n;
double a[N+100], b[N+100], x, t;
//a:reX, b:imX

fp = fopen("reX.txt", "r"); //読み込み
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(k = 0; k < num; k++)
{
fscanf(fp, "%lf", &a[k]);
//printf("a[%d]=%f\n", k, a[k]);
}
}

fp = fopen("imX.txt", "r"); //読み込み
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(k = 0; k < num; k++)
{
fscanf(fp, "%lf", &b[k]);
//printf("b[%d]=%f\n", k, b[k]);
}
}

fp = fopen("re-1.txt", "w"); //読み込み
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(n = 0; n < num; n++)
{
x = 0.0;
t = 2.0*PI*(double)n / (double)N;
for(k = 0; k < num; k++)
{
x +=a[k] *cos(k*t) - b[k] *sin(k*t);
}
x /= (double)N;
fprintf(fp, "%f\n", x);
//printf("x[%d]=%f\n", n, x);
}
}
/*
fp = fopen("im-1.txt", "w"); //読み込み
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(n = 0; n < num; n++)
{
x = 0.0;
for(k = 0; k < num; k++)
{
t = 2.0*PI*(double)k / (double)N;
x = x + a[k] *sin(n*t) + b[k] *cos(n*t);
}
x /= (double)N;
fprintf(fp, "%f\n", x);
}
}
*/

fclose(fp);
}

int main(void)
{
SinCurve(N, PI/8.0, 0.0, 1.0);

//Gauss(N, 1.0, 0.0);

Fourier(N, "sin.txt");

//Fourier(N, "gauss.txt");

InverseFourier(N);

return 0;
}

正弦波(およびガウス性雑音)をフーリエ変換(離散)→逆フーリエ変換するというプログラムを組みました。正弦波をフーリエ変換すると実部は2回ピークがくるはずなのですが、すべて「0.000000」または「-0.000000」と表示されてしまいます。虚部は正常なようで実装の仕方もさほど違わないので、何が問題なのかわからずにいます。念のためコードはすべて載せますが、該当箇所は関数Fourierの
fp = fopen("reX.txt", "w");//書き込む
あたりです。問題点を教えていただけないでしょうか。お願いします。


//gauss.txt...続きを読む

Aベストアンサー

元のデータがsin関数なら、虚部だけしか出ないので正常では?

fopen()に対応したfclose()が必要なのはその通りなので直すべきですが。

Q作用、反作用って勿論作用が先なんだと思うのですが

作用、反作用って勿論作用が先なんだと思うのですが
反作用に時間的な遅れが有るのか?
もう一つ、元々の作用を起こすための力はどこから発生するのかわかりません。
自然現象の中の作用反作用は気象などに影響されるのかと思いますが
人が物を動かすとき脳の中の命令によるものと思います。
しかしその命令のもともとの起点がどこなのか判りましたら
教えてください。

Aベストアンサー

えっと、
発想が違います。

さらに厳密に言うなら、

・力が作用しているとき、対になる反作用がある。
です。

「ひもをひっぱると、ひっぱられる感覚がする」
ではありません。

厳密には、
「ひもをひっぱっているとき、引っ張られる感覚も同時にある」
「壁を押しているとき、壁からも同時に押されている」
です。
そして、その二つの力の大きさが「=」なのです。


この作用反作用の法則(ニュートンの第3法則)は、
他の二つの法則と一つのセットになっていて、

また、この考え方が、自然界の原理原則なのですよ、ということです。



なにかをしたときに、その反応がある、
なにかをすると、それが伝達される
というのは、
例えば、
壁を押すと、反動が返る、
ひもをひっぱると反動がある
これは作用反作用のことではありません。


ここの議論をするには、
ニュートン力学に基づいた、さらに発展的な、
連続体の力学で語られ、
基本的にはニュートン力学の範疇ではありません。


或は、力が伝わっていく、そういう変化について取り扱うのも、同じで、ニュートン力学の範疇ではありません。



>自然現象の中の作用反作用
>人が物を動かすとき脳の中の命令によるもの
これは、因果律のことですね。

因果の因の部分を辿っても、因果の果を辿っても、
謎なのです。


「我々はどこからきて、どこへいくのか」
科学の永久のテーマです。


もっと端的には、
因果関係にも、程度というのがあって、
これは原因で、これが結果で、というのもいいにくいし、
これが原因でこれが結果だ、というのも関係の度合いがあります。


そういう哲学的な次元になると、
どうかなぁ...。

最先端の物理学の基礎が参考になるかもしれません。
例えば、重力場がどう伝わるとか、電場・磁場がどう伝わるとか。
で、その背景に何があるだろうかとか。


楽しいかもしれません。

えっと、
発想が違います。

さらに厳密に言うなら、

・力が作用しているとき、対になる反作用がある。
です。

「ひもをひっぱると、ひっぱられる感覚がする」
ではありません。

厳密には、
「ひもをひっぱっているとき、引っ張られる感覚も同時にある」
「壁を押しているとき、壁からも同時に押されている」
です。
そして、その二つの力の大きさが「=」なのです。


この作用反作用の法則(ニュートンの第3法則)は、
他の二つの法則と一つのセットになっていて、

また、この考え方が、自然界の原理原則なので...続きを読む

Qフーリエ変換やFFTのプログラム

C言語で書かれているFFTやフーリエ変換のプログラムのあるお勧めのサイトがあればおしえていただけないでしょうか?

よろしくお願いいたします。

Aベストアンサー

No1のepistemeさんが紹介してくださっているライブラリは、それなりに有名だと思うので、
検索すれば情報が得られると思います。

ちなみにライブラリ本体は、
http://www.fftw.org/

http://www.fftw.org/download.html
からダウンロードできます…。


参考:
http://www32.atwiki.jp/amaeda/

参考URL:http://www32.atwiki.jp/amaeda/

Qラプラス変換とフーリエ変換について教えて下さい。

ラプラス変換とフーリエ変換の違いは後者が虚数だけなのに対して、前者はそれを拡張して複素数に使えるようにしたものであるということ分かるのですが、その使い分け方がさっぱり分かりません。

・一般的に微分方程式を解くときにはラプラス変換を用いますが、これをフーリエ変換でしないのはなぜなのでしょうか?

・逆格子ベクトルを作るときや、スペクトラムアナライザーではフーリエ変換を使いますが、これをラプラス変換でしてはいけないのでしょうか?

・計算機用にフーリエ変換にはFFTというものがありますが、ラプラス変換を離散的にしたZ変換の計算機用に速くしたものがないのはなぜなのでしょうか?

よろしくお願い致します。

Aベストアンサー

お世話さまです。
>一般的に微分方程式を解くときにはラプラス変換を用いますが、これをフーリエ変換でしないのはなぜなのでしょうか?
無限に続く関数はフーリエ変換できないため。sin関数が例です。
積分した値が無限無限大以下となるような関数しか扱えません。

ラプラス変換でもスペクトラムアナライザー変換できます。
フーリエ変換の中にラプラス変換があるイメージで考えるとわかりやすいです。まず使用はないです。積分・微分演算子の分野として確立してます。

Q画像を二次元フーリエ変換

c言語で画像を入力して2次元フーリエ変換を行い,逆変換をしたいのですが全然うまくいきません.

どなたか教えていただけませんか?

いろいろ調べたのですが,プログラム初心者なのでどう書いていけばいいのかわからず辛いです...

サンプルのコードも教えていただけると助かります.

画像サイズは256×256画素程度です.

Aベストアンサー

検索すればソースコードは見つかると思います。
例えば
http://hooktail.org/computer/index.php?2%BC%A1%B8%B5%A5%D5%A1%BC%A5%EA%A5%A8%CA%D1%B4%B9
とか

プログラムを作るのが目的ではなく、計算するだけならImageJで画像処理ができます。
http://rsbweb.nih.gov/ij/
メニューにFFTがありますのでそれを使ってみてください。数値での入出力もできます。
フーリエ変換の結果は普通は複素数になるのですが、このソフトは絶対値をとっているはずで、普通はこれで十分ななずです。

複素数の結果が欲しいのなら
http://www.r-project.org/
https://www.scilab.org/
http://www.gnu.org/software/octave/
などで計算できます。

画像から数値データへの変換は上記のImageJで可能です。

Q光学 組み合わせレンズ

物体の高さ8cm。
焦点距離8cm。
物体から焦点までが4cm。
つまり物体から一枚目のレンズまでが12cmです。
二枚の凸レンズの距離が12cm。
この二枚のレンズによって生み出される像のサイズと位置を求めよという問題なのですがレンズの間に像ができないみたいでどうやって解いたらいいのかわかりません。
解法お願いします。。

Aベストアンサー

厚さを考えない薄レンズの結像公式は、レンズの中心に原点を取り、
光の進む方向を正とする座標系をとり、aを物体の座標、bを像の座標、fを焦点距離として

-1/a + 1/b = 1/f

が成り立ちます。a,bは物体、または像がレンズから見て光の進行方向にあれば正、その逆なら負に取ります。また、焦点距離fは凸レンズなら正、凹レンズなら負の値とします。

高校物理では細かく場合わけをしているとおもいますが、このような約束ごとにしておくと、レンズの結像公式はこれ一つですみます。

これに従うと、焦点距離8cmの凸レンズなのでf1=+8cm、おそらく物体はレンズから光源側に12cmなのでa1=-12cmとして、

-1/(-12cm) + 1/b1 = 1/(+8cm)より b1=24cm

これが2枚目のレンズの物体となりますが、凸レンズ間の距離が12cmなので、2枚目のレンズからは光の進行方向に12cm。つまり、a2=+12cm。2枚目も同じレンズとしてf2=+8cmなので

-1/(+12cm) + 1/b2 = 1/(+8cm)より b2=24/5=4.8cm

倍率は1枚目がb1/a1=24cm/(-12cm)=-2。つまり2倍の倒立像。
2枚目はb2/a2=(24/5 cm)/(+12cm)=2/5 =0.4で0.4倍の正立像。
組み合わせた結果は、(-2)×(2/5)=-4/5=-0.8で0.8倍の倒立像です。

厚さを考えない薄レンズの結像公式は、レンズの中心に原点を取り、
光の進む方向を正とする座標系をとり、aを物体の座標、bを像の座標、fを焦点距離として

-1/a + 1/b = 1/f

が成り立ちます。a,bは物体、または像がレンズから見て光の進行方向にあれば正、その逆なら負に取ります。また、焦点距離fは凸レンズなら正、凹レンズなら負の値とします。

高校物理では細かく場合わけをしているとおもいますが、このような約束ごとにしておくと、レンズの結像公式はこれ一つですみます。

これに従うと、焦点...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング