ファブリペロー干渉計について
5 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)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/257314/image.png)
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)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/257343/image.png)
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
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!