このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
衛星リンク バジェットを最適化してビットレートを最大化する
この例では、ビット レートを最大化するために衛星リンク バジェットを最適化する方法を示します。この例では、送信機の高出力増幅器 ( 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 ツールストリップの ライブ エディター または 挿入 タブで タスク > 最適化 を選択すると、ライブ エディターの最適化 タスクをスクリプトに追加できます。

問題ベースを選択します。問題ベースの 最適化ライブ エディター タスクの詳細については、「問題ベースの最適化ライブ エディター タスクの概要 (Optimization Toolbox)」を参照してください。
このタスクには、設計変数、目的関数、制約がすでに入力されています。
% 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
solution2solution2 = 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);

その他の調査
この例では、衛星リンク バジェット アナライザーアプリから生成された 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
