Main Content

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

対数尤度比 (LLR) 復調

この例では、畳み込み符号化された通信リンクで硬判定復調の代わりに対数尤度比 (LLR) を使用することで、QPSK 変調に対する BER 性能が向上することを示します。LLR 復調では、ビタビ復号化器を非量子化復号化モードまたは軟判定復号化モードのどちらかで使用できます。非量子化復号化では、復号化器入力は実数値であり、BER の点で優れていますが、現実的には実現不可能です。より現実的な軟判定復号化では、復調出力は量子化されてから復号化器に送られます。一般に、これにより BER のコストが大幅に増大することはなく、むしろ復号化器の複雑度が大幅に低下することが認められます。この例を通じて、この点を実験的に検証します。

この例の Simulink™ バージョンについては、Simulink での LLR と硬判定復調を参照してください。

初期化

シミュレーション パラメーター

M = 4; % Modulation order
k = log2(M); % Bits per symbol
bitsPerIter = 1.2e4; % Number of bits to simulate
EbNo = 3; % Information bit Eb/No in dB

符号のプロパティ

codeRate = 1/2; % Code rate of convolutional encoder
constLen = 7; % Constraint length of encoder
codeGenPoly = [171 133]; % Code generator polynomial of encoder
tblen = 32; % Traceback depth of Viterbi decoder
trellis = poly2trellis(constLen,codeGenPoly);

符号化率 1/2、拘束長 7 のcomm.ConvolutionalEncoderSystem object™ を作成します。

enc = comm.ConvolutionalEncoder(trellis);

変調器とチャネル

comm.QPSKModulatorと 2 つのcomm.QPSKDemodulatorSystem object を作成します。硬判定ビットを出力するように最初の復調器を構成します。2 番目は LLR 値を出力するように構成します。

qpskMod = comm.QPSKModulator('BitInput',true);
demodHard = comm.QPSKDemodulator('BitOutput',true,...
    'DecisionMethod','Hard decision');
demodLLR = comm.QPSKDemodulator('BitOutput',true,...
    'DecisionMethod','Log-likelihood ratio');

comm.AWGNChannel オブジェクトを作成します。AWGN チャネルに入る信号は、変調され、符号化された信号です。必要なノイズ レベルを達成するため、符号化されたビットとマルチビットの各シンボルの Eb/No を調整します。これをチャネル オブジェクトの EbNo として設定します。

chan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)', ...
    'BitsPerSymbol',k);
EbNoCoded = EbNo + 10*log10(codeRate);
chan.EbNo = EbNoCoded;

ビタビ復号化

それぞれ硬判定、非量子化および軟判定の復号化器として機能するcomm.ViterbiDecoderオブジェクトを作成します。3 つの復号化器すべてについて、トレースバック長を tblen に設定します。

decHard = comm.ViterbiDecoder(trellis,'InputFormat','Hard', ...
    'TracebackDepth',tblen);

decUnquant = comm.ViterbiDecoder(trellis,'InputFormat','Unquantized', ...
    'TracebackDepth',tblen);

decSoft = comm.ViterbiDecoder(trellis,'InputFormat','Soft', ...
    'SoftInputWordLength',3,'TracebackDepth',tblen);

軟判定復号化用の量子化

軟判定モードで comm.ViterbiDecoder オブジェクトを使用する前に、復調器の出力を量子化する必要があります。この例では、SoftInputWordLength が 3 の comm.ViterbiDecoder オブジェクトを使用します。短い語長と少ない BER ペナルティを両立するには、この値が妥当です。3 ビットの量子化でdsp.ScalarQuantizerEncoderオブジェクトを作成します。

scalQuant = dsp.ScalarQuantizerEncoder('Partitioning','Unbounded');
snrdB = EbNoCoded + 10*log10(k);
NoiseVariance = 10.^(-snrdB/10);
demodLLR.Variance = NoiseVariance;
scalQuant.BoundaryPoints = (-1.5:0.5:1.5)/NoiseVariance;

誤り率の計算

comm.ErrorRateオブジェクトを作成して、復号化されたビットと元の伝送ビットを比較します。ビタビ復号化器は、復号化されたビット ストリーム出力に、トレースバック長に等しい遅延を生じさせます。この遅延を考慮に入れるには、comm.ErrorRate オブジェクトの ReceiveDelay プロパティを tblen に設定します。

errHard = comm.ErrorRate('ReceiveDelay',tblen);
errUnquant = comm.ErrorRate('ReceiveDelay',tblen);
errSoft = comm.ErrorRate('ReceiveDelay',tblen);

システム シミュレーション

bitsPerIter の数のメッセージ ビットを生成します。次に、データを畳み込み符号化および変調します。

txData = randi([0 1],bitsPerIter,1); 
encData = enc(txData);
modData = qpskMod(encData);

AWGN チャネルを通して、変調された信号を渡します。

rxSig = chan(modData);

受信信号と出力された硬判定ビットを復調します。

hardData = demodHard(rxSig);

受信信号と出力された LLR 値を復調します。

LLRData = demodLLR(rxSig);

硬判定復号化

復調されたデータをビタビ復号化器を介して渡します。誤り統計を計算します。

rxDataHard = decHard(hardData);
berHard = errHard(txData,rxDataHard);

非量子化復号化

復調されたデータをビタビ復号化器を介して渡します。誤り統計を計算します。

rxDataUnquant = decUnquant(LLRData);
berUnquant = errUnquant(txData,rxDataUnquant);

軟判定復号化

復調されたデータを量子化器に渡します。軟判定モードでは、ビタビ復号化器は正の数値が 1、負の数値が 0 に相当することを前提とするため、量子化器に渡す前にこのデータを -1 で乗算しなければなりません。量子化器の出力をビタビ復号化器に渡します。誤り統計を計算します。

quantizedValue = scalQuant(-LLRData);
rxDataSoft = decSoft(double(quantizedValue));
berSoft = errSoft(txData,rxDataSoft);

シミュレーション例の実行

シミュレーション ファイル simLLRvsHD を実行し、前述した通信システムを Eb/No 値の範囲全体でシミュレートします。BER を計算し、その結果をプロットします。硬判定復調、非量子化復号化での LLR 復調、および軟判定復号化での LLR 復調の BER 結果はそれぞれ、赤、青、および黒でプロットされます。理論上の結果と比較したシミュレーション結果も表示されます。非量子化復号化の代わりに軟判定復号化を使用することで BER がわずかに低下することを確認します。軟判定復号化の BER 曲線と理論的な限界の BER 曲線との間のギャップは、量子化レベルを上げることで狭めることができます。

この例では BER の結果の計算にある程度時間がかかることがあります。Parallel Computing Toolbox™ (PCT) をインストール済みの場合は、usePCT を true に設定するとシミュレーションを並列実行できます。この場合には、ファイル LLRvsHDwithPCT が実行されます。

範囲の広い Eb/No 値について結果を得るには、適切なサポート ファイルを変更します。集計される誤りが多いほど統計的により信頼性の高い結果が得られます。

usePCT = false;
if usePCT && license('checkout','Distrib_Computing_Toolbox') ...
        && ~isempty(ver('parallel'))
    LLRvsHDwithPCT(1.5:0.5:5.5,5);
else
    simLLRvsHD(1.5:0.5:5.5,5);
end

付録

この例では、以下の関数が使用されています。

  • simLLRvsHD.m — PCT を使用せずにシステムをシミュレートする。

  • LLRvsHDwithPCT.m — PCT を使用してシステムをシミュレートする。

  • simLLRvsHDPCT.m — LLRvsHDwithPCT によって呼び出される補助関数。