Main Content

comm.AGC

一定の信号レベル出力を得るために適応的にゲインを調整する

説明

comm.AGC System object™ は、ゲインを適応的に調整して出力時に一定の信号レベルを得る自動ゲイン コントローラー (AGC) を作成します。詳細については、対数ループ AGC を参照してください。このオブジェクトはストリーミング アプリケーション用に設計されています。詳細については、ヒント を参照してください。

出力時に一定の信号レベルを得るためにゲインを適応的に調整するには、次を行います。

  1. comm.AGC オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

agc = comm.AGC は、ゲインを適応的に調整して出力時に一定の信号レベルを得る AGC System object を作成します。

agc = comm.AGC(Name,Value) は、1 つ以上の名前と値のペアを使用してプロパティを設定します。各名前を引用符で囲みます。たとえば、'AdaptationStepSize',0.05 では、ゲイン更新のステップ サイズが 0.05 に設定されます。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。

プロパティが "調整可能" の場合、その値をいつでも変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

ゲイン更新のステップ サイズ。正のスカラーとして指定します。ステップ サイズを増やすことで、AGC は入力信号レベルの変化により迅速に応答するようになりますが、定常状態で動作している間は出力信号レベルの変動が大きくなります。詳細については、AGC のパフォーマンス基準、およびAGC ステップ サイズの変更、およびステップ サイズが AGC のパフォーマンスに及ぼす影響をプロットの例を参照してください。

調整可能: Yes

データ型: double

ターゲットとする出力強度レベル。正のスカラーとして指定します。強度は 1 オームを基準としてワット単位で測定されます。詳細については、AGC を使用する受信信号の振幅の適応的な調整の例を参照してください。

データ型: double

平均化ウィンドウの長さ (サンプル単位)。正の整数として指定します。平均化の長さによる定常状態で動作している AGC 出力信号の分散と実行速度への影響の詳細については、ヒントおよびAGC 平均化の長さの変更の例を参照してください。

データ型: double

デシベル単位の最大電力ゲイン。正のスカラーとして指定します。小さい入力信号の強度が急激に増大した場合、大きなゲイン調整によりクリッピングが発生する可能性があります。大きなゲイン調整を回避するにはこのプロパティを使用し、AGC が入力信号に適用するゲインを制限します。詳細については、AGC 最大ゲインの変更および最大 AGC ゲインのパケット データへの影響の例示の例を参照してください。

データ型: double

使用法

説明

y = agc(x) は、入力信号に合わせてゲインを調整し、出力における基準信号レベルを達成します。AGC System object は、二乗検波器を使用して出力信号レベルを決定します。詳細については、AGC 検出器 を参照してください。

[y,powerlevel] = agc(x) は、入力信号のパワー レベル推定 powerlevel を返します。powerlevel はエネルギー検出器出力として使用できます。

入力引数

すべて展開する

入力信号。列ベクトルで指定します。

データ型: single | double
複素数のサポート: あり

出力引数

すべて展開する

出力信号。列ベクトルとして返されます。出力信号のデータ型は、入力信号 x のデータ型と同じです。

パワー レベル推定。NS 要素の列ベクトルとして返されます。NS は、入力信号 x の長さです。powerlevel はエネルギー検出器出力として使用できます。

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて折りたたむ

異なる AGC 平均化の長さを QAM 変調信号に適用します。AGC 適用後に信号の分散とプロットを比較します。

10、100、1000 サンプルに設定された平均的な長さのウィンドウをもつ 3 つの AGC System object を作成します。

agc1 = comm.AGC('AveragingLength',10);
agc2 = comm.AGC('AveragingLength',100);
agc3 = comm.AGC('AveragingLength',1000);

16-QAM 変調され、レイズド コサイン パルス整形のパケット化されたデータを生成します。

M = 16;
d = randi([0 M-1],1000,1);
s = qammod(d,M);
x = 0.1*s;
pulseShaper = comm.RaisedCosineTransmitFilter;
y = awgn(pulseShaper(x),inf);

AGC を各 AGC オブジェクトの個別の出力を取得するデータに適用します。

r1 = agc1(y);
r2 = agc2(y);
r3 = agc3(y);

信号をプロットし、比較します。平均化の長さが増えると、AGC の出力における分散が減ります。

figure(1)
subplot(4,1,1)
plot(abs(y))
title('AGC Input')
subplot(4,1,2)
plot(abs(r1))
axis([0 8000 0 10])
title('AGC Output (Averaging Length is 10 Samples)')
text(4000,5,sprintf('Variance is %f',var(r1(3000:end))))
subplot(4,1,3)
plot(abs(r2))
axis([0 8000 0 10])
title('AGC Output (Averaging Length is 100 Samples)')
text(4000,5,sprintf('Variance is %f',var(r2(3000:end))))
subplot(4,1,4)
plot(abs(r3))
axis([0 8000 0 10])
title('AGC Output (Averaging Length is 1000 Samples)')
text(4000,5,sprintf('Variance is %f',var(r3(3000:end))))

Figure contains 4 axes objects. Axes object 1 with title AGC Input contains an object of type line. Axes object 2 with title AGC Output (Averaging Length is 10 Samples) contains 2 objects of type line, text. Axes object 3 with title AGC Output (Averaging Length is 100 Samples) contains 2 objects of type line, text. Axes object 4 with title AGC Output (Averaging Length is 1000 Samples) contains 2 objects of type line, text.

異なる AGC 最大ゲインのレベルを QPSK 変調信号に適用します。AGC 適用後に信号のプロットを比較します。

それぞれ 10 dB、20 dB、および 30 dB に設定された最大ゲイン値を使用する 3 つの AGC System object を作成します。

agc1 = comm.AGC('MaxPowerGain',10);
agc2 = comm.AGC('MaxPowerGain',20);
agc3 = comm.AGC('MaxPowerGain',30);

QPSK 変調データを生成します。レイズド コサイン パルス整形のフィルター処理および AWGN チャネルを経由してデータを渡します。

M = 4;
pktLen = 10000;
d = randi([0 M-1],pktLen,1);
s = pskmod(d,M,pi/4);
x = repmat([zeros(pktLen,1); 0.3*s],3,1);
pulseShaper = comm.RaisedCosineTransmitFilter;
y = awgn(pulseShaper(x),50);

AGC を各 AGC オブジェクトの個別の出力を取得するデータに適用します。

r1 = agc1(y);
r2 = agc2(y);
r3 = agc3(y);

入力信号と AGC 調整信号をさまざまな最大ゲイン レベルでプロットします。この例にある条件の結果を比較します。

  • 10 dB の最大ゲイン設定は小さすぎ、AGC 出力は目的の出力信号レベルに到達せず、信号のダイナミック レンジが小さくなるため、データ損失のリスクがあります。

  • 20 dB の最大ゲイン設定は最適で、AGC 出力は、飽和によって信号を損失することなく、目的の出力信号レベルに到達します。

  • 30 dB の最大ゲイン設定は大きすぎ、AGC 出力は目的の信号レベルをオーバーシュートし、受信パケットの開始時に信号飽和とデータ損失のリスクがあります。

  • パケット間では、入力信号にはノイズのみ含まれます。

プロットで示されるように、受信するデータがないときにパケット伝送によって区間が拡張されています。受信データなしで区間が拡張されると、AGC が最大ゲイン設定まで増加するようになります。AGC ゲインが高すぎるときにパケットが到着すると、AGC が入力パワー レベルでの変更に応答し、ゲインが減るまで出力パワーは目的の信号レベルをオーバーシュートします。

limits = [0 3];
figure(1)
subplot(4,1,1)
plot(abs(y))
ylim(limits)
title('AGC Input')
subplot(4,1,2)
plot(abs(r1))
ylim(limits)
title('AGC Output (Maximum Power Gain is 10 dB)')
subplot(4,1,3)
plot(abs(r2))
ylim(limits)
title('AGC Output (Maximum Power Gain is 20 dB)')
subplot(4,1,4)
plot(abs(r3))
ylim(limits)
title('AGC Output (Maximum Power Gain is 30 dB)')

Figure contains 4 axes objects. Axes object 1 with title AGC Input contains an object of type line. Axes object 2 with title AGC Output (Maximum Power Gain is 10 dB) contains an object of type line. Axes object 3 with title AGC Output (Maximum Power Gain is 20 dB) contains an object of type line. Axes object 4 with title AGC Output (Maximum Power Gain is 30 dB) contains an object of type line.

信号とパワー レベル推定をプロットします。結果を比較します。パワー レベル推定はパワー検出器として機能でき、受信パケットが到着した正確な時間を示します。

20 dB に設定された最大ゲイン値を使用する AGC System object を作成します。

agc20 = comm.AGC('MaxPowerGain',20);

QPSK 変調データを生成します。レイズド コサイン パルス整形のフィルター処理および AWGN チャネルを経由してデータを渡します。

modOrd = 4; % Modulation order
pktLen = 10000; % Packet length
d = randi([0 modOrd-1],pktLen,1);
s = pskmod(d,modOrd,pi/4);
x = repmat([zeros(pktLen,1); 0.3*s],3,1);
pulseShaper = comm.RaisedCosineTransmitFilter;
y = awgn(pulseShaper(x),50);

AGC を各 AGC オブジェクトの個別の出力を取得するデータに適用します。

[r2,p2] = agc20(y);

入力信号と受信した信号パワー レベル推定をプロットします。結果を比較します。受信するデータがないときにパケット化されたデータを受信すると、検出されたパワー レベル推定がほぼゼロになるまで減少します。入力信号が検出されると、出力パワー レベル推定 p2 はパワー検出器として機能し、受信パケットが到着した正確な時間を示します。

limits = [0 3];
figure(1)
subplot(4,1,1)
plot(abs(y))
ylim(limits)
title('AGC Input')
subplot(4,1,2)
plot(abs(p2))
title('Power Level')

Figure contains 2 axes objects. Axes object 1 with title AGC Input contains an object of type line. Axes object 2 with title Power Level contains an object of type line.

異なる AGC ステップ サイズを QPSK 変調信号に適用します。AGC 適用後に信号を比較します。

それぞれ 1e-1、1e-3、および 1e-4 に設定されたステップ サイズを使用して 3 つの AGC System object を作成します。

agc1 = comm.AGC('AdaptationStepSize',1e-1);
agc2 = comm.AGC('AdaptationStepSize',1e-3);
agc3 = comm.AGC('AdaptationStepSize',1e-4);

レイズド コサイン パルス整形を使用する QPSK 変調データを生成します。

d = randi([0 3],500,1);
s = pskmod(d,4,pi/4);
x = 0.1*s;
pulseShaper = comm.RaisedCosineTransmitFilter;
y = pulseShaper(x);

AGC を各 AGC オブジェクトの個別の出力を取得するデータに適用します。

r1 = agc1(y);
r2 = agc2(y);
r3 = agc3(y);

さまざまな AGC ステップ サイズの後の入力信号と出力信号をプロットします。

  • ステップ サイズを 1e-1 に設定すると、AGC 出力信号のオーバーシュートが明らかになります。出力信号はすぐに収束します。

  • ステップ サイズを 1e-3 に設定すると、AGC 出力信号のオーバーシュートが消えます。出力信号は徐々に収束します。

  • ステップ サイズを 1e-4 に設定すると、AGC 出力信号の収束は、ステップ サイズ 1e-3 の 2 ~ 3 倍長くかかります。

figure
subplot(4,1,1)
plot(abs(y))
title('AGC Input')
subplot(4,1,2)
plot(abs(r1))
title('AGC Output (Adaption Step Size is 1e-1)')
subplot(4,1,3)
plot(abs(r2))
title('AGC Output (Adaption Step Size is 1e-3)')
subplot(4,1,4)
plot(abs(r3))
title('AGC Output (Adaption Step Size is 1e-4)')

Figure contains 4 axes objects. Axes object 1 with title AGC Input contains an object of type line. Axes object 2 with title AGC Output (Adaption Step Size is 1e-1) contains an object of type line. Axes object 3 with title AGC Output (Adaption Step Size is 1e-3) contains an object of type line. Axes object 4 with title AGC Output (Adaption Step Size is 1e-4) contains an object of type line.

QPSK 信号を変調して増幅します。AGC を使用して受信信号の振幅を約 1 ボルトに設定します。出力をプロットします。

QPSK System object を使用して、QPSK 変調信号を作成します。

data = randi([0 3],1000,1);
qpsk = comm.QPSKModulator;
modData = qpsk(data);

変調された信号を減衰させます。

txSig = 0.1*modData;

AGC System object を作成し、そこから送信信号を渡します。AGC は、受信信号の強度を約 1 W に調整します。

agc = comm.AGC;
rxSig = agc(txSig);

AGC が定常状態に達した後、送信信号および受信信号の信号コンスタレーションをプロットします。

h = scatterplot(txSig(200:end),1,0,'*');
hold on
scatterplot(rxSig(200:end),1,0,'or',h);
legend('Input of AGC','Output of AGC')

Figure Scatter Plot contains an axes object. The axes object with title Scatter plot, xlabel In-Phase, ylabel Quadrature contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Input of AGC, Output of AGC.

AGC が定常状態に達した後、送信信号および受信信号の強度を測定して比較します。送信信号の強度は、受信信号の強度の 1 /100 になります。

txPower = var(txSig(200:end));
rxPower = var(rxSig(200:end));
[txPower rxPower]
ans = 1×2

    0.0100    0.9970

AGC System object™ を 2 つ作成し、2 通りのステップ サイズを使用して同一の更新周期で受信信号レベルを調整します。

強度が 10 W の 8-PSK 信号を生成します。

data = randi([0 7],200,1);
modData = sqrt(10)*pskmod(data,8,pi/8,'gray');

レイズド コサイン整合フィルターのペアを作成し、1 の出力強度をもつように Gain プロパティを設定します。

txfilter = comm.RaisedCosineTransmitFilter('Gain',sqrt(8));
rxfilter = comm.RaisedCosineReceiveFilter('Gain',sqrt(1/8));

変調信号をレイズド コサイン送信フィルターでフィルター処理します。

txSig = txfilter(modData);

AGC System object を 2 つ作成して受信信号レベルを調整します。ステップ サイズとしてそれぞれ 0.01 と 0.1 を設定します。

agc1 = comm.AGC('AdaptationStepSize',0.01);
agc2 = comm.AGC('AdaptationStepSize',0.1);

AGC を各 AGC オブジェクトの個別の出力を取得する変調信号に適用します。

agcOut1 = agc1(txSig);
agcOut2 = agc2(txSig);

レイズド コサイン受信フィルターを使用して、AGC 出力信号をフィルター処理します。

rxSig1 = rxfilter(agcOut1);
rxSig2 = rxfilter(agcOut2);

送信フィルターと受信フィルターのペアによる 10 シンボルの遅延を考慮しながら、フィルター処理された AGC 応答の強度をプロットします。

plot([abs(rxSig1(11:110)).^2 abs(rxSig2(11:110)).^2])
grid on
xlabel('Symbols')
ylabel('Power (W)')
legend('Step size 0.01','Step size 0.1')

Figure contains an axes object. The axes object with xlabel Symbols, ylabel Power (W) contains 2 objects of type line. These objects represent Step size 0.01, Step size 0.1.

ステップ サイズが大きいほうの信号は、AGC ターゲット出力レベルの 1 W に早く収束します。

定常状態のフィルター処理された AGC 信号の強度を、最後の 100 シンボルのみを含めてプロットします。AGC ステップ サイズが大きくなるほど、ゲインの修正が不正確になります。AGC ステップ サイズの値が大きいほど、ゲイン制御の精度を犠牲にしてより早く収束します。

plot((101:200),[abs(rxSig1(101:200)).^2 abs(rxSig2(101:200)).^2])
grid on
xlabel('Symbols')
ylabel('Power (W)')
legend('Step size 0.01','Step size 0.1')

Figure contains an axes object. The axes object with xlabel Symbols, ylabel Power (W) contains 2 objects of type line. These objects represent Step size 0.01, Step size 0.1.

減衰された QPSK パケット データを最大ゲインの異なる 2 つの AGC に渡します。結果をプロットします。

200 シンボルの QPSK データ パケットを 2 つ作成します。パケットを 1200 シンボルのフレーム経由で送信します。

modData1 = pskmod(randi([0 3],200,1),4,pi/4);
modData2 = pskmod(randi([0 3],200,1),4,pi/4);
txSig = [modData1; zeros(400,1); modData2; zeros(400,1)];

送信されたバースト信号を 20 dB 減衰して強度をプロットします。

rxSig = 0.1*txSig;
rxSigPwr = abs(rxSig).^2;
plot(rxSigPwr)
grid
xlabel('Symbols')
ylabel('Power (W)')
title('Signal Power Before Applying AGC')

Figure contains an axes object. The axes object with title Signal Power Before Applying AGC, xlabel Symbols, ylabel Power (W) contains an object of type line.

最大パワー ゲイン 30 dB および 24 dB の AGC を 2 つ作成します。

agc1 = comm.AGC('MaxPowerGain',30,'AdaptationStepSize',0.02);

agc2 = comm.AGC('MaxPowerGain',24,'AdaptationStepSize',0.02);

AGC を各 AGC オブジェクトの個別の出力を取得する減衰信号に適用します。各ケースの出力強度を計算します。

rxAGC1 = agc1(rxSig);
rxAGC2 = agc2(rxSig);

pwrAGC1 = abs(rxAGC1).^2;
pwrAGC2 = abs(rxAGC2).^2;

出力強度をプロットします。はじめに、データが送信されていなかった期間に AGC が最大ゲインを適用したため、2 番目のパケットに対する agc1 の出力信号強度が高くなりすぎています。これに対応する agc2 の出力信号強度 (2.5 W) は、ターゲットとする 1 W の強度レベルを、agc1 出力信号強度 (10W) よりも大幅に少なくオーバーシュートします。agc2 への信号入力は agc1 よりも小さい最大ゲインを適用するため、agc2 の収束時間は agc1 の収束時間よりも短くなります。

plot([pwrAGC1 pwrAGC2])
legend('AGC1','AGC2')
grid
xlabel('Symbols')
ylabel('Power (W)')
title('Signal Power After Applying AGC')

Figure contains an axes object. The axes object with title Signal Power After Applying AGC, xlabel Symbols, ylabel Power (W) contains 2 objects of type line. These objects represent AGC1, AGC2.

詳細

すべて展開する

ヒント

  • この System object はストリーミング アプリケーション用に設計されています。

  • 信号振幅がフレーム内で変化しない場合は、サンプルのフレームに必要な平均ゲインを計算して理想的な AGC をシミュレーションできます。次に、ゲインをフレーム内の各サンプルに適用します。

  • 高次 QAM 信号で AGC を使用する場合、定常状態で動作するときのゲイン値の変動を抑えることが必要となる場合があります。定常状態で動作中に AGC の出力におけるコンスタレーション ダイアグラムを検査します。平均化の長さを増やして頻繁なゲインの調整を避けることができます。平均化の長さを増やすと実行速度は低下します。

拡張機能

バージョン履歴

R2013a で導入

参考

ブロック