Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

comm.APPDecoder

APP 法を使用した畳み込み符号の復号化

説明

APPDecoder System object™ は、畳み込み符号の事後確率 (APP) 復号化を実行します。

APP 法を使用して畳み込み符号を復号化するには、次を行います。

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

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

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

作成

説明

appDec = comm.APPDecoder は、APP 法を使用して畳み込み符号を復号化する、APP 復号化器 System object appDec を作成します。

appDec = comm.APPDecoder(Name,Value) は、1 つ以上の名前と値のペアを使用してプロパティを設定します。たとえば、comm.APPDecoder('Algorithm','True APP') は、真の事後確率復号化を実装するように System object appDec を構成します。各プロパティ名を引用符で囲みます。

appDec = comm.APPDecoder(trellis,Name,Value) は、TrellisStructure プロパティが trellis に設定された APP 復号化器オブジェクト appDec を作成します。

プロパティ

すべて展開する

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

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

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

トレリス表現。符号化率 K/N の符号に対するトレリス表現を含む MATLAB® 構造体として指定します。K は入力ビット ストリーム数を表し、N は出力ビット ストリーム数を表します。

トレリス構造体は、関数 poly2trellis を使用して作成するか、手動で作成することができます。この構造体の詳細については、畳み込み符号のトレリス表現および関数 istrellis を参照してください。

トレリス構造体には次のフィールドがあります。

符号化器への入力シンボルの数。2K と等しい整数として指定します。ここで、K は入力ビット ストリームの数です。

符号化器からの出力シンボルの数。2N と等しい整数として指定します。ここで、N は出力ビット ストリームの数です。

符号化器内の状態の数。2 のべき乗として指定します。

現在の状態と現在の入力のすべての組み合わせの次の状態。整数の行列として指定します。行列のサイズは numStates 行 2K 列でなければなりません。

現在の状態と現在の入力のすべての組み合わせの出力。8 進数の行列として指定します。行列のサイズは numStates 行 2K 列でなければなりません。

データ型: struct

符号化フレームの終了方法。'Truncated' または 'Terminated' として指定します。プロパティが 'Truncated' に設定された場合、この System object は、符号化器が入力フレームの最後のシンボルの符号化後に停止するものとします。プロパティが 'Terminated' に設定された場合、この System object は、符号化器が追加のシンボルを符号化することで、トレリスに各フレームをすべてゼロの状態にして終了させるようにするものとします。符号化フレームを comm.ConvolutionalEncoder System object を使用して生成する場合、このプロパティ値は、畳み込み符号化器およびこの System object のプロパティ値と一致しなければなりません。

データ型: char | string

復号化アルゴリズム。'Max*''True APP' または 'Max' として指定します。プロパティが 'True APP' に設定された場合、この System object は真の APP 復号化を実装します。プロパティが他のいずれかの値に設定された場合、この System object は計算速度を向上させるため近似を行います。詳細については、アルゴリズムを参照してください。

データ型: char | string

スケーリング ビット数。範囲 [0, 8] の整数として指定します。このプロパティは、計算中の精度低下を避けるため、復号化器が入力データのスケーリングに使用するビット数を指定します。

依存関係

このプロパティを有効にするには、Algorithmプロパティを 'Max*' に設定します。

データ型: double

コード化ビット対数尤度比 (LLR) 出力を有効にするオプション。数値または logical 1 (true) または 0 (false) として指定します。この System object を呼び出す際に 2 番目の出力を無効にするには、このプロパティを 0 (false) に設定します。

データ型: logical

使用法

説明

[LUD,LCD] = appDec(LU,LC) は、符号化器入力ビットの LLR シーケンス LU および符号化されたビットの LLR シーケンス LC に対して APP 復号化を実行します。System object は LUD および LCD を返します。これらの出力値はそれぞれ LU および LC の更新バージョンで、符号化器情報に基づいて取得されます。

LUD = appDec(LU,LC) は、LCD の出力を無効にして APP 復号化を実行します。LCD の出力を無効にするには、CodedBitLLROutputPortプロパティを 0 (false) に設定します。

入力引数

すべて展開する

符号化器入力データの LLR シーケンス。実数値の列ベクトルとして指定します。正の軟入力は logical 1、負の軟入力は logical 0 として解釈されます。

データ型: single | double

符号化されたデータの LLR シーケンス。実数値の列ベクトルとして指定します。正の軟入力は logical 1、負の軟入力は logical 0 として解釈されます。

データ型: single | double

出力引数

すべて展開する

LU の更新された値。実数値の列ベクトルとして返されます。

データ型: single | double

LC の更新された値。実数値の列ベクトルとして返されます。

データ型: single | double

メモ

畳み込み符号が 2n シンボル候補のアルファベットを使用する場合 (n は入力シンボルあたりのビット数)、LC および LCD のベクトル長はある正の整数 L に対して L × n になります。同様に、復号化されたデータが 2k 出力シンボルのアルファベットを使用する場合 (k は出力シンボルあたりのビット数)、LU および LUD のベクトル長は L × k になります。

この System object は、L の正の整数値のある列ベクトル入力信号を受け入れます。可変サイズの入力の場合、L は複数回の呼び出し中に変化する可能性があります。

オブジェクト関数

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

release(obj)

すべて展開する

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

すべて折りたたむ

ノイズ分散とビット単位のフレーム長を指定します。畳み込み符号化器と AWGN チャネルの System object を作成します。

M = 8;
snr = 7;
frameLength = 300;
convEncoder = comm.ConvolutionalEncoder( ...
    'TerminationMethod','Truncated');

畳み込み APP 復号化器、PSK 変調器、エラー レートの各 System object を作成します。

appDecoder = comm.APPDecoder(...
    'TrellisStructure',poly2trellis(7,[171 133]), ...
    'Algorithm','True APP', ...
    'CodedBitLLROutputPort',false);
errRate = comm.ErrorRate;

畳み込み符号化され、8-PSK 変調されたビット ストリームを AWGN チャネル経由で送信します。軟判定を使用して、受信した信号を復調します。APP 復号化器を使用して、復調した信号を復号化します。

for counter = 1:5
     data = randi([0 1],frameLength,1);
     encodedData = convEncoder(data);
     psksig = pskmod(encodedData,M,InputType='bit');
     [rxsig,noisevar] = awgn(psksig,snr);
     demodsig = pskdemod(rxsig,M, ...
         OutputType='approxllr', ...
         NoiseVariance=noisevar);
     % The APP decoder assumes a polarization of the soft
     % inputs that is inverse to that of the demodulator 
     % soft outputs. Change the sign of demodulated signal.
     receivedSoftBits = appDecoder( ...
         zeros(frameLength,1),-demodsig);
     % Convert from soft-decision to hard-decision.
     receivedBits = double(receivedSoftBits > 0);
     % Count errors
     errorStats = errRate(data,receivedBits);
end

エラー レート情報を表示します。

fprintf('Error rate = %f\nNumber of errors = %d\n', ...
     errorStats(1), errorStats(2))
Error rate = 0.000000
Number of errors = 0

連結畳み込み符号は高い信頼性を実現し、ターボ符号として注目されるようになり、使用率が増加しました。comm.TurboEncoderおよびcomm.TurboDecoderSystem object はレート 1/n 畳み込み符号のみをサポートします。この例では、comm.ConvolutionalEncoderおよびcomm.APPDecoderSystem object を使用することにより、効果的なレート 1/3 ターボ符号を達成するための 2 つのレート 2/3 畳み込み符号の並列連結を示します。

システム パラメーター

blkLength = 1024;   % Block length
EbNo = 0:5;         % Eb/No values to loop over
numIter = 3;        % Number of decoding iterations
maxNumBlks = 1e2;   % Maximum number of blocks per Eb/No value

畳み込み符号化器/復号化器パラメーター

trellis = poly2trellis([5 4],[23 35 0; 0 5 13]);
k = log2(trellis.numInputSymbols);      % number of input bits
n = log2(trellis.numOutputSymbols);     % number of output bits
intrIndices = randperm(blkLength/k)';   % Random interleaving
decAlg = 'True App';                    % Decoding algorithm
modOrder = 2;                           % PSK-modulation order

System object の初期化

畳み込み符号化、APP 復号化、BPSK 変調と復調、AWGN チャネル、およびエラー レート計算用の System object™ を初期化します。対数尤度比メソッドを使用して、復調は軟ビットを出力します。

cEnc1 = comm.ConvolutionalEncoder( ...
    'TrellisStructure',trellis, ...
    'TerminationMethod','Truncated');
cEnc2 = comm.ConvolutionalEncoder( ...
    'TrellisStructure',trellis, ...
    'TerminationMethod','Truncated');
cAPPDec1 = comm.APPDecoder( ...
    'TrellisStructure',trellis, ...
    'TerminationMethod','Truncated', ...
    'Algorithm',decAlg);
cAPPDec2 = comm.APPDecoder( ...
    'TrellisStructure',trellis, ...
    'TerminationMethod','Truncated', ...
    'Algorithm',decAlg);

bpskMod = comm.BPSKModulator;
bpskDemod = comm.BPSKDemodulator( ...
    'DecisionMethod','Log-likelihood ratio', ...
    'VarianceSource','Input port');

awgnChan = comm.AWGNChannel( ...
    'NoiseMethod','Variance', ...
    'VarianceSource','Input port');

bitError = comm.ErrorRate; % BER measurement

フレーム処理ループ

Eb/N0 値の範囲全体をループして、BER 性能に対する結果を生成します。補助関数 helperTurboEnc および helperTurboDec は、ターボ符号化と復号化を実行します。

ber = zeros(length(EbNo),1); 
bitsPerSymbol = log2(modOrder);
turboEncRate = k/(2*n);

for ebNoIdx = 1:length(EbNo)
    % Calculate the noise variance from EbNo
    EsNo = EbNo(ebNoIdx) + 10*log10(bitsPerSymbol);
    SNRdB = EsNo + 10*log10(turboEncRate); % Account for code rate
    noiseVar = 10^(-SNRdB/10);

    for  numBlks = 1:maxNumBlks 
        % Generate binary data
        data = randi([0 1],blkLength,1);

        % Turbo encode the data
        [encodedData,outIndices] = helperTurboEnc( ...
            data,cEnc1,cEnc2, ...
            trellis,blkLength,intrIndices);

        % Modulate the encoded data
        modSignal = bpskMod(encodedData);

        % Pass the modulated signal through an AWGN channel
        receivedSignal = awgnChan(modSignal,noiseVar);

        % Demodulate the noisy signal using LLR to output soft bits
        demodSignal = bpskDemod(receivedSignal,noiseVar);

        % Turbo decode the demodulated data
        receivedBits = helperTurboDec( ...
            -demodSignal,cAPPDec1,cAPPDec2, ...
            trellis,blkLength,intrIndices,outIndices,numIter); 
        
        % Calculate the error statistics
        errorStats = bitError(data,receivedBits);        
    end
    
    ber(ebNoIdx) = errorStats(1);
    reset(bitError);
end

結果の表示

LTE や CCSDS などの実用無線システムではターボ符号用に基本レート 1/n の畳み込み符号を指定しますが、ターボ符号が実行可能になると、結果にはより高いレートの畳み込み符号の使用が示されます。

figure; 
semilogy(EbNo, ber, '*-');
grid on; 
xlabel('E_b/N_0 (dB)'); 
ylabel('BER'); 
title('High Rate Convolutional Codes for Turbo Coding'); 
legend(['N = ' num2str(blkLength) ', ' num2str(numIter) ' iterations']);

Figure contains an axes object. The axes object with title High Rate Convolutional Codes for Turbo Coding, xlabel E indexOf b/N 0 baseline blank (dB), ylabel BER contains an object of type line. This object represents N = 1024, 3 iterations.

補助関数

function [yEnc,outIndices] = helperTurboEnc( ...
    data,hCEnc1,hCEnc2,trellis,blkLength,intrIndices)
% Turbo encoding using two parallel convolutional encoders.
% No tail bits handling and assumes no output stream puncturing.

    % Trellis parameters
    k = log2(trellis.numInputSymbols);
    n = log2(trellis.numOutputSymbols);
    cLen = blkLength*n/k;

    punctrVec = [0;0;0;0;0;0];      % assumes all streams are output
    N = length(find(punctrVec==0));

    % Encode random data bits
    y1 = hCEnc1(data);
    y2 = hCEnc2( ...
        reshape(intrlv(reshape(data,k,[])',intrIndices)',[],1));
    y1D = reshape(y1(1:cLen),n,[]);
    y2D = reshape(y2(1:cLen),n,[]);
    yDTemp = [y1D; y2D];
    y = yDTemp(:);

    % Generate output indices vector using puncturing vector
    idx = 0 : 2*n : (blkLength - 1)*2*(n/k);
    punctrVecIdx = find(punctrVec==0);
    dIdx = repmat(idx, N, 1) + punctrVecIdx;
    outIndices = dIdx(:);
    yEnc = y(outIndices);
end

function yDec = helperTurboDec( ...
    yEnc,cAPPDec1,cAPPDec2,trellis, ...
    blkLength,intrIndices,inIndices,numIter)
% Turbo decoding using two a-posteriori probability (APP) decoders

    % Trellis parameters
    k = log2(trellis.numInputSymbols);
    n = log2(trellis.numOutputSymbols);
    rCodLen = 2*(n/k)*blkLength;
    typeyEnc = class(yEnc);

    % Re-order encoded bits according to outIndices
    x = zeros(rCodLen,1);
    x(inIndices) = yEnc;

    % Generate output of first encoder
    yD = reshape(x(1:rCodLen),2*n,[]);
    lc1D = yD(1:n, :);
    Lc1_in = lc1D(:);

    % Generate output of second encoder
    lc2D   = yD(n+1:2*n, :);
    Lc2_in = lc2D(:);

    % Initialize unencoded data input
    Lu1_in = zeros(blkLength,1,typeyEnc);

    % Turbo Decode
    out1 = zeros(blkLength/k,k,typeyEnc);
    for iterIdx = 1 : numIter
        [Lu1_out, ~] = cAPPDec1(Lu1_in,Lc1_in);
        tmp = Lu1_out(1:blkLength);
        Lu2_in = reshape(tmp,k,[])';
        [Lu2_out, ~] = cAPPDec2( ...
            reshape(Lu2_in(intrIndices, :)',[],1),Lc2_in);
        out1(intrIndices, :) = reshape(Lu2_out(1:blkLength),k,[])';
        Lu1_in = reshape(out1',[],1);
    end
    % Calculate llr and decoded bits for the final iteration
    llr = reshape(out1', [], 1) + Lu1_out(1:blkLength);
    yDec = cast((llr>=0), typeyEnc);
end

アルゴリズム

この System object は、[1]および[2]に従って軟入力軟出力 APP 復号化アルゴリズムを実装します。

Algorithm プロパティの 'True APP' オプションは、[1] のセクション V にある方程式 20 ~ 23 に従って APP 復号化を実装します。速度を上げるために、Algorithm プロパティの 'Max*''Max' の値は、logiexp(ai) のような式を他の量で近似します。'Max' オプションは、max(ai) を近似として使用します。'Max*' オプションは、max(ai) に式 ln(1+exp(|ai1ai|)) によって求められる補正項を加えて使用します。

Algorithm プロパティを 'Max*' に設定すると、この System object の NumScalingBits プロパティが有効になります。このプロパティは、この System object が処理するデータ (入力と 2NumScalingBits を乗算し、同じ係数で事前出力を除算する) をスケーリングするビット数を表します。このプロパティを使用すると、計算中の精度低下を避けることができます。

参照

[1] Benedetto, S., G. Montorsi, D. Divsalar, and F. Pollara. "A Soft-Input Soft-Output Maximum A Posterior (MAP) Module to Decode Parallel and Serial Concatenated Codes." Jet Propulsion Lab TDA Progress Report, 42–127, (November 1996).

[2] Viterbi, A.J. “An Intuitive Justification and a Simplified Implementation of the MAP Decoder for Convolutional Codes.” IEEE Journal on Selected Areas in Communications 16, no. 2 (February 1998): 260–64. https://doi.org/10.1109/49.661114.

[3] Benedetto, S., and G. Montorsi. “Performance of Continuous and Blockwise Decoded Turbo Codes.” IEEE Communications Letters 1, no. 3 (May 1997): 77–79. https://doi.org/10.1109/4234.585802.

拡張機能

バージョン履歴

R2012a で導入