メインコンテンツ

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

comm.APPDecoder

R2026a

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

説明

comm.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 を使用して作成するか、手動で作成することができます。この構造体の詳細については、Trellis Description of a Convolutional Codeおよび関数 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 として解釈されます。

このオブジェクトは可変サイズの入力を受け入れます。オブジェクトがロックされた後は、シミュレーション中に信号のフレーム サイズ (行数) を変更できますが、チャネル数 (列数) は一定のままでなければなりません。詳細については、Variable-Size Signals in Codeを参照してください。

データ型: 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
M = 2;              % PSK-modulation order

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

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

System object の初期化

畳み込み符号化、APP 復号化、およびエラー レートの計算を行う 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);
bitError = comm.ErrorRate; % BER measurement

フレーム処理ループ

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

ber = zeros(length(EbNo),1); 
bps = log2(M);
turboEncRate = k/(2*n);
SNRdB = convertSNR(EbNo,'ebno','snr', ...
    BitsPerSymbol=bps, ...
    CodingRate=turboEncRate);

for ii = 1:length(EbNo)

    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 = pskmod(encodedData,M);

        % Pass the modulated signal through an AWGN channel
        [receivedSignal,nzVar] = awgn(modSignal,SNRdB(ii));

        % Demodulate the noisy signal using LLR to output soft bits
        demodSignal = pskdemod(receivedSignal,M,OutputType='llr',NoiseVar=nzVar);

        % 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(ii) = 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 baseline /N indexOf 0 baseline (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' の値は、log∑iexp(ai) のような式を他の量で近似します。'Max' オプションは、max(ai) を近似として使用します。'Max*' オプションは、max(ai) に式 ln(1+exp(−|ai−1−ai|)) によって求められる補正項を加えて使用します。

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 (November 1996): 42–127.

[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 で導入