Main Content

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

comm.RSEncoder

リード・ソロモン符号化器を使用したデータの符号化

説明

RSEncoder オブジェクトは、指定したメッセージ長と符号語長でリード・ソロモン符号を作成します。

リード・ソロモン符号化方式を使用したデータを符号化方法は次のとおりです。

  1. リード・ソロモン符号化器オブジェクトを定義および設定します。構築を参照してください。

  2. step を呼び出して、comm.RSEncoder のプロパティに従い、データを符号化します。step の動作は、ツールボックスの各オブジェクト固有のものです。

メモ

R2016b 以降では、step メソッドを使用して、System object™ によって定義された演算を実行する代わりに、引数を関数であるかのように使ってオブジェクトを呼び出すことができます。たとえば、y = step(obj,x)y = obj(x) は同等の演算を実行します。

構築

enc = comm.RSEncoder はブロック符号化器 System object、enc を作成します。このオブジェクトはリード・ソロモン (RS) 符号化を実行します。

enc = comm.RSEncoder(N,K) は、CodewordLength プロパティを NMessageLength プロパティを K に設定して、RS 符号化器オブジェクト enc を作成します。

enc = comm.RSEncoder(N,K,GP) は、CodewordLength プロパティを NMessageLength プロパティを KGeneratorPolynomial プロパティを GP に設定して、RS 符号化器オブジェクト enc を作成します。

enc = comm.RSEncoder(N,K,GP,S) は、CodewordLength プロパティを NMessageLength プロパティを KGeneratorPolynomial プロパティを GPShortMessageLength プロパティを S に設定して、RS 符号化器オブジェクト enc を作成します。

enc = comm.RSEncoder(N,K,GP,S,Name,Value) は、CodewordLength プロパティを NMessageLength プロパティを KGeneratorPolynomial プロパティを GPShortMessageLength プロパティを S に設定し、さらに指定の各 Name プロパティを指定の Value に設定して、RS 符号化器オブジェクト enc を作成します。

enc = comm.RSEncoder(Name,Value) は、指定の各プロパティ名を指定の値に設定して、RS 符号化器オブジェクト enc を作成します。(Name1,Value1,...,NameN,ValueN) のように、追加の名前と値のペアの引数を任意の順番で指定できます。

プロパティ

メモ

入出力信号長の一覧は、comm.BCHDecoder のリファレンス ページのBCH System object と RS System object の入出力信号長の表に記載されています。

BitInput

入力をビットと仮定

入力がビットか整数かを指定します。既定の設定は false です。

このプロパティを false に設定した場合、オブジェクト実行時の入力データ値は整数の数値列ベクトルでなければなりません。入力メッセージと出力符号語を形成する各シンボルは、範囲 [0, 2M–1] の整数です。これらの整数は、有限ガロア体 gf(2M) の要素に対応します。M は、PrimitivePolynomialSource プロパティおよび PrimitivePolynomial プロパティで指定する原始多項式の次数です。

このプロパティを true に設定した場合、入力値はビットの数値列ベクトルでなければなりません。符号化されたデータの出力結果はビットの列ベクトルです。

CodewordLength

符号語長

RS 符号の符号語長を、倍精度の正の整数スカラー値で指定します。既定の設定は 7 です。

フルレングスの RS 符号では、このプロパティの値は 2M–1 でなければなりません。ここで、M は範囲 [3, 16] の整数です。

MessageLength

メッセージ長

メッセージ長を、倍精度の正の整数スカラー値で指定します。既定の設定は 3 です。

ShortMessageLengthSource

短縮メッセージ長のソース

短縮メッセージのソースを Auto または Property として指定します。既定の設定は Auto です。

ShortMessageLength

短縮メッセージ長

短縮メッセージの長さを、倍精度の正の整数スカラーとして指定します。この値は MessageLength 以下でなければなりません。既定の設定は 3 です。

ShortMessageLength < MessageLength の場合、RS 符号は短縮されます。

GeneratorPolynomialSource

生成多項式のソース

生成多項式のソースを Auto または Property として指定します。既定の設定は Auto です。

  • このプロパティを Auto に設定すると、オブジェクトは生成多項式を自動的に選択します。オブジェクトは PrimitivePolynomial プロパティの値に基づいて生成多項式を計算します。

  • このプロパティを Property に設定した場合、GeneratorPolynomial プロパティを使用して生成多項式を指定しなければなりません。

GeneratorPolynomial

生成多項式

RS 符号の生成多項式を、倍精度の整数の行ベクトルまたはガロア行ベクトルとして指定します。ガロア体の行ベクトル エントリは範囲 [0, 2M–1] で、生成多項式を降べきの順に表していなければなりません。各係数は、整数形式で表されたガロア体の要素 gf(2M) です。生成多項式の長さは CodewordLengthMessageLength + 1 でなければなりません。既定の設定は rsgenpoly(7,3,[],[],'double') の結果であり、[1 3 1 2 3] に対応します。

このプロパティは GeneratorPolynomialSourceProperty に設定した場合に適用されます。

CheckGeneratorPolynomial

生成多項式の検証を有効にする

このプロパティを true に設定すると、生成多項式の検証が実行されます。既定の設定は true です。

このチェックにより、XCodewordLength + 1GeneratorPolynomial で指定された生成多項式で割り切れることが確認されます。高次の生成多項式を使用する符号の場合、このチェックを無効にすると処理が高速化されます。最も良い方法は、少なくとも 1 回チェックを実行してからこのプロパティを false に設定することです。

このプロパティは、GeneratorPolynomialSourceProperty に設定されている場合に適用されます。

PrimitivePolynomialSource

原始多項式のソース

原始多項式のソースを Auto または Property のいずれかに指定します。既定の設定は Auto です。

  • このプロパティを Auto に設定すると、オブジェクトは次数 M = ceil (Fixed-Point Designer)(log2(CodewordLength+1)) の原始多項式を使用します。

  • このプロパティを Property に設定した場合は、PrimitivePolynomial プロパティを使用して多項式を指定しなければなりません。

PrimitivePolynomial

原始多項式

メッセージと符号語を形成する整数に対応して、有限体 gf(2M) を定義する原始多項式を指定します。このプロパティを、降べきの順に次数 M の gf(2) 上の原始多項式を表す、倍精度のバイナリ行ベクトルとして指定します。

CodewordLength が 2M–1 未満の場合、オブジェクトは短縮された RS 符号を使用します。既定の設定は fliplr(de2bi(primpoly(3))) の結果で、これは [1 0 1 1] または多項式 x3+x+1 です。

このプロパティは PrimitivePolynomialSourceProperty に設定した場合に適用されます。

PuncturePatternSource

パンクチャ パターンのソース

パンクチャ パターンのソースを None または Property のいずれかに指定します。既定の設定は None です。

  • このプロパティを None に設定すると、オブジェクトは符号にパンクチャを適用しません。

  • このプロパティを Property に設定すると、オブジェクトは PuncturePattern プロパティで指定したパンクチャ パターン ベクトルに基づいて符号をパンクチャします。

PuncturePattern

パンクチャ パターン ベクトル

符号化されたデータをパンクチャするために使用するパターンを、長さ (CodewordLengthMessageLength) の倍精度のバイナリ列ベクトルとして指定します。既定の設定は [ones(2,1); zeros(2,1)] です。パンクチャ パターン ベクトルのゼロは、パンクチャされる、つまり各符号語から除外されるパリティ シンボルの位置を示します。

このプロパティは、PuncturePatternSource プロパティを Property に設定した場合に適用されます。

OutputDataType

出力のデータ型

出力データ型を Same as inputdouble または logical に指定します。既定の設定は Same as input です。

このプロパティは、BitInput プロパティを true に設定した場合に適用されます。

メソッド

stepリード・ソロモン符号化器を使用したデータの符号化
すべての System object に共通
release

System object のプロパティ値の変更の許可

すべて折りたたむ

RS 符号化され、8-DPSK 変調されたシンボル ストリームを AWGN チャネル経由で送信します。次に、復調、復号および誤りカウントを行います。

    enc = comm.RSEncoder;
    mod = comm.DPSKModulator('BitInput',false);
    chan = comm.AWGNChannel(...
                'NoiseMethod','Signal to noise ratio (SNR)','SNR',10);
    demod = comm.DPSKDemodulator('BitOutput',false);
    hDdecec = comm.RSDecoder;
    errorRate = comm.ErrorRate('ComputationDelay',3);

    for counter = 1:20
      data = randi([0 7], 30, 1);
      encodedData = step(enc, data);
      modSignal = step(mod, encodedData);
      receivedSignal = step(chan, modSignal);
      demodSignal = step(demod, receivedSignal);
      receivedSymbols = step(hDdecec, demodSignal);
      errorStats = step(errorRate, data, receivedSymbols);            
    end      
      
  fprintf('Error rate = %f\nNumber of errors = %d\n', ...
      errorStats(1), errorStats(2))
Error rate = 0.115578
Number of errors = 69

リード・ソロモン符号化したデータを、QPSK を使用して AWGN チャネル経由で送信します。受信信号を復調して復号化し、誤り統計を収集します。符号化されたデータおよび符号化されていないデータの理論的ビット誤り率 (BER) を計算します。BER の結果をプロットして性能を比較します。

パラメーター例を定義します。

rng(1993);     % Seed random number generator for repeatable results
M = 4;         % Modulation order
bps = log2(M); % Bits per symbol
N = 7;         % RS codeword length
K = 5;         % RS message length

変調器、復調器、AWGN チャネルおよび誤り率オブジェクトを作成します。

pskModulator = comm.PSKModulator('ModulationOrder',M,'BitInput',true);
pskDemodulator = comm.PSKDemodulator('ModulationOrder',M,'BitOutput',true);
awgnChannel = comm.AWGNChannel('BitsPerSymbol',bps);
errorRate = comm.ErrorRate;

ビット入力を受け入れる (7,5) リード・ソロモン符号化器と復号化器のペアを作成します。

rsEncoder = comm.RSEncoder('BitInput',true,'CodewordLength',N,'MessageLength',K);
rsDecoder = comm.RSDecoder('BitInput',true,'CodewordLength',N,'MessageLength',K);

Eb/N0 の値の範囲を設定し、RS 符号化ゲインを考慮します。誤り統計行列を初期化します。

ebnoVec = (3:0.5:8)';
ebnoVecCodingGain = ebnoVec + 10*log10(K/N); % Account for RS coding gain
errorStats = zeros(length(ebnoVec),3);

Eb/N0 の値について、ビット誤り率を推定します。シミュレーションは、100 個の誤りまたは 107 ビットのいずれかに達するまで実行されます。シミュレーションの主なループ処理は、符号化、変調、復調および復号化です。

for i = 1:length(ebnoVec)
    awgnChannel.EbNo = ebnoVecCodingGain(i);
    reset(errorRate)
    while errorStats(i,2) < 100 && errorStats(i,3) < 1e7
        data = randi([0 1],1500,1);                % Generate binary data
        encData = rsEncoder(data);                 % RS encode
        modData = pskModulator(encData);           % Modulate
        rxSig = awgnChannel(modData);              % Pass signal through AWGN
        rxData = pskDemodulator(rxSig);            % Demodulate
        decData = rsDecoder(rxData);               % RS decode
        errorStats(i,:) = errorRate(data,decData); % Collect error statistics
    end
end

berfitを使用して、BER データを曲線近似します。関数bercodingberawgnを使用して、符号化を行う場合と行わない場合の QPSK のパフォーマンスの推定値を生成します。

berCurveFit = berfit(ebnoVecCodingGain,errorStats(:,1));
berwCoding = bercoding(ebnoVec,'RS','hard',N,K,'psk',M,'nondiff');
berNoCoding = berawgn(ebnoVec,'psk',M,'nondiff');

RS 符号化 BER データ、BER データの曲線近似、RS 符号化を行う場合の理論上の性能、および RS 符号化を行わない場合の理論上の性能をプロットします。(7,5) RS 符号は、10-2 のビット誤り率を達成するために必要な Eb/N0 を約 1.2 dB 向上させます。

semilogy(ebnoVecCodingGain,errorStats(:,1),'b*', ...
ebnoVecCodingGain,berCurveFit,'c-',ebnoVecCodingGain,berwCoding,'r',ebnoVec,berNoCoding)
ylabel('BER')
xlabel('Eb/No (dB)')
legend('RS coded BER','Curve Fit','Theory with coding','Theory no coding')
grid

Figure contains an axes. The axes contains 4 objects of type line. These objects represent RS coded BER, Curve Fit, Theory with coding, Theory no coding.

RS 符号化され、256-QAM 変調された短縮シンボル ストリームを AWGN チャネルを介して送信します。次に、誤りの復調、復号化、カウントを行います。

リード・ソロモン符号のパラメーターを設定します。ここで、N は符号語長、K は公称メッセージ長、S は短縮メッセージ長です。変調次数 M およびフレーム数 L を設定します。

N = 255;
K = 239;
S = 188;
M = 256;
L = 50;

AWGN チャネル System object と誤り率 System object を作成します。

awgnChan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)', ...
    'EbNo',15,'BitsPerSymbol',log2(M));
errorRate = comm.ErrorRate('ComputationDelay',3);

DVB-T 規格からリード・ソロモン生成多項式を作成します。

gp = rsgenpoly(N,K,[],0);

短縮メッセージ長 S と DVB-T 生成多項式 gp を使用して、リード・ソロモン符号化器および復号化器のペアを作成します。

enc = comm.RSEncoder(N,K,gp,S);
dec = comm.RSDecoder(N,K,gp,S);

1 つのメッセージ ブロックと等しい長さをもつ、ランダムなシンボル フレームを生成します。符号化、変調、AWGN 適用、復調、復号化および統計収集を行います。

for counter = 1:L
    data = randi([0 1],S,log2(M));
    encodedData = step(enc,bi2de(data));
    modSignal = qammod(encodedData,M,'UnitAveragePower',true);
    rxSignal = awgnChan(modSignal);
    demodSignal = qamdemod(rxSignal,M,'UnitAveragePower',true);
    rxBits = dec(demodSignal);
    dataOut = de2bi(rxBits);
    errorStats = errorRate(data(:),dataOut(:));
end

誤り率および誤り数を表示します。

fprintf('Error rate = %5.2e\nNumber of errors = %d\n', ...
    errorStats(1), errorStats(2))
Error rate = 2.01e-02
Number of errors = 1509

この例では、comm.RSEncoder System object とcomm.RSDecoder System object を構成して、通信システムをシミュレートする場合に消失を使用したリード・ソロモン (RS) ブロック符号化を実行する方法を説明します。RS 復号化器は誤りと消失の両方を訂正できます。受信機は、与えられた符号語の中に最も信頼性の低いシンボルを識別すると消失を生成できます。受信機がシンボルを消去する場合、そのシンボルをゼロで置換します。そして受信機は復号化器にフラグを渡し、そのシンボルが有効なコード シンボルではなく、消失であることを伝えます。また符号化器は、その出力から特定のパリティ シンボルが常に除去されたパンクチャを生成できます。復号化器はパンクチャのパターンを認識し、パンクチャ位置にゼロを挿入し、これらのシンボルを消失として扱います。復号化器は符号化器が生成したパンクチャと受信機が生成した消失を、シンボルを復号化する場合と同様に扱います。パンクチャは誤り訂正能力を多少低下させますが、符号化率をより柔軟にするメリットがあります。一定の同じ復調器入力のビットあたりのエネルギーとノイズ パワー スペクトル密度の比 (Eb/N0) では、短縮符号は誤り訂正性能を低下させることなく、同じ符号化率の柔軟性を維持します。パンクチャは符号語からパリティ シンボルを除去することで、短縮は符号語からメッセージ シンボルを除去することであることに注意してください。

この例では、ランダム ソース、RS 符号化器、64-QAM 変調器、AWGN チャネル、64-QAM 復調器および RS 復号化器で構成される通信システムのシミュレーションを示します。これには、チャネルのビット誤り率 (BER) 性能と符号化された BER 性能の比較による、消失を使用した RS 符号化の解析が含まれます。この例では、QAM 変調器の入力と QAM 復調器の出力を比較してチャネルの BER を求め、RS 符号化器の入力と RS 復号化器の出力を比較して符号化された BER を求めます。

初期化

補助関数 helperRSCodingConfig.m は、シミュレーション パラメーターを初期化し、通信システムのシミュレーションに使用するcomm.AWGNChannelおよびcomm.ErrorRate System object を構成します。符号化されていない Eb/N0 比を EbNoUncoded = 15 dB に設定します。シミュレーションを停止する基準は、誤りが 500 個発生した場合、または最大の 5e6 ビットが送信されたときにシミュレーションを停止するように定義されています。

helperRSCodingConfig;

RS 符号化器/復号化器の構成

この例では、64-QAM 変調方式で動作する (63,53) RS 符号を使用します。このコードは (63-53)/2 = 5 個の誤りを訂正するか、または代替として (63-53) = 10 個の消失を訂正することができます。64-QAM 復調器の出力における各符号語に対して、受信機は補助関数 RSCodingGetErasuresExample を使用して最も信頼性の低いシンボルを 6 つ決定します。これらの信頼性の低いシンボルの位置を示すインデックスは、RS 復号化器への入力として渡されます。RS 復号化器はこれらのシンボルを消失として扱い、その結果、符号語あたり (10-6)/2 = 2 個の誤り訂正能力になります。

comm.RSEncoder System object を作成し、その BitInput プロパティを false に設定し、符号化器の入力と出力が整数シンボルであることを指定します。

N = 63;  % Codeword length
K = 53;  % Message length
rsEncoder = comm.RSEncoder(N,K,'BitInput',false);
numErasures = 6;

comm.RSEncoderオブジェクトの構成と一致するcomm.RSDecoder System object を作成します。

rsDecoder = comm.RSDecoder(N,K,'BitInput',false);

消失を復号化器オブジェクトへの入力として指定するには、ErasuresInputPort プロパティを true に設定します。

rsDecoder.ErasuresInputPort = true;

NumCorrectedErrorsOutputPort プロパティを true に設定して、復号化器が訂正された誤りの数を出力するようにします。誤り出力中の非負の値は、入力符号語中の訂正された誤り数を示します。誤り出力中の値 –1 は復号化エラーを示します。RS 符号の誤り訂正能力以上の誤り数が入力符号語にある場合に、復号化エラーが発生します。

rsDecoder.NumCorrectedErrorsOutputPort = true;

ストリーム処理ループの実行

符号化されていない Eb/N0 比を 15 dB として、通信システムをシミュレートします。符号化されていない Eb/N0 は、システム内に符号化がない場合でもチャネルの入力で測定できる比率です。

AWGN チャネルを通る信号は符号化された信号のため、符号化されていない Eb/N0 値を符号化器出力におけるエネルギー比に対応するよう変換しなければなりません。この比は符号化された Eb/N0 比です。K 個のシンボルを符号化器に入力し、N 個の出力シンボルを得る場合、このエネルギー関係は K/N の比率で与えられます。AWGN チャネル オブジェクトの EbNo プロパティを符号化された Eb/N0 値の計算値に設定します。

EbNoCoded = EbNoUncoded + 10*log10(K/N);
channel.EbNo = EbNoCoded;

シミュレーションが目標の誤り数または最大送信回数に達するまでループします。

chanErrorStats = zeros(3,1);
codedErrorStats = zeros(3,1);
correctedErrors = 0;
while (codedErrorStats(2) < targetErrors) && ...
        (codedErrorStats(3) < maxNumTransmissions)

データ シンボルは、一度に 1 つのメッセージ語を送信します。各メッセージ語は、[0 N] 範囲の K 個のシンボルをもちます。

    data = randi([0 N],K,1);

メッセージ語を符号化します。符号化された語 encData(N-numPunc) シンボル長です。

    encData = rsEncoder(data);

符号化されたデータを変調してノイズを追加してから、チャネル出力を復調します。

    modData = qammod(encData,M);
    chanOutput = channel(modData);
    demodData = qamdemod(chanOutput,M);

補助関数 helperRSCodingGetErasures.m を使用して最も信頼性の低い 6 つのシンボルを求め、消去ベクトルを生成します。消去ベクトルの長さは、復調された符号語のシンボル数と等しくなければなりません。ベクトルの i 番目の要素に 1 があると、符号語の i 番目のシンボルが消去されます。ベクトル内にゼロがあると消去は行われないことを示します。

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);
    

データを復号化します。累積和オブジェクトを使用して訂正された誤り数を累積します。

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = cumulativeSum(errs);
    end

チャネルと符号化された BER を計算する場合は、整数をビットに変換します。

    chanErrorStats(:,1) = ...
        chanBERCalc(reshape(de2bi(encData,log2(M))',[],1),reshape(de2bi(demodData,log2(M))',[],1));   
    codedErrorStats(:,1) = ...
        codedBERCalc(reshape(de2bi(data,log2(M))',[],1),reshape(de2bi(estData,log2(M))',[],1));
end

誤り率測定オブジェクト chanBERCalccodedBERCalc は、BER の測定値の更新、誤り数、ビット送信の合計数を含む 3 行 1 列のベクトルを出力します。チャネル BER、符号化された BER と RS 復号化器によって訂正された誤りの合計数を表示します。

chanBitErrorRate = chanErrorStats(1)
chanBitErrorRate = 0.0017
codedBitErrorRate = codedErrorStats(1)
codedBitErrorRate = 0
totalCorrectedErrors = correctedErrors
totalCorrectedErrors = 882

処理ループの前後に for ループを追加して、一連の Eb/N0 値でシミュレーションを実行できます。シミュレーションは、符号化されていない Eb/N0 値を 4:15 dB に、目標の誤り数を 5000 に、最大送信回数を 50e6 に設定してオフラインで行いました。シミュレーションの結果が表示されます。符号化率によって Eb/N0 が低くなるので、チャネル BER は論理上の 64-QAM BER よりも悪くなります。

まとめ

この例では System object をいくつか利用して、RS ブロック符号化を使用した AWGN チャネルでの 64-QAM 通信システムをシミュレートしました。消失を使用したシンボルを復号化するための RS 復号化器の構成方法を説明しました。符号化された BER 曲線を誤り率測定 System object を使用して求め、チャネルと共に使用してシステム性能を測定しました。

この例では次の補助関数を使用します。

この例では、comm.RSEncoder System object とcomm.RSDecoder System object を構成して、通信システムをシミュレートする場合に消失とパンクチャ符号を使用したリード・ソロモン (RS) ブロック符号化を実行する方法を説明します。符号化器はパンクチャを生成してその出力から特定のパリティ シンボルを削除できます。復号化器は、パンクチャ パターンが与えられると、パンクチャ位置にゼロを挿入し、これらのシンボルを消失として扱います。復号化器は符号化器が生成したパンクチャと受信機が生成した消失を、復号化する場合と同様に扱います。パンクチャは誤り訂正能力を多少低下させますが、符号化率をより柔軟にするメリットがあります。

この例では、ランダム ソース、RS 符号化器、64-QAM 変調器、AWGN チャネル、64-QAM 復調器および RS 復号化器で構成される通信システムのシミュレーションを示します。これには、チャネルのビット誤り率 (BER) 性能と符号化された BER 性能の比較による、消失とパンクチャを使用した RS 符号化の解析が含まれます。この例では、QAM 変調器の入力と QAM 復調器の出力を比較してチャネルの BER を求め、RS 符号化器の入力と RS 復号化器の出力を比較して符号化された BER を求めます。

初期化

補助関数 helperRSCodingConfig.m は、シミュレーション パラメーターを初期化し、通信システムのシミュレーションに使用するcomm.AWGNChannelおよびcomm.ErrorRate System object を構成します。符号化されていない Eb/N0EbNoUncoded は 15 dB に設定されます。シミュレーションを停止する基準は、誤りが 500 個発生した場合、または最大の 5×106 ビットが送信されたときにシミュレーションを停止するように定義されています。

helperRSCodingConfig;

RS 符号化器/復号化器の構成

この例では、消失と符号のパンクチャ用に設定された 64-QAM 変調方式で動作する同じ (63,53) RS 符号を使用します。RS アルゴリズムは、受信機が生成した消失を復号化し、符号化器が生成したパンクチャを訂正します。各符号語に対して、パンクチャと消失の合計は、符号の誤り訂正能力の 2 倍を超えることはできません。

comm.RSEncoder System object を作成し、その BitInput プロパティを false に設定し、符号化器の入力と出力が整数シンボルであることを指定します。

N = 63;  % Codeword length
K = 53;  % Message length
rsEncoder = comm.RSEncoder(N,K,'BitInput',false);
numErasures = 6;

comm.RSEncoderオブジェクトの構成と一致するcomm.RSDecoder System object を作成します。次に、消失を復号化器オブジェクトへの入力として指定するには、ErasuresInputPort プロパティを true に設定します。

rsDecoder = comm.RSDecoder(N,K,'BitInput',false);
rsDecoder.ErasuresInputPort = true;

コードのパンクチャを有効にするには、PuncturePatternSource プロパティを 'Property' に、PuncturePattern プロパティを目的のパンクチャ パターン ベクトルに設定します。符号化器と復号化器とで、同じパンクチャ ベクトルを指定しなければなりません。この例では、各符号語から 2 つのシンボルをパンクチャします。パンクチャ パターン ベクトルの値 1 はパンクチャされていないシンボル、値 0 はパンクチャされたシンボルを示します。

numPuncs = 2;
rsEnc.PuncturePatternSource = 'Property';
rsEnc.PuncturePattern = [ones(N-K-numPuncs,1); zeros(numPuncs,1)];

rsDec.PuncturePatternSource = 'Property';
rsDec.PuncturePattern = rsEnc.PuncturePattern;

ストリーム処理ループの実行

符号化されていない Eb/N0 比を 15 dB として、通信システムをシミュレートします。符号化されていない Eb/N0 は、システム内に符号化がない場合でもチャネルの入力で測定できる比率です。

AWGN チャネルを通る信号は符号化された信号のため、符号化されていない Eb/N0 値を符号化器出力におけるエネルギー比に対応するよう変換しなければなりません。この比は符号化された Eb/N0 比です。K 個のシンボルを符号化器に入力し、N 個の出力シンボルを得る場合、このエネルギー関係は K/N の比率で与えられます。RS 符号化器によって生成された符号語の長さは、パンクチャ パターン ベクトルで指定されたパンクチャ数だけ減少するため、符号化された Eb/N0 比の値は、これらのパンクチャを考慮して調整しなければなりません。この例では、出力シンボルの数は (N - numPuncs) であり、符号化されていない Eb/N0 比は符号化された Eb/N0 と、以下に示すような関係があります。AWGN チャネル オブジェクトの EbNo プロパティを符号化された Eb/N0 値の計算値に設定します。

EbNoCoded = EbNoUncoded + 10*log10(K/(N - numPuncs));
channel.EbNo = EbNoCoded;

シミュレーションが目標の誤り数または最大送信回数に達するまでループします。

chanErrorStats = zeros(3,1);
codedErrorStats = zeros(3,1);
correctedErrors = 0;
while (codedErrorStats(2) < targetErrors) && ...
        (codedErrorStats(3) < maxNumTransmissions)

データ シンボルは、一度に 1 つのメッセージ語を送信します。各メッセージ語は、[0 N] 範囲の K 個のシンボルをもちます。

    data = randi([0 N],K,1);

メッセージ語を符号化します。符号化された語 encData は (NnumPunc) シンボル長です。

    encData = rsEncoder(data);

符号化されたデータを変調してノイズを追加してから、チャネル出力を復調します。

    modData = qammod(encData,M);
    chanOutput = channel(modData);
    demodData = qamdemod(chanOutput,M);

補助関数 helperRSCodingGetErasures.m を使用して最も信頼性の低い 6 つのシンボルを求め、消去ベクトルを生成します。消去ベクトルの長さは、復調された符号語のシンボル数と等しくなければなりません。ベクトルの i 番目の要素に 1 があると、符号語の i 番目のシンボルが消去されます。ベクトル内にゼロがあると消去は行われないことを示します。

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);
    

データを復号化します。累積和オブジェクトを使用して訂正された誤り数を累積します。

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = cumulativeSum(errs);
    end

チャネルと符号化された BER を計算する場合は、整数をビットに変換します。

    chanErrorStats(:,1) = ...
        chanBERCalc(reshape(de2bi(encData,log2(M))',[],1),reshape(de2bi(demodData,log2(M))',[],1));   
    codedErrorStats(:,1) = ...
        codedBERCalc(reshape(de2bi(data,log2(M))',[],1),reshape(de2bi(estData,log2(M))',[],1));
end

誤り率測定オブジェクト chanBERCalccodedBERCalc は、BER の測定値の更新、誤り数、ビット送信の合計数を含む 3 行 1 列のベクトルを出力します。チャネル BER、符号化された BER と RS 復号化器によって訂正された誤りの合計数を表示します。

chanBitErrorRate = chanErrorStats(1)
chanBitErrorRate = 0.0015
codedBitErrorRate = codedErrorStats(1)
codedBitErrorRate = 0
totalCorrectedErrors = correctedErrors
totalCorrectedErrors = 632

処理ループの前後に for ループを追加して、一連の Eb/N0 値でシミュレーションを実行します。シミュレーションは、符号化されていない Eb/N0 値を 4:15 dB に、目標の誤り数を 5000 に、最大送信回数を 50×106 に設定してオフラインで行いました。この図は、次に対して得られた結果を比較しています。

  • 消失のみを使用した RS 符号化

  • 消失とパンクチャを使用した RS 符号化

  • 64-QAM の場合の理論上の BER

符号化された Eb/N0 はチャネル Eb/N0 より若干高いため、チャネルの BER はパンクチャを使用したケースの方が若干よくなっています。一方、符号化された BER はパンクチャを使用したケースで悪化しています。これは、2 つのパンクチャが符号の誤り訂正能力を 1 つ低下させ、その結果、符号語あたり (10 – 6 – 2) / 2 = 1 個の誤りだけしか訂正できなくなるためです。

まとめ

この例では 関数と System object を利用して、RS ブロック符号化を使用した AWGN チャネルでの 64-QAM 通信システムをシミュレートしました。パンクチャド符号を取得するための RS 符号化器/復号化器 System object の構成方法を示しました。符号化された BER 曲線を誤り率測定 System object を使用して求め、チャネルと共に使用してシステム性能を測定しました。

この例では次の補助関数を使用します。

この例では、リード・ソロモン (RS) ブロック符号化を実行して (63,53) 符号を (28,18) 符号に短縮するようにcomm.RSEncoder System object とcomm.RSDecoder System object を構成する方法を説明します。ランダム ソース、RS 符号化器、64-QAM 変調器、AWGN チャネル、64-QAM 復調器および RS 復号化器で構成される通信システムのシミュレーションを示します。

チャネルのビット誤り率 (BER) 性能と符号化された BER 性能を比較して、消失、パンクチャ、および短縮を使用した RS 符号化の効果を解析します。この例では、QAM 変調器の入力と QAM 復調器の出力を比較してチャネルの BER を求め、RS 符号化器の入力と RS 復号化器の出力を比較して符号化された BER を求めます。パンクチャは符号語からパリティ シンボルを除去することで、短縮は符号語からメッセージ シンボルを除去することです。パンクチャは誤り訂正能力を多少低下させますが、符号化率をより柔軟にするメリットがあります。短縮符号は、同じ復調器入力 Eb/N0 の場合、誤り訂正性能を低下させることなく同一の符号化率の柔軟性を維持します。

初期化

補助関数 helperRSCodingConfig.m は、シミュレーション パラメーターを初期化し、通信システムのシミュレーションに使用するcomm.AWGNChannelおよびcomm.ErrorRate System object を構成します。符号化されていない Eb/N0 比を EbNoUncoded = 15 dB に設定します。シミュレーションを停止する基準は、誤りが 500 個発生した場合、または最大の 5×106 ビットが送信されたときにシミュレーションを停止するように定義されています。

helperRSCodingConfig;

RS 符号化器/復号化器の構成

この例では、64-QAM 変調方式で動作する (63,53) RS 符号を使用します。RS 符号化操作には、消失、パンクチャ、および符号の短縮があります。この例では、(63,53) 符号を (28,18) 符号に短縮する方法を示します。

たとえば、10 個のシンボルで (63,53) 符号を (53,43) 符号に短縮するには、CodewordLength プロパティと MessageLength プロパティにそれぞれ、53 と 43 を入力するだけで済みます (2log2(53+1)-1=63 であるため)。しかし、35 個のシンボルで (28,18) 符号に短縮する場合は、そのシンボルがガロア体 GF(26) に属することを明示的に指定しなければなりません。それ以外の場合、RS ブロックはそのコードが (31,21) 符号から短縮されると仮定します (2log2(28+1)-1=31 であるため)。

整数シンボルを入出力するように設定されている (63,53) 符号から短縮された (28,18) 符号でブロック符号化を実行するcomm.RSEncoderおよびcomm.RSDecoder System object のペアを作成します。1 つの消去入力と 2 つのパンクチャを受け入れるように復号化器を設定します。64-QAM 復調器の出力における各符号語に対して、受信機は補助関数 RSCodingGetErasuresExample を使用して最も信頼性の低いシンボルを 6 つ決定します。これらの信頼性の低いシンボルの位置を示すインデックスは、RS 復号化器への入力として渡されます。

N = 63;  % Codeword length
K = 53;  % Message length
S = 18;  % Shortenened message length
numErasures = 6;
numPuncs = 2; 
rsEncoder = comm.RSEncoder(N, K, 'BitInput', false);
rsDecoder = comm.RSDecoder(N, K, 'BitInput', false, 'ErasuresInputPort', true);
rsEncoder.PuncturePatternSource = 'Property';
rsEncoder.PuncturePattern = [ones(N-K-numPuncs,1); zeros(numPuncs,1)];
rsDecoder.PuncturePatternSource = 'Property';
rsDecoder.PuncturePattern = rsEncoder.PuncturePattern;

短縮された符号語長とメッセージ長の値を設定します。

rsEncoder.ShortMessageLength = S;
rsDecoder.ShortMessageLength = S;

PrimitivePolynomialSource プロパティを Property' に、PrimitivePolynomial プロパティを 6 次の原始多項式に設定して、RS 符号化器/復号化器 System object の GF(26) の要素を指定します。

primPolyDegree = 6;
rsEncoder.PrimitivePolynomialSource = 'Property';
rsEncoder.PrimitivePolynomial = de2bi(primpoly(primPolyDegree,'nodisplay'),'left-msb');

rsDecoder.PrimitivePolynomialSource = 'Property';
rsDecoder.PrimitivePolynomial = de2bi(primpoly(primPolyDegree,'nodisplay'),'left-msb');

ストリーム処理ループの実行

符号化されていない Eb/N0 比を 15 dB として、通信システムをシミュレートします。符号化されていない Eb/N0 は、システム内に符号化がない場合でもチャネルの入力で測定できる比率です。

AWGN チャネルを通る信号は符号化された信号のため、符号化されていない Eb/N0 値を符号化器出力におけるエネルギー比に対応するよう変換しなければなりません。この比は符号化された Eb/N0 比です。K 個のシンボルを符号化器に入力し、N 個の出力シンボルを得る場合、このエネルギー関係は K/N の比率で与えられます。符号化された Eb/N0 比の値は、短縮された符号語とパンクチャされた符号語を考慮して調整しなければなりません。出力シンボルの数は (N - numPuncs - S) であり、符号化されていない Eb/N0 比は、符号化された Eb/N0 と以下に示すような関係があります。AWGN チャネル オブジェクトの EbNo プロパティを符号化された Eb/N0 値の計算値に設定します。

EbNoCoded = EbNoUncoded + 10*log10(S/(N - numPuncs - K + S));
channel.EbNo = EbNoCoded;

シミュレーションが目標の誤り数または最大送信回数に達するまでループします。

chanErrorStats = zeros(3,1);
codedErrorStats = zeros(3,1);
correctedErrors = 0;
while (codedErrorStats(2) < targetErrors) && ...
        (codedErrorStats(3) < maxNumTransmissions)

データ シンボルは、一度に 1 つのメッセージ語を送信します。各メッセージ語は、[0 (2^primPolyDegree-1] 範囲の K-S 個のシンボルをもちます。

    data = randi([0 2^primPolyDegree-1],S,1);

短縮メッセージ語を符号化します。符号化された語 encData は、(N-numPuncs-S) シンボル長です。

    encData = rsEncoder(data);

符号化されたデータを変調してノイズを追加してから、チャネル出力を復調します。

    modData = qammod(encData,M);
    chanOutput = channel(modData);
    demodData = qamdemod(chanOutput,M);

補助関数 helperRSCodingGetErasures.m を使用して最も信頼性の低い 6 つのシンボルを求め、消去ベクトルを生成します。消去ベクトルの長さは、復調された符号語のシンボル数と等しくなければなりません。ベクトルの i 番目の要素に 1 があると、符号語の i 番目のシンボルが消去されます。ベクトル内にゼロがあると消去は行われないことを示します。

    erasuresVec = helperRSCodingGetErasures(chanOutput,numErasures);    

データを復号化します。累積和オブジェクトを使用して訂正された誤り数を累積します。

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = cumulativeSum(errs);
    end

チャネルと符号化された BER を計算する場合は、整数をビットに変換します。

    chanErrorStats(:,1) = ...
        chanBERCalc(reshape(de2bi(encData,log2(M))',[],1), ...
        reshape(de2bi(demodData,log2(M))',[],1));   
    codedErrorStats(:,1) = ...
        codedBERCalc(reshape(de2bi(data,log2(M))',[],1), ...
        reshape(de2bi(estData,log2(M))',[],1));
end

誤り率測定オブジェクト chanBERCalccodedBERCalc は、BER の測定値の更新、誤り数、ビット送信の合計数を含む 3 行 1 列のベクトルを出力します。チャネル BER、符号化された BER、および RS 復号化器によって訂正された誤りの合計数を表示します。

chanBitErrorRate = chanErrorStats(1)
chanBitErrorRate = 0.0036
codedBitErrorRate = codedErrorStats(1)
codedBitErrorRate = 9.6599e-05
totalCorrectedErrors = correctedErrors
totalCorrectedErrors = 1436

処理ループの前後に for ループを追加して、一連の Eb/N0 値でシミュレーションを実行します。シミュレーションは、符号化されていない Eb/N0 値を 4:15 dB に、目標の誤り数を 5000 に、最大送信回数を 50×106 に設定してオフラインで行いました。この図は、次に対して得られた結果を比較しています。

  • 消失のみを使用した RS 符号化

  • 消失とパンクチャを使用した RS 符号化

  • 消失、パンクチャ、および短縮を使用した RS 符号化

  • 64-QAM の場合の理論上の BER

符号化された Eb/N0 が低下するため、短縮を使用したチャネル BER。符号化された Eb/N0 のこの低下は、短縮符号の符号化率が非短縮符号に比べて大幅に低下するために生じます。また、短縮によって、符号化された BER は低い Eb/N0 値で最も著しく低下します。

まとめ

この例では System object をいくつか利用して、短縮された RS ブロック符号を使用した AWGN チャネルでの 64-QAM 通信システムをシミュレートしました。RS 復号化器を構成し、(63,53) 符号を (28,18) 符号に短縮する方法を示しました。符号化された BER 曲線を誤り率測定 System object を使用して求め、チャネルと共に使用してシステム性能を測定しました。

この例では次の補助関数を使用します。

アルゴリズム

このオブジェクトは、BCH と RS の誤りのみの復号化のアルゴリズムで説明されているアルゴリズム、入力および出力を実装しています。

参照

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

拡張機能

R2012a で導入