Main Content

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

comm.RSDecoder

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

説明

RSDecoder オブジェクトは、メッセージ ベクトルをリード・ソロモン コードワード ベクトルから復元します。適切に復号化するには、このオブジェクトのプロパティ値と、対応する RS 符号化器オブジェクトのプロパティ値が一致していなければなりません。

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

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

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

メモ

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

構築

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

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

dec = comm.RSDecoder(N,K,GP) は、RS 復号化器オブジェクト dec を作成します。このとき、CodewordLength プロパティは N に、MessageLength プロパティは K に、GeneratorPolynomial プロパティは GP に設定します。

dec = comm.RSDecoder(N,K,GP,S) は、RS 復号化器オブジェクト dec を作成します。このとき、CodewordLength プロパティは N に、MessageLength プロパティは K に、GeneratorPolynomial プロパティは GP に、ShortMessageLength プロパティは S に設定します。

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

dec = comm.RSDecoder(Name,Value) は、指定の各プロパティ名を指定の値に設定して、RS 復号化器オブジェクト dec を作成します。(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 ≤ M ≤ 16 を満たす整数です。

MessageLength

メッセージ長

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

ShortMessageLengthSource

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

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

  • このプロパティを Auto に設定した場合、RS 符号は CodewordLengthMessageLengthGeneratorPolynomial および PrimitivePolynomial プロパティによって定義されます。

    このプロパティを Property に設定した場合、他のプロパティとともに RS 符号の定義に使用する ShortMessageLength プロパティを指定しなければなりません。既定の設定は 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 + 1 が GeneratorPolynomial プロパティで指定された生成多項式で割り切れることが確認されます。高次の生成多項式を使用する符号の場合、このチェックを無効にすると処理が高速化されます。最も良い方法は、少なくとも 1 回チェックを実行してからこのプロパティを false に設定することです。

有効な生成多項式は (X – αB)×(X – α(B + 1))×...×(X-α(B + CodewordLengthMessageLength – 1)) で表されます。ここで α は原始多項式の根であり、B は整数です。B の値が 1 の場合、このプロパティを false に設定できます。それ以外の場合は、このプロパティを常に true に設定してください。B の詳細については、関数 rsgenpoly のリファレンス ページを参照してください。

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

PrimitivePolynomialSource

原始多項式のソース

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

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

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

PrimitivePolynomial

原始多項式

メッセージとコードワードを形成する整数に対応して、有限体 gf(2M) を定義する原始多項式を指定します。既定の設定は int2bit(primpoly(3),4)' の結果で、これは [1 0 1 1] または多項式 x3 + x + 1 です。このプロパティを、降べきの順に次数 M の gf(2) 上の原始多項式を表す、倍精度のバイナリ行ベクトルとして指定します。

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

PuncturePatternSource

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

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

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

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

PuncturePattern

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

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

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

ErasuresInputPort

消去入力を有効にする

このプロパティを true に設定すると、消去のベクトルをオブジェクト実行時の入力として指定できます。既定の設定は false です。消去入力は、入力コードワードの消去対象のシンボルを示す倍精度または論理バイナリ列ベクトルでなければなりません。消去ベクトルの長さについては、BCH System object と RS System object の入出力信号長で説明しています。

このプロパティを false に設定すると、オブジェクトは消去を行いません。

NumCorrectedErrorsOutputPort

訂正された誤り数の出力の有効化

このプロパティを true に設定すると、訂正された誤りの数をオブジェクト実行時の出力として取得できます。既定の設定は true です。誤り出力ベクトルの i 番目の要素の非負の値は i 番目の入力コードワード内の訂正された誤りの数を示します。誤り出力ベクトルの i 番目の要素の -1 の値は、そのコードワードで発生した復号化の誤りを示します。入力コードワードに RS 符号の誤り訂正能力を超える誤りがあると、復号化の誤りが発生します。

OutputDataType

出力のデータ型

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

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

メソッド

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 チャネルとエラー レート オブジェクトを作成します。

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);
        encData = rsEncoder(data);
        modData = pskmod(encData,M,InputType='bit');
        rxSig = awgnChannel(modData);
        rxData = pskdemod(rxSig,M,OutputType='bit');
        decData = rsDecoder(rxData);
        errorStats(i,:) = errorRate(data,decData);
    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 object. The axes object 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);

データを復号化します。RS 復号化器によって訂正された誤り数をログに記録します。

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = correctedErrors + 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);

データを復号化します。RS 復号化器によって訂正された誤り数をログに記録します。

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = correctedErrors+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);    

データを復号化します。RS 復号化器によって訂正された誤り数をログに記録します。

    [estData,errs] = rsDecoder(demodData,erasuresVec);
    if (errs >= 0)
        correctedErrors = correctedErrors + 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

64-QAM 復調器の出力の BER は、短縮を使用した方が使用しない場合より悪化します。これは、短縮コードの符号化率が非短縮符号の符号化率よりもかなり低く、復調器に入力される符号化された Eb/N0 が短縮によって悪化するためです。短縮符号は同一の Eb/N0 に対する誤り訂正能力では非短縮符号と変わりはありませんが、Eb/N0 の低減は、短縮を使用した場合の RS 復号化器の出力において、使用しない場合よりも高い BER として明確に現れます。

符号化された Eb/N0 はチャネル Eb/N0 より若干高いため、チャネル BER は短縮を使用した場合の符号化 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 で導入