このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
対数尤度比 (LLR) 復調
この例では、畳み込み符号化された通信リンクで硬判定復調の代わりに対数尤度比 (LLR) を使用することで、QPSK 変調に対する BER 性能が向上することを示します。LLR 復調では、ビタビ復号化器を非量子化復号化モードまたは軟判定復号化モードのどちらかで使用できます。非量子化復号化では、復号化器入力は実数値であり、BER の点で優れていますが、現実的には実現不可能です。より現実的な軟判定復号化では、復調器の出力を量子化してから復号化器に送信します。一般に、軟判定復号化により BER のコストが大幅に増大することはなく、むしろ復号化器の複雑度が大幅に低下することが認められます。この例では、シミュレーションを通じて BER 性能を検証します。
この例の Simulink™ バージョンについては、Simulink での LLR と硬判定復調を参照してください。
初期化
シミュレーション パラメーターを初期化します。
M = 4; % Modulation order bitsPerIter = 1.2e4; % Number of bits to simulate EbNo = 3; % Information bit Eb/No in dB
符号化率 1/2、拘束長 7 コードのコード プロパティを初期化します。
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);
入力に trellis
を使用してcomm.ConvolutionalEncoder
System object™ を作成します。
enc = comm.ConvolutionalEncoder(trellis);
チャネル
AWGN チャネルに入る信号は、変調され、符号化された信号です。必要なノイズ レベルを達成するため、符号化されたビットとマルチビットの各シンボルの Eb/No を調整します。シミュレートする 値に基づいて 値を計算します。
SNR = convertSNR(EbNo,"ebno","BitsPerSymbol",log2(M),"CodingRate",codeRate);
ビタビ復号化
それぞれ硬判定、非量子化および軟判定の復号化器として機能する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.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 = pskmod(encData,M,pi/4,InputType="bit");
AWGN チャネルを通して、変調された信号を渡します。
[rxSig,nVar] = awgn(modData,SNR);
軟判定モードで comm.ViterbiDecoder
オブジェクトを使用する前に、復調器の出力を量子化する必要があります。この例では、SoftInputWordLength
が 3 の comm.ViterbiDecoder
オブジェクトを使用します。短い語長と少ない BER ペナルティを両立するには、この値が妥当です。3 ビット量子化の分割点を定義します。
demodLLR.Variance = nVar; partitionPoints = (-1.5:0.5:1.5)/nVar;
受信信号と出力された硬判定ビットを復調します。
hardData = pskdemod(rxSig,M,pi/4,OutputType="bit");
受信信号と出力された LLR 値を復調します。
LLRData = pskdemod(rxSig,M,pi/4,OutputType="llr",NoiseVariance=nVar);
硬判定復号化
復調されたデータをビタビ復号化器を介して渡します。誤り統計を計算します。
rxDataHard = decHard(hardData); berHard = errHard(txData,rxDataHard);
非量子化復号化
復調されたデータをビタビ復号化器を介して渡します。誤り統計を計算します。
rxDataUnquant = decUnquant(LLRData); berUnquant = errUnquant(txData,rxDataUnquant);
軟判定復号化
復調されたデータを関数quantiz
に渡します。軟判定モードでは、ビタビ復号化器は正の数値が 1、負の数値が 0 に相当することを前提とするため、量子化器に渡す前にこのデータを -1
で乗算しなければなりません。量子化器の出力をビタビ復号化器に渡します。誤り統計を計算します。
quantizedValue = quantiz(-LLRData,partitionPoints); 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 によって呼び出される補助関数。