Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

グレイ符号化された 2 値符号の順序

グレイ符号化は、ビット誤り率を最小限に抑えるためにマルチレベル変調方式で頻繁に使用される手法です。この手法では、隣接するシンボルのバイナリ表現が 1 ビットだけ異なるように変調シンボルを順序付けます。この節では、グレイ符号 8 相位相シフト キーイング (8-PSK) 変調による通信システムを示し、グレイ符号化のビット順と通常の 2 値符号のビット順間で誤り率性能を比較します。

はじめに

この節の例では、8-PSK 手法を使用して、グレイ符号化のデータ フレームと通常の 2 値符号のデータ フレームを変調します。データ フレームは AWGN チャネルを通過し、8-PSK 復調器を使用して復調されます。誤り率計算機 System object は、シンボル誤り率とビット誤り率を計算します。

この通信システムでは、PSK 変調器 System object は次のように動作します。

  • 0 から M – 1 までの整数を表すバイナリ値入力を受け入れます。M は変調次数であり、8-PSK 変調の場合は 8 と等しくなります。

  • グレイ符号と通常の 2 値符号の順序付けを使用して、バイナリ表現をコンスタレーション点に割り当てます。

  • 0 から 2π(M – 1)/M までの等間隔の位相をもつ、単位振幅の複素フェーザ出力を生成します。

この表は、入力内のグレイ符号化されたバイナリ表現と出力内のフェーザとの関係を示しています。表の 2 列目は、System object による計算で使用される中間表現です。

変調器入力グレイ符号化された順序変調器出力
0000exp(0)
0011exp(jπ/4)
0103exp(j3π/4)
0112exp(jπ/2) = exp(j2π/4)
1007exp(j7π/4)
1016exp(j3π/2) = exp(j6π/4)
1104exp(jπ) = exp(j4π/4)
1115exp(j5π/4)

この表は、上の表の最初の 2 列を出力値に従って並べ替えたものです。このように並べ替えると、隣接するシンボルの差が 1 ビットしかないことが明らかになります。次の図では、表の 2 列目の数値が反時計回りの順序で並んでいます。

変調器出力変調器入力
exp(0)000
exp(jπ/4)001
exp(jπ/2) = exp(j2π/4)011
exp(j3π/4)010
exp(jπ) = exp(j4π/4)110
exp(j5π/4)111
exp(j3π/2) = exp(j6π/4)101
exp(j7π/4)100

グレイ符号の順序と 2 値符号の順序の誤り率の比較

適切に構成した PSK 変調器 System object および PSK 復調器 System object を使用して、グレイ符号化と通常の 2 値符号化を比較します。このシミュレーションは、ビット エネルギーとノイズ パワー スペクトル密度の比 (Eb/N0) の値の範囲に対して反復実行され、各 Eb/N0 点についてグレイ符号化が指定したビット誤りの最大数 (maxNumErrs) またはビットの最大数 (maxNumBits) に達するまで実行されます。

初期化

システム変数を初期化し、変調、復調、AWGN チャネル、誤り率の各処理に対する System object を作成します。comm.AWGNChannel System object™ および関数randiでは既定の乱数ストリームが使用されるため、乱数発生器シードを設定して、結果に再現性をもたせます。乱数ストリーム シードを設定する前に、乱数発生器の状態を保存し、例の最後に復元します。

M = 8; % Modulation order for 8-PSK
SamplesPerFrame = 10000;
maxNumErrs=100;
maxNumBits=1e8;

prevState = rng;
rng(529558);

PSK 変調器 System object および PSK 復調器 System object を作成し、バイナリ入力データを 8-PSK グレイ符号コンスタレーションと 2 進符号コンスタレーションに割り当てます。

pskmod = comm.PSKModulator('ModulationOrder',M,'SymbolMapping','Gray', ...
    'PhaseOffset',0,'BitInput',true);
pskdemod = comm.PSKDemodulator('ModulationOrder',M,'SymbolMapping','Gray', ...
    'PhaseOffset',0,'BitOutput',true,'OutputDataType','uint8', ...
    'DecisionMethod','Hard decision');
pskmodb = comm.PSKModulator('ModulationOrder',M,'SymbolMapping','Binary', ...
    'PhaseOffset',0,'BitInput',true);
pskdemodb = comm.PSKDemodulator('ModulationOrder',M,'SymbolMapping','Binary', ...
    'PhaseOffset',0,'BitOutput',true,'OutputDataType','uint8', ...
    'DecisionMethod','Hard decision');

AWGN チャネルの System object を作成して、変調信号にノイズを追加します。処理ループのノイズ手法は Eb/N0 に設定されます。PSK 変調器は 1 W の電力でシンボルを生成するので、AWGN チャネル オブジェクトの信号強度プロパティも 1 W に設定されます。

awgnchan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)', ...
    'BitsPerSymbol',log2(M),'SignalPower',1);

シンボル誤り率計算機 System object とビット誤り率計算機 System object を作成し、復調された整数およびビット データと元のソース データを比較します。この比較により、シンボル誤りおよびビット誤りの統計値が生成されます。誤り率計算機 System object の出力は、計算された誤り率、観測された誤り数、および処理されたデータ量から構成された 3 要素ベクトルになります。シミュレーションでは 3 要素ベクトルを使用して、シミュレーションを停止するタイミングを決定します。

symerror = comm.ErrorRate;
biterror = comm.ErrorRate;
biterrorb = comm.ErrorRate;

フレーム処理ループ

8-PSK 変調を使用してデータの符号化、変調、および復調を行うフレーム処理ループを設定します。このループは、0 ~ 12 dB の範囲の Eb/N0 値について 2 dB 刻みで通信システムをシミュレートします。

Eb/N0 値について、グレイ符号化されたビットのビット誤り率計算機 System object で処理される誤りの最大数 (maxNumErrs) またはビットの最大数 (maxNumBits) のいずれかに達すると、シミュレーションは停止します。

EbNoVec = 0:2:12; % Eb/No values to simulate
SERVec = zeros(size(EbNoVec)); % Initialize SER history
BERVec = zeros(size(EbNoVec)); % Initialize BER history for Gray ordered
BERVecb = zeros(size(EbNoVec)); % Initialize BER history for binary ordered
for p = 1:length(EbNoVec)
  % Reset System objects
  reset(symerror);
  reset(biterror);
  reset(biterrorb);
  awgnchan.EbNo = EbNoVec(p);
  % Reset SER / BER for the current Eb/No value
  SER = zeros(3,1);
  BER = zeros(3,1);
  while (BER(2)<maxNumErrs) && (BER(3)<maxNumBits)
    % Generate random data
    txSym = randi([0 M-1],SamplesPerFrame,1,'uint8');  
    txBits = reshape(de2bi(txSym,log2(M),'left-msb')',[],1); % Convert symbols to bits
    
    tx = pskmod(txBits);
    txb = pskmodb(txBits);
    rx = awgnchan(tx);
    rxb = awgnchan(txb);
    rxBits = pskdemod(rx);
    rxBitsb = pskdemodb(rxb);
    rxSym = bi2de(reshape(rxBits,log2(M),[])','left-msb');
    
    SER = symerror(txSym,rxSym); % Symbol error rate for Gray-coded data 
    BER = biterror(txBits,rxBits); % Bit error rate for Gray-coded data
    BERb = biterrorb(txBits,rxBitsb); % Bit error rate for natural binary-coded data
  end
  % Save history of SER and BER values
  SERVec(p) = SER(1);
  BERVec(p) = BER(1);
  BERVecb(p) = BERb(1);
end

既定のストリームを復元します。

rng(prevState)

結果分析

この例のデータを解析して、理論上の性能とシミュレーションでの性能を比較します。MPSK の理論上のシンボル誤り確率は次のとおりです。

PE(M)=erfc(ESN0sin(πM))

ここで、erfc は相補誤差関数、ES/N0 はノイズ パワー スペクトル密度に対するシンボルのエネルギーの比、M はシンボルの数です。

ビット誤り確率を調べるには、シンボル誤り確率 PE をビット誤り確率に変換します。シンボル誤り確率をビット誤り確率に変換するための一般的な式はありませんが、上限と下限を設定するのは簡単です。実際のビット誤り確率 (Pb) は、次の範囲内にあるものとして表されます。

PE(M)log2MPbM/2M-1PE(M)

下限は、シンボルにグレイ符号化が行われた場合に相当します。上限は、純粋な 2 値符号化の場合に相当します。

berawgnを使用して、理論上の誤り確率を計算します。シミュレートされたグレイ符号化のシンボル誤り率、グレイ符号化および通常の 2 値符号化のビット誤り率と、グレイ符号化の理論上のシンボル誤り確率およびビット誤り確率をプロットします。

[theorBER,theorSER] = berawgn(EbNoVec,'psk',M,'nondiff');

figure;
semilogy(EbNoVec,SERVec,'o',EbNoVec,BERVecb,'x',EbNoVec,BERVec,'*', ...
         EbNoVec,theorSER,'-',EbNoVec,theorBER,'-');
legend('Symbol error rate','Bit error rate (Binary)','Bit error rate (Gray)', ...
          'Theoretical Symbol error rate','Theoretical Bit error rate', ...
          'Location','SouthWest');
xlabel('Eb/No (dB)'); ylabel('Error Probability');
title('Symbol and Bit Error Probability');
grid on;

Figure contains an axes. The axes with title Symbol and Bit Error Probability contains 5 objects of type line. These objects represent Symbol error rate, Bit error rate (Binary), Bit error rate (Gray), Theoretical Symbol error rate, Theoretical Bit error rate.