メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

衛星リンク バジェットを最適化してビットレートを最大化する

この例では、ビット レートを最大化するために衛星リンク バジェットを最適化する方法を示します。この例では、送信機の高出力増幅器 ( HPA ) 電力、送信機のアンテナ直径、および受信機のゲイン対ノイズ温度比 (G/T) を最適化することにより、特定のリンク バジェットパラメーターで達成可能なビット レートを最大化するようにリンク マージンを調整します。最適化は、送信機の実効等方放射電力 (EIRP)、受信電力、およびアンテナ ゲインに対する制約を受けます。

この例では、Optimization Toolbox ™ の ライブ エディターの最適化 タスクが必要です。

エクスポートされたスクリプトを使用したベースラインリンク バジェット

ベースラインリンク バジェットを生成するために、この例では、衛星リンク バジェット アナライザー アプリからエクスポートされたデフォルトの MATLAB ® スクリプトを使用します。アプリはアップリンク (L1)、ダウンリンク (L2)、クロスリンク (L3) を解析できます。この例ではアップリンクの最適化のみを考慮していますが、同じ概念を他のリンクにも拡張できます。衛星リンク バジェット アナライザーアプリから同等の MATLAB スクリプトを生成するには、アプリのツールストリップで エクスポート をクリックします。

この図は、衛星リンク バジェット アナライザーアプリによって生成されたスクリプトの一部を示しています。

デフォルトでは、アプリはリンク (L1)、地上局(G1)、衛星(S1) のこれらのプロパティをエクスポートします。

%% Satellite (S1) properties
s1.Latitude = 35;              % deg
s1.Longitude = -40;            % deg
s1.Altitude = 2000;            % km

%% Satellite (S1) receiver properties
rx1.InterferenceLoss = 2;      % dB
rx1.RxGByT = 25;               % dB/K
rx1.RxFeederLoss = 1;          % dB
rx1.OtherRxLosses = 1;         % dB

%% Link (L1) properties
l1.Frequency = 14;             % GHz
l1.Bandwidth = 6;              % MHz
l1.BitRate = 10;               % Mbps
l1.RequiredEbByNo = 10;        % dB
l1.PolarizationMismatch = 45;  % deg
l1.ImplementationLoss = 2;     % dB
l1.AntennaMispointingLoss = 1; % dB
l1.RadomeLoss = 1;             % dB

%% Ground station (G1) location properties
g1.Latitude = 42.3;            % deg
g1.Longitude = -71.35;         % deg
g1.Altitude = 20;              % m

%% Ground station (G1) transmitter properties
tx1.TxFeederLoss = 2;          % dB
tx1.OtherTxLosses = 3;         % dB
tx1.TxHPAPower = 14;           % dBW
tx1.TxHPAOBO = 6;              % dB
tx1.TxAntennaGain = 30;        % dBi

エクスポートされたスクリプトのデフォルトの衛星、地上局、リンク、送信機、受信機の値を使用して、ローカル関数 calculateLinkBudget を使用して、ベースラインリンク マージンを計算します。

resultsBaseline = calculateLinkBudget(g1,s1,tx1,rx1,l1)
resultsBaseline = struct with fields:
                  Distance: 3.7865e+03
                 Elevation: 18.3253
                    TxEIRP: 32
          PolarizationLoss: 3.0103
                      FSPL: 186.9352
    ReceivedIsotropicPower: -160.9455
                     CByNo: 90.6537
                      CByN: 22.8722
            ReceivedEbByNo: 20.6537
                    Margin: 8.6537

追加のリンク バジェットパラメーター

最適化で使用する追加のリンク バジェットパラメーターを定義します。この例では、送信機アンテナ効率が 0.6、ノイズ温度が 200 K、リンク マージンが 3 dB であると想定しています。

txAntennaEfficiency = 0.6; 
noiseTemperature = 200;    % K
linkMargin = 3;            % dB

L1 の RequiredEbByNo および ImplementationLoss プロパティと指定されたリンク マージンを使用して、特定のビット エラー レート ( BER ) を達成するために必要な受信 Eb/No を推定します。

receivedEbByNo = l1.RequiredEbByNo + l1.ImplementationLoss + linkMargin; % dB

最適化問題の設定と解決

この例の最適化問題は、与えられたリンク マージンに対してビット レート (Mbps) を最大化する目的関数を作成することを目指しています。この問題では、次の設計変数と制約が使用されます。

  • 設計変数 – 送信機HPA電力、送信機アンテナ直径、受信機G/T

  • 制約事項 送信EIRP、アンテナ ゲイン、受信電力

設計変数を設定する

最適化変数(パラボラアンテナを表す送信アンテナの直径、 HPA出力電力、受信機のG/T)を調整します。探索空間を縮小するには、最適化変数に境界を指定します。この例では、 HPA電力は [10, 20] dBW の範囲、アンテナ直径は [0.5, 4.5] m の範囲、受信機 G/T は [10, 20] dB/K の範囲である必要があります。

minHPAPower = 10;           % dBW
maxHPAPower = 20;           % dBW
minTxAntennaDiameter = 0.5; % m
maxTxAntennaDiameter = 4.5; % m
minRxGByT = 10;             % dB/K
maxRxGByT = 20;             % dB/K

最適化目標の制約を設定する

設計では、最小受信電力、最大アンテナ ゲイン、および最大送信機EIRPの制約も満たす必要があります。アンテナ ゲイン、受信電力、および送信機EIRPの制限を定義します。これらの制限は、最適化問題の制約部分に適用されます。

maxAntennaGain = 40;    % dB
minReceivedPower = -95; % dBm
maxTxEIRP = 40;         % dB

最適化問題の構築と解決

問題を構築して解決するには、最適化 ライブ エディター タスクを使用します。MATLAB ツールストリップの ライブ エディター または 挿入 タブで タスク > 最適化 を選択すると、ライブ エディターの最適化 タスクをスクリプトに追加できます。

optimizelet_choose.png

問題ベースを選択します。問題ベースの 最適化ライブ エディター タスクの詳細については、「問題ベースの最適化ライブ エディター タスクの概要 (Optimization Toolbox)」を参照してください。

このタスクには、設計変数、目的関数、制約がすでに入力されています。

Live Task
% Create optimization variables
hpaPowerDB2 = optimvar("hpaPowerDB","LowerBound",minHPAPower,"UpperBound",...
    maxHPAPower);
rxGByT2 = optimvar("rxGByT","LowerBound",minRxGByT,"UpperBound",maxRxGByT);
antennaDiameter2 = optimvar("antennaDiameter","LowerBound",...
    minTxAntennaDiameter,"UpperBound",maxTxAntennaDiameter);

% Set initial starting point for the solver
initialPoint.hpaPowerDB = minHPAPower;
initialPoint.rxGByT = minRxGByT;
initialPoint.antennaDiameter = minTxAntennaDiameter;

% Create problem
problem = optimproblem("ObjectiveSense","Maximize");

% Define problem objective
problem.Objective = fcn2optimexpr(@objectiveFcn,hpaPowerDB2,rxGByT2,...
    antennaDiameter2,txAntennaEfficiency,receivedEbByNo,g1,s1,tx1,rx1,l1);

% Define problem constraints
problem.Constraints.constraint1 = rxGByT2 + 10.*(log(noiseTemperature)/log(10)) <= maxAntennaGain;
problem.Constraints.constraint2 = gainCalc(antennaDiameter2,...
    txAntennaEfficiency,l1.Frequency) <= maxAntennaGain;
problem.Constraints.constraint3 = receiverSensitivityConstraint(hpaPowerDB2,...
    rxGByT2,antennaDiameter2,noiseTemperature,txAntennaEfficiency,...
    minReceivedPower,g1,s1,tx1,rx1,l1);
problem.Constraints.constraint4 = txEIRPConstraint(hpaPowerDB2,...
    antennaDiameter2,txAntennaEfficiency,maxTxEIRP,g1,s1,tx1,rx1,l1);

% Display problem information
show(problem);
  OptimizationProblem : 

	Solve for:
       antennaDiameter, hpaPowerDB, rxGByT

	maximize :
       arg1

       where:

           arg1 = objectiveFcn(hpaPowerDB, rxGByT, antennaDiameter, 0.6, 15, extraParams{1}, extraParams{2}, extraParams{3}, extraParams{4}, extraParams{5});

       extraParams


	subject to constraint1:
       rxGByT <= 16.9897

	subject to constraint2:
       (10 .* (log((0.6 .* ((3.1416 .* antennaDiameter) ./ 0.021414).^2)) ./ 2.3026)) <= 40

	subject to constraint3:
       arg_LHS >= (-95)

       where:

             arg1 = ((((((((hpaPowerDB - 6) - 2) - 3) + (10 .* (log((0.6 .* ((3.1416 .* antennaDiameter) ./ 0.021414).^2)) ./ 2.3026))) - 1) - 3.0103) - 186.9352) - 2);
             arg_LHS = (((((arg1 - 1) + rxGByT) + 23.0103) - 1) + 30);

	subject to constraint4:
       (((((hpaPowerDB - 6) - 2) - 3) + (10 .* (log((0.6 .* ((3.1416 .* antennaDiameter) ./ 0.021414).^2)) ./ 2.3026))) - 1) <= 40

	variable bounds:
       0.5 <= antennaDiameter <= 4.5

       10 <= hpaPowerDB <= 20

       10 <= rxGByT <= 20
% Solve problem
[solution2,objectiveValue,reasonSolverStopped] = solve(problem,initialPoint);
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

<stopping criteria details>
% Display results
solution2
solution2 = struct with fields:
    antennaDiameter: 0.8202
         hpaPowerDB: 12.6108
             rxGByT: 16.9897

reasonSolverStopped
reasonSolverStopped = 
    OptimalSolution

objectiveValue
objectiveValue = 
3.6673e+07
% Clear variables
clearvars hpaPowerDB2 rxGByT2 antennaDiameter2 initialPoint reasonSolverStopped...
    objectiveValue

結果の解析

ベースライン設計と最適化された設計の設計パラメーターとメトリックを比較します。最適化された設計により、最終的なビットレートは36 Mbps以上に向上しますが、 HPA電力、アンテナ径、G/Tはトレードオフとなります。また、この設計では指定されたリンク マージンが達成されていることを確認してください。

uit = analyzeResults(solution2,resultsBaseline,g1,s1,tx1,rx1,l1,txAntennaEfficiency,noiseTemperature,receivedEbByNo);

Figure Link Budget contains an object of type uitable.

その他の調査

この例では、衛星リンク バジェット アナライザーアプリから生成された MATLAB スクリプトの最適化機能を使用して、ビット レートを最大化します。これらの変更を加えてこの例を実行してみてください。

  • リンク マージンを変更し、ビット レートを観察します。

  • さまざまな目的関数、設計変数、制約を考慮します。

  • 追加の物理的、コスト、または製造上の制約を考慮してください。

参考文献

[1]Berrezzoug、S.、F.T. Bendimerad、および A. Boudjemai。「重力探索アルゴリズムを使用した通信衛星リンク バジェットの最適化」2015 年第 3 回国際制御、エンジニアリング、情報技術会議 (CEIT)、1–7 ページ。アルジェリア、トレムセン:IEEE、2015年。https://doi.org/10.1109/CEIT.2015.7233120.

[2] Cheung, K.「リンクの設計と最適化におけるマージンの役割」2015 IEEE航空宇宙会議、1–11。Big Sky, MT:IEEE、2015年。https://doi.org/10.1109/AERO.2015.7119220.

ローカル関数

receiverSensitivityConstraint – 最小受信電力の制約。

function constraint = receiverSensitivityConstraint(hpaPowerDBParam,rxGByTParam,antennaDiameterParam,noiseTemperature,txAntennaEfficiency,minReceivedPower,gs,sat,tx,rx,link)

rxdPower = fcn2optimexpr(@receiverSensitivity,hpaPowerDBParam,rxGByTParam,antennaDiameterParam,noiseTemperature,gs,sat,tx,rx,link,txAntennaEfficiency);
constraint = rxdPower >= minReceivedPower; 
end

function rxdPower = receiverSensitivity(hpaPowerDBParam,rxGByTParam,antennaDiameterParam,noiseTemperature,gs,sat,tx,rx,link,txAntennaEfficiency)

tx.TxHPAPower = hpaPowerDBParam;
rx.RxGByT = rxGByTParam;
tx.TxAntennaGain = gainCalc(antennaDiameterParam,txAntennaEfficiency,link.Frequency); 
res = calculateLinkBudget(gs,sat,tx,rx,link);
rxdPower = res.ReceivedIsotropicPower + rx.RxGByT + 10.*(log(noiseTemperature)/log(10)) - rx.RxFeederLoss + 30;                                        % dBm

end

txEIRPConstraint – 最大送信機EIRPの制約。

function constraint = txEIRPConstraint(hpaPowerDBParam,antennaDiameterParam,txAntennaEfficiency,maxTxEIRP,gs,sat,tx,rx,link)

eirp = fcn2optimexpr(@txEIRP,hpaPowerDBParam,antennaDiameterParam,gs,sat,tx,rx,link,txAntennaEfficiency);
constraint = eirp <= maxTxEIRP; 
end

function eirp = txEIRP(hpaPowerDBParam,antennaDiameterParam,gs,sat,tx,rx,link,txAntennaEfficiency)

tx.TxHPAPower = hpaPowerDBParam;
tx.TxAntennaGain = gainCalc(antennaDiameterParam,txAntennaEfficiency,link.Frequency); 
res = calculateLinkBudget(gs,sat,tx,rx,link);
eirp = res.TxEIRP;

end

objectiveFcn – ビットレートを最大化するための目的関数。

function bitRate = objectiveFcn(hpaPowerDBParam,rxGByTParam,antennaDiameterParam,txAntennaEfficiency,receivedEbByNo,gs,sat,tx,rx,link)

tx.TxHPAPower = hpaPowerDBParam;
rx.RxGByT = rxGByTParam;
tx.TxAntennaGain = gainCalc(antennaDiameterParam,txAntennaEfficiency,link.Frequency);
res = calculateLinkBudget(gs,sat,tx,rx,link);
bitRateDB = res.CByNo - receivedEbByNo;
bitRate = 10.^(bitRateDB/10); 

end

gainCalc – パラボラアンテナの利得を計算します。

function gdB = gainCalc(antennaDiameterParam,antennaEfficiency,freq)
lambda = physconst('LightSpeed')/(freq*1e9);                         % Frequency in GHz
g = antennaEfficiency*(pi*antennaDiameterParam/lambda).^2;
gdB = 10.*(log(g)/log(10)); 
end

calculateLinkBudget –リンク バジェットの結果パラメーターを計算します。

function res = calculateLinkBudget(spec,sat,tx,rx,lnk,varargin)
assignin("base","struct1",spec);
assignin("base","struct2",sat);
assignin("base","struct3",tx);
assignin("base","struct4",rx);
assignin("base","struct5",lnk);
resultProperty = [];
resultVariable = [];
if nargin > 5
    resultVariable = varargin{1};
end
if nargin == 8
    resultProperty = varargin{2};
    resultValue = varargin{3};
end
params = {"Distance"; "Elevation"; "TxEIRP"; "PolarizationLoss"; ...
    "FSPL"; "ReceivedIsotropicPower"; "CByNo"; "CByN"; ...
    "ReceivedEbByNo"; "Margin"};
eqns = {"satcom.internal.linkbudgetApp.computeDistance(struct1.Latitude, struct1.Longitude, struct1.Altitude, struct2.Latitude, struct2.Longitude, struct2.Altitude*1e3)"; ...
    "satcom.internal.linkbudgetApp.computeElevation(struct1.Latitude, struct1.Longitude, struct1.Altitude, struct2.Latitude, struct2.Longitude, struct2.Altitude*1e3)"; ...
    "struct3.TxHPAPower - struct3.TxHPAOBO - struct3.TxFeederLoss - struct3.OtherTxLosses + struct3.TxAntennaGain - struct5.RadomeLoss"; ...
    "20 * abs(log10(cosd(struct5.PolarizationMismatch)))"; ...
    "fspl(temp.Distance * 1e3, physconst('LightSpeed') ./ (struct5.Frequency*1e9))"; ...
    "temp.TxEIRP - temp.PolarizationLoss - temp.FSPL - struct4.InterferenceLoss - struct5.AntennaMispointingLoss"; ...
    "temp.ReceivedIsotropicPower + struct4.RxGByT - 10*log10(physconst('Boltzmann')) - struct4.RxFeederLoss - struct4.OtherRxLosses"; ...
    "temp.CByNo - 10*log10(struct5.Bandwidth) - 60"; ...
    "temp.CByNo - 10*log10(struct5.BitRate) - 60"; ...
    "temp.ReceivedEbByNo - struct5.RequiredEbByNo - struct5.ImplementationLoss"};
if nargin == 7
    vectorSpecValue = varargin{2};
    eqns{1} = mat2str(vectorSpecValue);
end
for ii = 1:length(params)
    varname = strcat("temp.",params{ii});
    if any(strcmp(resultProperty,params{ii}))
        evalin("base",sprintf("%s = %f;",varname,resultValue(strcmp(resultProperty,params{ii}))))
    else
        evalin("base",sprintf("%s = %s;",varname,eqns{ii}))
    end
    if strcmp(resultVariable,params{ii}) && ~isempty(resultVariable)
        break;
    end
end
res = evalin("base","temp");
evalin("base","clear struct1 struct2 struct3 struct4 struct5 temp")
end

analyzeResults – 最適化結果を解析して可視化します。

function uit = analyzeResults(sol,resBaseline,g1,s1,tx1,rx1,l1,txAntennaEfficiency,noiseTemperature,receivedEbByNo)

gainBaselineLinear = 10.^(tx1.TxAntennaGain/10);
lambda = physconst('LightSpeed')/(l1.Frequency*1e9);
txAntennaDiameterBaseline = sqrt(gainBaselineLinear/txAntennaEfficiency)*(lambda/pi);
receivedPowerBaseline = resBaseline.ReceivedIsotropicPower + rx1.RxGByT + 10.*(log(noiseTemperature)/log(10)) - rx1.RxFeederLoss + 30; %dBm
dataBefore = [struct2cell(resBaseline); {tx1.TxHPAPower;...
    txAntennaDiameterBaseline; tx1.TxAntennaGain; rx1.RxGByT; receivedPowerBaseline; l1.BitRate}];

tx1.TxHPAPower = sol.hpaPowerDB;
rx1.RxGByT = sol.rxGByT;
tx1.TxAntennaGain = gainCalc(sol.antennaDiameter,txAntennaEfficiency,l1.Frequency); 
res = calculateLinkBudget(g1,s1,tx1,rx1,l1);
res.ReceivedEbByNo = receivedEbByNo;
res.Margin = res.ReceivedEbByNo - l1.RequiredEbByNo - l1.ImplementationLoss;
receivedPower = res.ReceivedIsotropicPower + rx1.RxGByT + 10.*(log(noiseTemperature)/log(10)) - rx1.RxFeederLoss + 30;                %dBm
bitRate = 10.^((res.CByNo - res.ReceivedEbByNo)/10);
dataAfter = [struct2cell(res); {sol.hpaPowerDB; ...
    sol.antennaDiameter; tx1.TxAntennaGain; sol.rxGByT; receivedPower; 1e-6*bitRate}];

colName = {"Link Before","Link After"};
colFormat = {'numeric','numeric'};
rowNames = { ...
    "Distance (km)";
    "Elevation (deg)";
    "Tx EIRP (dBW)";
    "Polarization loss (dB)";
    "FSPL (dB)";
    "Received isotropic power (dBW)";
    "C/No (dB-Hz)";
    "C/N (dB)";
    "Received Eb/No (dB)";
    "Margin (dB)";
    "HPA Power (dBW)";
    "Tx Antenna Diameter (m)";
    "Tx Antenna Gain (dBi)";
    "Rx G/T (dB/K)";
    "Received Power (dBm)";
    "Bit Rate (Mbps)"};
fig = uifigure("Name","Link Budget");
uit = uitable(fig,units="normalized", ...
    Position=[0 0 1 1],RowName=rowNames, ...
    ColumnName=colName, ColumnFormat=colFormat, ...
    Data=[dataBefore dataAfter]);
style = uistyle(BackgroundColor="yellow",FontColor="k",FontWeight="bold");
addStyle(uit,style,"row",[3 7 11:16])
end