Main Content

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

comm.ConvolutionalEncoder

バイナリ データの畳み込み符号化

説明

comm.ConvolutionalEncoder System object™ は、バイナリ入力ベクトルのシーケンスを符号化して、バイナリ出力ベクトルのシーケンスを生成します。

バイナリ データを畳み込み符号化するには、次のようにします。

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

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

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

作成

説明

convencoder = comm.ConvolutionalEncoder は畳み込み符号化器 System object を作成します。

convencoder = comm.ConvolutionalEncoder(trellis)TrellisStructure プロパティを trellis に設定します。

convencoder = comm.ConvolutionalEncoder(___,Name,Value) は、前の構文の任意の引数の組み合わせに加えて、1 つ以上の名前と値からなる引数を使用してプロパティを設定します。たとえば、'TerminationMethod','Continuous' は、終了方法を連続として指定し、各入力ベクトルの最後に符号化器の状態を保持して次の入力ベクトルで使用できるようにします。

プロパティ

すべて展開する

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

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

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

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

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

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

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

データ型: double

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

データ型: double

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

データ型: double

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

データ型: double

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

データ型: double

データ型: struct

符号化フレームの終了方法。以下のいずれかの値を指定します。

  • 'Continuous' — System object は入力ベクトルの最後に符号化器の状態を保持して、次の入力ベクトルで使用できるようにします。

  • 'Truncated' — System object は各入力ベクトルを個別に扱います。符号化器の状態は、各入力ベクトルの開始時にリセットされます。InitialStateInputPort プロパティを 0 (false) に設定した場合、オブジェクトはその状態をすべてゼロの状態にリセットします。InitialStateInputPort プロパティを 1(true) に設定した場合、オブジェクトはその状態を、InitialStateInputPort 入力で指定された値にリセットします。

  • 'Terminated' — System object は各入力ベクトルを個別に扱います。オブジェクトは、個々の入力ベクトルごとに追加のビットを使用することで、符号化器状態をベクトルの終了時にすべて 0 の状態にリセットします。符号化率 K/N の符号に対して、オブジェクトは長さ N×(L+S)K のベクトルを出力します。ここでは、S = constraintLength – 1 (複数の拘束長がある場合は、S = sum(constraintLength(i)–1)) となります。L は入力の長さです。constraintLength – 1 は log2(NumStates) として定義されます。

データ型: char | string

符号化器のリセット入力を有効にするオプション。論理値 1 (true) または 0 (false) として指定します。オブジェクトへの追加入力を有効にするには、このプロパティを 1 (true) に設定します。この追加のリセット入力が非ゼロの値のとき、符号化器の内部状態はその初期条件にリセットされます。

依存関係

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

データ型: logical

出力リセットを遅延するオプション。次のいずれかの論理値を指定します。

  • 1 (true) — オブジェクトが符号化データを計算した後、符号化器の内部状態がリセットされます。

  • 0 (false) — オブジェクトが符号化データを計算する前に、符号化器の内部状態がリセットされます。

依存関係

このプロパティを有効にするには、ResetInputPort プロパティを 1 (true) に設定します。

データ型: logical

初期状態入力を有効にするオプション。論理値 1 (true) または 0 (false) として指定します。オブジェクトで入力ベクトルごとに符号化器の初期状態を指定できるようにするには、このプロパティを 1 (true) に設定します。

依存関係

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

データ型: logical

最終状態出力を有効にするオプション。論理値 1 (true) または 0 (false) として指定します。符号化器の最終状態を出力として取得するには、このプロパティを 1 (true) に設定します。

依存関係

このプロパティを有効にするには、TerminationMethod プロパティを 'Continuous' または 'Truncated' に設定します。

データ型: logical

パンクチャ パターンのソース。次のいずれかの値を指定します。

  • 'None' — オブジェクトはパンクチャを適用しません。

  • 'Property' — オブジェクトはコードをパンクチャします。このパンクチャは、PuncturePattern プロパティで指定するパンクチャ パターン ベクトルに基づきます。

依存関係

このプロパティを有効にするには、TerminationMethod プロパティを 'Continuous' または 'Truncated' に設定します。

データ型: char | string

符号化されたデータをパンクチャするためのパンクチャ パターン ベクトル。列ベクトルとして指定します。ベクトルには 10 が含まれている必要があります。ここで、0 はパンクチャされたビットまたは除外されたビットの位置を示します。

依存関係

このプロパティを有効にするには、TerminationMethod プロパティを 'Continuous' または 'Truncated' に設定し、PuncturePatternSource プロパティを 'Property' に設定します。

データ型: double

使用法

説明

codeword = convencoder(message) は、トレリス構造体で指定された畳み込み符号化スキームを使用して入力メッセージを符号化します。codeword は符号化されたコードワードです。message および codeword は、数値、論理値、または語長 1 の符号なし固定小数点値 (fi (Fixed-Point Designer) オブジェクト) の列ベクトルです。

codeword = convencoder(message,initstate) は、入力ベクトルごとに符号化器の初期状態を指定します。この構文を有効にするには、TerminationMethod プロパティを 'Truncated' に設定し、InitialStateInputPort プロパティを 1 (true) に設定します。

codeword = convencoder(message,resetstate) は、符号化器の内部状態をリセットするための入力を指定します。この構文を有効にするには、TerminationMethod プロパティを 'Continuous' に設定し、ResetInputPort プロパティを 1 (true) に設定します。

[codeword,finalstate] = convencoder(message) は、符号化器の最終状態も返します。この構文を有効にするには、FinalStateOutputPort プロパティを 1 (true) に設定し、TerminationMethod プロパティを 'Continuous' または 'Truncated' に設定します。

入力引数

すべて展開する

入力メッセージ。バイナリ値列ベクトルとして指定します。

データ型: double | int8 | fi(data,0,1)

符号化器の初期状態。整数として指定します。

依存関係

この引数を有効にするには、TerminationMethod プロパティを 'Truncated' に設定し、InitialStateInputPort プロパティを 1 (true) に設定します。

データ型: double

符号化器の内部状態のリセット。数値あるいは論理値 1 (true) または 0 (false) として指定します。

依存関係

この引数を有効にするには、TerminationMethod プロパティを 'Continuous' に設定し、ResetInputPort プロパティを 1 (true) に設定します。

データ型: double | logical

出力引数

すべて展開する

畳み込み符号化されたメッセージ。バイナリ値列ベクトルとして返されます。この出力ベクトルのデータ型および方向は入力 message と同じです。

畳み込み符号化器が符号化率 K/N の符号を表す場合、入力ベクトルの長さは、所定の正の整数 L について K×L に等しくなります。オブジェクトは、この出力ベクトルの長さを L×N に設定します。

データ型: double | int8 | fi(data,0,1)

符号化器の最終状態。整数として返されます。

依存関係

この引数を有効にするには、TerminationMethod プロパティを 'Continuous' または 'Truncated' に設定します。

データ型: double

オブジェクト関数

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

release(obj)

すべて展開する

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

すべて折りたたむ

畳み込み符号化され、8 差動位相シフト キーイング (DPSK) 変調されたビット ストリームを加法性ホワイト ガウス ノイズ (AWGN) チャネル経由で送信します。次に、ビタビ復号化器を使用して、変調されたビット ストリームの復調と復号化を行います。

必要な System object を作成します。

conEnc = comm.ConvolutionalEncoder;
modDPSK = comm.DPSKModulator('BitInput',true);
chan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (SNR)','SNR',10);
demodDPSK = comm.DPSKDemodulator('BitOutput',true);
vDec = comm.ViterbiDecoder('InputFormat','Hard');
error = comm.ErrorRate('ComputationDelay',3,'ReceiveDelay',34);

次の手順に従ってデータを処理します。

  1. ランダムなビットを生成します。

  2. データを畳み込み符号化します。

  3. DPSK 変調を適用します。

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

  5. ノイズを含む信号を復調します。

  6. ビタビ アルゴリズムを使用してデータを復号化します。

  7. 誤り統計を収集します。

for counter = 1:20
    data = randi([0 1],30,1);
    encodedData = conEnc(data);
    modSignal = modDPSK(encodedData);
    receivedSignal = chan(modSignal);
    demodSignal = demodDPSK(receivedSignal);
    receivedBits = vDec(demodSignal);
    errors = error(data,receivedBits);
end

誤り数を表示します。

errors(2)
ans = 3

定義されたパンクチャ パターンで畳み込み符号化器およびビタビ復号化器を使用し、ビットのシーケンスを符号化して復号化します。入力ビットと出力ビットが同一であることを確認します。

パンクチャ パターン行列を定義し、符号化器および復号化器 System object で使用するためにベクトル形式に変更します。

pPatternMat = [1 0 1;1 1 0];
pPatternVec = reshape(pPatternMat,6,1);

pPatternVec によってパンクチャ パターンを定義する、畳み込み符号化器およびビタビ復号化器を作成します。

conEnc = comm.ConvolutionalEncoder('PuncturePatternSource','Property','PuncturePattern',pPatternVec);
viDec = comm.ViterbiDecoder('InputFormat','Hard','PuncturePatternSource','Property', ...
        'PuncturePattern',pPatternVec);

適切な受信遅延を適用してエラー レート カウンターを作成します。

error = comm.ErrorRate('ReceiveDelay',viDec.TracebackDepth);

ランダム ビットのシーケンスを符号化し、符号化されたメッセージを復号化します。

dataIn = randi([0 1],600,1);
dataEncoded = conEnc(dataIn);
dataOut = viDec(dataEncoded);

出力データに誤りがないことを確認します。

errStats = error(dataIn,dataOut);
errStats(2)
ans = 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 変調と復調、AGWN チャネル、およびエラー レート計算用の 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 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

詳細

すべて展開する

参照

[1] Clark, George C., and J. Bibb Cain. Error-Correction Coding for Digital Communications. Applications of Communications Theory. New York: Plenum Press, 1981.

[2] Gitlin, Richard D., Jeremiah F. Hayes, and Stephen B. Weinstein. Data Communications Principles. Applications of Communications Theory. New York: Plenum Press, 1992.

[3] Yasuda, Y., K. Kashiki, and Y. Hirata. “High-Rate Punctured Convolutional Codes for Soft Decision Viterbi Decoding.” IEEE Transactions on Communications 32, no. 3 (March 1984): 315–19. https://doi.org/10.1109/TCOM.1984.1096047.

[4] Haccoun, D., and G. Begin. “High-Rate Punctured Convolutional Codes for Viterbi and Sequential Decoding.” IEEE Transactions on Communications 37, no. 11 (November 1989): 1113–25. https://doi.org/10.1109/26.46505.

[5] Begin, G., D. Haccoun, and C. Paquin. “Further Results on High-Rate Punctured Convolutional Codes for Viterbi and Sequential Decoding.” IEEE Transactions on Communications 38, no. 11 (November 1990): 1922–28. https://doi.org/10.1109/26.61470.

[6] Moision, B. "A Truncation Depth Rule of Thumb for Convolutional Codes." In Information Theory and Applications Workshop (January 27 2008-February 1 2008, San Diego, California), 555-557. New York: IEEE, 2008.

拡張機能

バージョン履歴

R2012a で導入