%
% 1次元定在波のアニメーション
% 
% MATLAB R2015a
% 2016/7/25 Copyright (c) Takuichi Hirano
%
function standing_wave_1d
    ci=complex(0,1);    % 虚数単位i
    eps0=8.854e-12;     % 真空の誘電率
    mu0=4.*pi.*1e-7;    % 真空の透磁率
    c=2.99792458e8;     % 光速

    lambda0=1.;         % 波長
    freq=c./lambda0;    % 周波数
    omega=2.*pi.*freq;  % 角周波数
    T=1./freq;          % 周期

    %----------------
    % 入力パラメータ
	a=1.0;              % 右に進む入射波の係数
	b=-0.5;             % 左に進む反射波の係数
    %----------------
    % 描画・動画パラメータ
    canvas_scale=1;     % 描画領域サイズのスケール(1: 画面サイズいっぱい)
    %----------------

    % VSWRの計算と出力
    vswr=(abs(a)+abs(b))/abs(abs(a)-abs(b));
    %disp('Voltage standing wave ratio (VSWR):');
    %disp(vswr);

    k0=omega.*sqrt(eps0.*mu0);  % 自由空間の波数
    eta0=sqrt(mu0./eps0);       % 自由空間の界インピーダンス

    % グラフィックを描画
    scrsz = get(groot,'ScreenSize');    % 画面サイズの取得
    canvas_width=(scrsz(3))*canvas_scale;
    canvas_height=(scrsz(4))*canvas_scale;
    font_size=(canvas_width/800)*12;    % フォントサイズ
    fig=figure('Position',[(scrsz(3)/2-canvas_width/2) (scrsz(4)/2-canvas_height/2) canvas_width canvas_height]);

    zmin=-2.0;
    zmax= 0.0;
    Z=zmin:(zmax-zmin)./100:zmax;
    [m,n]=size(Z);

    nframe=16;
	for i=1:nframe
        clf;        % 現在のFigureウィンドウをクリア
        t=(T./nframe).*(i-1);

        % 入射波
        f_inc=real(a.*exp(-ci.*k0.*Z).*exp(ci.*omega.*t));
        % 反射波
        f_ref=real(b.*exp(+ci.*k0.*Z).*exp(ci.*omega.*t));
        % 入射波+反射波
        f_tot=real((a.*exp(-ci.*k0.*Z)+b.*exp(+ci.*k0.*Z)).*exp(ci.*omega.*t));
        f_tot_env=abs((a.*exp(-ci.*k0.*Z)+b.*exp(+ci.*k0.*Z)));

        %--------
        % Figure
        plot(Z,f_inc,'b', ...
             Z,f_ref,'g', ...
             Z,f_tot,'r', ...
             Z,abs(a)*ones(n),'b:', ...
             Z,-abs(a)*ones(n),'b:', ...
             Z,abs(b)*ones(n),'g:', ...
             Z,-abs(b)*ones(n),'g:', ...
             Z,f_tot_env,'k--', ...
             Z,-f_tot_env,'k--');       % グラフを描画
        axis tight;                     % データの範囲と描画範囲を一致させる
        ylim([-2.*abs(a) 2.*abs(a)]);
        xlabel({'x (wavelength)'});     % xlabel を作成
        ylabel({'Amplitude'});          % ylabel を作成
        title({'Standing Wave'});       % title を作成
        legend('Inc. wave','Ref. wave','Inc. + Ref. waves')

        % 説明用 textbox を描画
        tb1=annotation('textbox',[0.14 0.78 0.35 0.125],...
            'String',{sprintf('VSWR=%4.1f',vswr)});
        tb1.EdgeColor='none';           % 枠の色
        tb1.FontSize=font_size;         % フォントサイズ設定

        set(gca,'FontSize',font_size);  % フォントサイズ設定
        drawnow
        frm(i)=getframe(gcf);
    end
    movie(fig,frm,10);                  % 動画の再生(最後の引数は繰り返し回数)
    
    % 動画のファイル保存
    v = VideoWriter('standing_wave_1d.avi');
    v.FrameRate = 4;	% Default 30
    v.Quality = 75;     % Default 75
    open(v);
    nrep=3;            % 繰り返し回数
    for k=1:nrep
        for i=1:nframe
            writeVideo(v,frm(i));
        end
    end
    close(v);
end


