ファブリペロー干渉計について
9 views (last 30 days)
Show older comments
はじめてコードを書いた初心者です
ファブリぺロー干渉計の入力に対する出力を書きたいと思い書きました。
ですが、あまり上手くいきません。
間違えている場合や別の書き方があるならぜひ教えてください。
分かりにくい質問かもしれませんがよろしくお願いします。
式の内容はコメントに追記します
A=constant
R=constant
n=constant
c=constant
%
% This program simulates an Fabry-Perot
% Create an output structure similar to the input
OutputPort1 = InputPort1;
% Length variation
Length = Parameter0;
% calculate the optical signal
if(InputPort1.TypeSignal =='Optical' )
% verify how many sampled signals are in the structure
[ls, cs] = size(InputPort1.Sampled);
if( ls > 0 )
% caculate the at each signal
for counter1=1:cs
OutputPort1.Sampled(1, counter1).Signal = InputPort1.Sampled(1, counter1).Signal * ((1-A-R).^2/(1-R).^2+4*R*sin.^2*(2*pi*n*Length*f/c));
end
end
end
4 Comments
Akira Agata
on 26 Dec 2019
ファブリペロー干渉計の反射特性は、半透明膜の透過率と反射率にも依存するはずですが、この式にはそれらの項が含まれていないようです。念のため、いまいちど理論式をご確認ください。
Accepted Answer
Akira Agata
on 26 Dec 2019
Edited: Akira Agata
on 27 Dec 2019
初期パラメータを以下のように想定して計算したところ、波長によっては透過率(=出力光電力/入力光電力)が 1 を超えるという結果になっています。記載頂いた式のどこかに誤りがあると思われますので、再度ご確認頂けないでしょうか。
% 設定パラメータ
Rx = 0.45; % 半透明膜の反射率
Tx = 0.45; % 半透明膜の透過率
Ry = 0.95; % 反射膜の反射率
L = 100.0e-6; % 反射膜と半透明膜間の距離 [m]
c = 3.0e8; % 光速 [1/m]
lambda =... % 波長範囲 [m]
linspace(1.5e-6,1.6e-6,1000);
% 設定パラメータからの換算値
f = c./lambda; % 周波数 [Hz]
omega = 2*pi*f; % 各周波数 [rad/s]
phi = 2*L*omega/c;
% ファブリペロー干渉計の透過率(Tfp)を計算 (ただしTfp = P_out/P_inと定義)
Tfp =...
((Tx^2+Rx^2)*Ry-Rx)^2 +...
(4*Rx*Ry*(Tx^2+Rx^2)*(sin(phi/2)).^2)./((1-Rx*Ry)^2) +...
4*Rx*Ry*(sin(phi/2)).^2;
% 計算結果をプロット
figure
plot(lambda*1e6,Tfp)
xlabel('Wavelength [\mum]','FontSize',12)
ylabel('Transmittance','FontSize',12)
3 Comments
Akira Agata
on 27 Dec 2019
Edited: Akira Agata
on 27 Dec 2019
ご確認頂き、ありがとうございます。
ここまで来れば、あとはご指摘のとおり、波長範囲を固定してLを変化させれば問題ありません。
forループを使って計算しても良いのですが、せっかくですので行列演算に強いMATLABの特徴を活用してみてください。たとえば以下のようにすると、forループを使わずに計算することができます(lambdaとLを、それぞれ行ベクトルと列ベクトルにするところがポイントです)。
% 設定パラメータ
Rx = 0.45; % 半透明膜の反射率
Tx = 0.45; % 半透明膜の透過率
Ry = 0.95; % 反射膜の反射率
L = linspace(100.0e-6,105e-6)'; % 反射膜と半透明膜間の距離 [m]
c = 3.0e8; % 光速 [1/m]
lambda =... % 波長範囲 [m]
linspace(1.5e-6,1.55e-6,1000);
% 設定パラメータからの換算値
f = c./lambda; % 周波数 [Hz]
omega = 2*pi*f; % 各周波数 [rad/s]
phi = 2*L*omega./c;
% ファブリペロー干渉計の透過率(Tfp)を計算 (ただしR = P_out/P_inと定義)
Tfp =...
((Tx^2+Rx^2)*Ry-Rx)^2 +...
(4*Rx*Ry*(Tx^2+Rx^2)*(sin(phi/2)).^2)./(((1-Rx*Ry)^2) +...
4*Rx*Ry*(sin(phi/2)).^2);
% 計算結果をプロット
figure
surf(lambda*1e6,L*1e6,Tfp,...
'EdgeColor','none')
xlabel('Wavelength [\mum]',...
'FontSize',12,...
'Rotation',-20)
ylabel('Cavity length [\mum]',...
'FontSize',12,...
'Rotation',45)
zlabel('Transmittance','FontSize',12)
view(30,60)
More Answers (1)
Hiroumi Mita
on 23 Dec 2019
構造体を使っているようですが、プログラムの基本は
部分から全体、簡単なものから複雑なものへ変化させることなので、基本から進めましょう。
#1. まず、この式の正誤を確認しましょう。
OutputPort1.Sampled(1, counter1).Signal = InputPort1.Sampled(1, counter1).Signal * ((1-A-R).^2/(1-R).^2+4*R*sin.^2*(2*pi*n*Length*f/c));
#2. あっているようであれば
適当な数値を各パラメータにあてはめて期待値がでるか確認しましょう。
3, 関数にします。
4.入出力を構造体にします。
このように、確実に階段を昇っていくことがプログラムのコツです。
See Also
Categories
Find more on パラメトリック スペクトル推定 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!