メインコンテンツ

awgn

ホワイト ガウス ノイズを信号に付加

説明

Y = awgn(X,snr) は、ホワイト ガウス ノイズをベクトル信号 X に付加します。この構文では、X の電力が 0 dBW であると仮定します。加法性ホワイト ガウス ノイズの詳細については、AWGN とはを参照してください。

Y = awgn(X,snr,signalpower) は、入力信号の電力値 (dBW 単位) を受け入れます。X の電力を測定してからノイズを付加するには、signalpower'measured' として指定します。'measured' オプションは、入力信号の電力がフェージングのために時間とともに変化し、チャネルのコヒーレンス時間が入力期間よりも大きい場合、ループ内で繰り返される関数 awgn の呼び出しに対して要求される平均 SNR を生成しません。

Y = awgn(X,snr,signalpower,randobject) はさらに、乱数ストリーム オブジェクトを受け入れて、正規ランダム ノイズ サンプルを生成します。繰り返し可能なノイズ サンプルの生成の詳細は、ヒントを参照してください。

Y = awgn(X,snr,signalpower,seed) は、入力信号にホワイト ガウス ノイズを付加するために使用される正規乱数発生器を初期化するためのシード値を指定します。

Y = awgn(___,powertype) は、前述のいずれかの構文の入力引数に加えて、信号およびノイズ パワー タイプを 'dB' または 'linear' として指定します。SNR とその他の相対的なノイズ パワー (Es/N0Eb/N0 など) の測定値との関係の詳細については、AWGN チャネル ノイズ レベルを参照してください。

[Y,var] = awgn(___) は、ランダム ノイズ サンプルの生成に使用される線形スケールでの合計ノイズ分散も返します。

すべて折りたたむ

この例では、チャネル符号化を採用している通信リンクについてノイズ密度に対するビット エネルギーの比 (Eb/No) を設定する方法を説明します。

リード・ソロモン符号のコードワード長とメッセージ長を指定します。変調次数を指定します。

N = 15;        % R-S codeword length in symbols
K = 9;         % R-S message length in symbols
M = 16;        % Modulation order
bps = log2(M); % Bits per symbol

(15,9) リード・ソロモン符号化器と 16-PSK 変調器を構築します。ビット入力を受け入れるようにオブジェクトを指定します。

rsEncoder = comm.RSEncoder( ...
    CodewordLength=N, ...
    MessageLength=K, ...
    BitInput=true);

対応するリード・ソロモン復号化器のオブジェクトと 16-PSK 復調器のオブジェクトを作成します。

rsDecoder = comm.RSDecoder( ...
    CodewordLength=N, ...
    MessageLength=K, ...
    BitInput=true);

コードワード長に対するメッセージ シンボルの比に基づいてリード・ソロモン符号化率を計算します。

codeRate = K/N;

符号化されていない Eb/No を dB 単位で指定します。符号化率とシンボルあたりのビット数を使用して、符号化されていない Eb/No を、対応する SNR に変換します。

UncodedEbNo = 6;
SNR = convertSNR(UncodedEbNo,"ebno","SNR", ...
    BitsPerSymbol=bps, ...
    CodingRate=codeRate);

シミュレーションの誤りとビットの総数を設定します。精度を確保するため、十分な数のビット エラーが検出されるまでシミュレーションを実行してください。合計ビット数を使用して、シミュレーションの実行が長くなりすぎないようにします。

totalErrors = 100;
totalBits = 1e6;

エラー レート計算機 System object™ を構築し、エラー レート ベクトルを初期化します。

errorRate = comm.ErrorRate;
errorVec = zeros(3,1);

シミュレーションを実行して BER を求めます。

while errorVec(2) < totalErrors && errorVec(3) < totalBits
    % Generate random bits
    dataIn = randi([0,1],360,1);
    % Add error correction capability by using the RS (15,9) encoder
    dataEnc = rsEncoder(dataIn);
    % Apply 16-PSK modulation
    txSig = pskmod(dataIn,M,InputType="bit");
    % Pass the modulated data through an AWGN channel
    rxSig = awgn(txSig,SNR);
    % Demodulate the received signal
    demodData = pskdemod(rxSig,M,OutputType="bit");
    % Decode the demodulated data with the RS (15,9) decoder
    dataOut = rsDecoder(demodData);
    % Collect error statistics
    errorVec = errorRate(dataIn,demodData);
end

結果として得られたビット エラー レートを表示します。

ber = errorVec(1)
ber = 
0.0935

ノコギリ波を作成します。

t = (0:0.1:60)';
x = sawtooth(t);

ホワイト ガウス ノイズを付加し、結果をプロットします。

y = awgn(x,10,'measured');
plot(t,[x y])
legend('Original Signal','Signal with AWGN')

Plot of the original signal and the signal with AWGN.

ガウス ノイズが存在する場合は非矩形の 16 配列コンスタレーションを使用してデータの送受信を行います。ノイズを含むコンスタレーションの散布図を表示し、2 つの異なる SNR についてシンボル エラー レート (SER) を見積もります。

電話回線モデムに対し、V.29 規格に基づいて 16-QAM コンスタレーションを作成します。

c = [-5 -5i 5 5i -3 -3-3i -3i 3-3i 3 3+3i 3i -3+3i -1 -1i 1 1i];
sigpower = pow2db(mean(abs(c).^2));
M = length(c);

ランダムなシンボルを生成します。

data = randi([0 M-1],2000,1);

関数 genqammod を使用してデータを変調します。カスタム コンスタレーションは矩形ではないため、一般的な QAM 変調が必要です。

modData = genqammod(data,c);

SNR が 20 dB の AWGN チャネル経由で信号を渡します。

rxSig = awgn(modData,20,sigpower);

受信信号と基準コンスタレーション c の散布図を表示します。

h = scatterplot(rxSig);
hold on
scatterplot(c,[],[],'r*',h)
grid
hold off

Constellation diagram scatter plot of the reference signal and the modulated signal passed through an awgn channel.

関数 genqamdemod を使用して、受信した信号を復調します。シンボル エラー数と SER を求めます。

demodData = genqamdemod(rxSig,c);
[numErrors,ser] = symerr(data,demodData)
numErrors = 
4
ser = 
0.0020

SNR が 10 dB の AWGN チャネル経由で送信と復調の処理を繰り返します。低減された SNR について SER を判別します。予想どおり、SNR が低下するとパフォーマンスも低下します。

rxSig = awgn(modData,10,sigpower);
demodData = genqamdemod(rxSig,c);
[numErrors,ser] = symerr(data,demodData)
numErrors = 
457
ser = 
0.2285

ランダム データ シンボルと 4-PSK 変調信号を生成します。

M = 4;
k = log2(M);
snr = 3;
data = randi([0 M-1],2000,1);
x = pskmod(data,M);

乱数発生器のシードを設定します。

seed = 12345;

関数 rng を使用してから関数 awgn を呼び出して、繰り返し可能なランダム ノイズを生成します。

rng(seed);
y = awgn(x,snr);

ビット エラーを計算します。

dataHat = pskdemod(y,M);
numErr1 = biterr(data,dataHat,k)
numErr1 = 
309

乱数発生器のシードをリセットします。

rng(seed);

PSK 信号を復調し、ビット エラーを計算します。

y = awgn(x,snr);
dataHat = pskdemod(y,M);
numErr2 = biterr(data,dataHat,k)
numErr2 = 
309

numErr1numErr2 と比較します。エラー数は、乱数発生器のシードをリセットした後も同じになります。

isequal(numErr1, numErr2)
ans = logical
   1

RandStreamオブジェクトとオブジェクト関数resetを使用して、ホワイト ガウス ノイズの付加結果を生成します。

入力信号のパワーを 0 dBW として指定し、10 dB の SNR を生成するノイズを付加して、ローカルの乱数ストリームを使用します。ホワイト ガウス ノイズを sigin に 2 回付加し、sigout1 および sigout2 を生成します。isequalを使用して sigout1sigout2 を比較します。乱数ストリームをリセットしない場合、出力は等しくなりません。

S = RandStream('mt19937ar',Seed=5489);
sigin = sqrt(2)*sin(0:pi/8:6*pi);
sigout1 = awgn(sigin,10,0,S);
sigout2 = awgn(sigin,10,0,S);
isequal(sigout1,sigout2)
ans = logical
   0

乱数ストリーム オブジェクトをリセットし、AWGN を sigout1 に追加する前の状態にこのオブジェクトを戻します。AWGN を sigin に追加して sigout3 を生成し、sigout1sigout3 を比較します。乱数ストリームをリセットすると、出力は等しくなります。

reset(S);
sigout3 = awgn(sigin,10,0,S);
isequal(sigout1,sigout3)
ans = logical
   1

入力引数

すべて折りたたむ

入力信号。スカラー、ベクトル、数値配列、または dlarray (Deep Learning Toolbox) オブジェクトとして指定します。入力信号の電力は、0 dBW になると仮定されています。X が複素数の場合、awgn は複素数ノイズを付加します。詳細については、配列のサポートを参照してください。

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

dB 単位の S/N 比。次のように指定します。

  • スカラー (入力信号がスカラーまたはベクトルの場合)。

  • スカラーまたはベクトル (入力信号が 3 次元配列の場合)。詳細については、配列のサポートを参照してください。

この関数は、各チャネルに同じ snr 値を適用します。入力信号の列は、マルチチャネル信号のさまざまなチャネルを表します。

データ型: double

dBW 単位の信号強度。スカラーまたは 'measured' として指定します。

  • スカラー — 値は X の信号レベルとして使用され、指定された snr を達成するために必要なノイズ レベルが求められます。

  • 'measured'X の信号レベルが計算され、指定された snr を達成するために必要なノイズ レベルが求められます。入力信号が dlarray である場合、または snr がベクトルである場合、この値は使用できません。

入力信号がマルチチャネル信号の場合、関数はすべてのチャネルの signalpower 値を単一の値として計算します。次に、その値を使用して、すべてのチャネルのノイズレベルを計算します。

データ型: double

乱数ストリーム オブジェクト。RandStream オブジェクトとして指定します。乱数ストリーム オブジェクトの状態により、関数 randn によって生成される数列が決まります。乱数ストリーム オブジェクトは、関数 reset (RandStream) とそのプロパティを使用して構成します。入力信号が dlarray の場合、乱数ストリーム オブジェクトを指定することはできません。

繰り返し可能なノイズ サンプルの生成の詳細は、ヒントを参照してください。

乱数発生器のシード値。スカラーとして指定します。入力信号が dlarray の場合、シードを指定することはできません。

データ型: double

信号強度単位。'dB' または 'linear' として指定します。

  • powertype'dB' である場合、snr は dB 単位、signalpower は dBW 単位で測定されます。

  • powertype'linear' である場合、snr は比率として測定され、signalpower は 1 オームの参照負荷を想定してワット単位で測定されます。

powertype 引数を設定するには、snrsignalpower も設定しなければなりません。

出力引数

すべて折りたたむ

出力信号。スカラー、ベクトル、または dlarray (Deep Learning Toolbox) オブジェクトとして返されます。返される出力信号は、ホワイト ガウス ノイズが付加された入力信号です。入力信号 Xdlarray の場合、この出力 Ydlarray になります。詳細については、配列のサポートを参照してください。

線形スケールでの合計ノイズ分散。正のスカラーまたはベクトル (snr がベクトルの場合) として返されます。この関数は、ノイズ分散を使用してランダム ノイズ サンプルを生成します。

詳細

すべて折りたたむ

ヒント

  • SNR とその他の相対的なノイズ パワー (Es/N0Eb/N0 など) の測定値との関係の詳細については、AWGN チャネル ノイズ レベルを参照してください。

  • 繰り返し可能なホワイト ガウス ノイズ サンプルを生成するには、次のいずれかを行います。

    • 関数 rng(seed) を使用してから関数 awgn を呼び出して、繰り返し可能なランダム ノイズを生成する。

    • 入力が dlarray オブジェクトである場合を除き、静的 seed 値を awgn への入力として指定する。

    • 入力が dlarray オブジェクトである場合を除き、入力として awgn に渡す前に、randobject に対して関数 reset (RandStream) を使用する。

    • 入力が dlarray オブジェクトである場合を除き、既知の状態の randobjectawgn への入力として指定する。詳細については、RandStream を参照してください。

  • CPU の乱数ストリームを GPU で再現するには、両方で使用する乱数発生器を揃えなければなりません。詳細については、GPU 上の乱数ストリーム (Parallel Computing Toolbox)を参照してください。

拡張機能

すべて展開する

バージョン履歴

R2006a より前に導入

すべて展開する

参考

関数

オブジェクト

ブロック