Main Content

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

comm.RSDecoder

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

説明

comm.RSDecoder System object™ は、メッセージ ベクトルをリード・ソロモン (RS) コードワード ベクトルから復元します。適切に復号化するには、このオブジェクトのプロパティ値と、対応する comm.RSEncoder オブジェクトのプロパティ値が一致していなければなりません。詳細については、アルゴリズムを参照してください。

RS 符号化方式を使用してデータを復号化するには、次のようにします。

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

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

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

作成

説明

dec = comm.RSDecoder は、RS 復号化を適用する RS 復号化器 System object dec を作成します。

dec = comm.RSDecoder(N,K) は、CodewordLengthN に設定し、MessageLengthK に設定します。たとえば、comm.RSDecoder(7,3) は (7,3) RS 復号化器オブジェクトを作成します。

dec = comm.RSDecoder(N,K,GP) はさらに、GeneratorPolynomialGP に設定し、GeneratorPolynomialSource'Property' に設定します。

dec = comm.RSDecoder(N,K,GP,S) はさらに、ShortMessageLengthS に設定し、ShortMessageLengthSource'Property' に設定します。

dec = comm.RSDecoder(___,Name,Value) は、前の構文の入力引数に加えて、名前と値の引数を 1 つ以上使用してオプションを指定します。たとえば、comm.RSDecoder(BitInput="true") は、ビットから成る入力列ベクトルを復号化するように構成された RS 復号化器オブジェクトを作成します。

プロパティ

すべて展開する

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

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

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

ビットを入力するオプション。logical の 0 (false) または 1 (true) として指定します。

  • このプロパティを false に設定した場合、入力 X は、長さが (CodewordLength – Npunctures) の整数倍に等しい整数列ベクトルでなければなりません。復号化されたデータ出力 Y は、長さが MessageLength の整数倍である整数列ベクトルになります。入力コードワードと出力メッセージを構成する各シンボルは、範囲 [0, (2M – 1)] の整数です。この整数は、有限ガロア体 gf(2M) の要素に対応します。

    • ErasuresInputPorttrue に設定し、BitInputfalse に設定した場合、消去入力 erasures の長さは、符号化されたデータの入力ベクトル X に等しくなければなりません。erasures ベクトルの 1 の値は、入力コードワードにおいてそれと同じ位置にある消去されたシンボルに対応し、0 の値は消去されていないシンボルに対応します。

  • このプロパティを true に設定した場合、入力 X は、長さが (CodewordLength – Npunctures)×M の整数倍に等しいビット列ベクトルでなければなりません。入力 X のデータ型には、数値、logical、または語長 1 の符号なし固定小数点数 (fi (Fixed-Point Designer) オブジェクト) を指定できます。復号化された出力 Y は、長さが MessageLength×M の整数倍に等しいビット列ベクトルになります。M ビットのグループは、範囲 [0, (2M – 1)] の整数を表します。この整数は、有限ガロア体 gf(2M) の要素に対応します。

    • ErasuresInputPorttrue に設定し、BitInputtrue に設定した場合、消去入力 erasures の長さは、符号化されたデータの入力ベクトル X の長さの 1/M 倍に等しくなければなりません。erasures ベクトルの 1 の値は消去されたシンボルに対応し、0 の値は消去されていないシンボルに対応します。この場合、シンボルは M 個のビットに対応します。

Npunctures はパンクチャの数です。パンクチャの数は、PuncturePatternSource プロパティおよび PuncturePattern プロパティで指定します。M は、PrimitivePolynomialSource プロパティおよび PrimitivePolynomial プロパティで指定する原始多項式の次数です。

データ型: logical

RS 符号のコードワード長

シンボル内の RS 符号のコードワード長。正の整数として指定します。

  • PrimitivePolynomialSource"Auto" に設定した場合、CodewordLength は (3, 216 – 1] の範囲内でなければなりません。

  • PrimitivePolynomialSource"Property" に設定した場合、CodewordLength は [3, 2M – 1] の範囲内でなければなりません。ここで、M は、PrimitivePolynomialSource および PrimitivePolynomial で指定する原始多項式の次数です。M は [3, 16] の範囲内でなければなりません。差 (CodewordLengthMessageLength) は偶数でなければなりません。

フルレングスの RS 符号の場合、CodewordLength は (2M – 1) でなければなりません。CodewordLength が (2M – 1) 未満の場合、オブジェクトは短縮された RS 符号を仮定します。

シンボル内のメッセージ長。正の整数として指定します。

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

  • このプロパティを "Auto" に設定した場合、CodewordLength および MessageLength を使用して短縮を指定します。このオブジェクトは、CodewordLengthMessageLengthGeneratorPolynomial、および PrimitivePolynomial プロパティに基づいて RS 符号を定義します。

  • このプロパティを "Property" に設定すると、オブジェクトは ShortMessageLength を使用します。

シンボル内の短縮メッセージ長。正の整数として指定します。この値は MessageLength 以下でなければなりません。ShortMessageLength < MessageLength の場合、オブジェクトは RS 符号を短縮します。

依存関係

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

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

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

    • PrimitivePolynomialSource"Auto" に設定した場合、オブジェクトは生成多項式を rsgenpoly(CodewordLength + SL, MessageLength + SL) として計算します。

    • PrimitivePolynomialSource"Property" に設定した場合、オブジェクトは生成多項式を rsgenpoly(CodewordLength + SL,MessageLength + SL, PrimitivePolynomial) として計算します。

    • どちらの場合も、SL = (2M – 1) – CodewordLength は短縮長で、M は PrimitivePolynomialSource および PrimitivePolynomial で指定する原始多項式の次数です。

  • このプロパティを "Property" に設定すると、オブジェクトは GeneratorPolynomial を使用して生成多項式を定義します。

生成多項式。多項式の string、整数の行ベクトル、またはガロア体の行ベクトルとして指定します。生成多項式の長さは (CodewordLengthMessageLength + 1) でなければなりません。

ガロア体の行ベクトルのエントリは、[0, 2M – 1] の範囲内でなければならず、生成多項式を降べきの順に表していなければなりません。各係数は、整数形式で表されたガロア体の要素 gf(2M) でなければなりません。

既定の設定は rsgenpoly(7,3,[],[],'double') の結果であり、[1 3 1 2 3] に対応します。

依存関係

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

生成多項式をチェックするオプション。logical の 1 (true) または 0 (false) として指定します。GeneratorPolynomial で指定した生成多項式で XN + 1 を割り切れるかどうかを確認するには、このプロパティを true に設定します。N は CodewordLength です。

有効な生成多項式は (X – αB)×(X – α(B + 1))×...×(X – α(B + N – K – 1)) で表されます。ここで、α は原始多項式の根、B は整数、N は CodewordLength、K は MessageLength です。B の値が 1 の場合、このプロパティを false に設定できます。B の詳細については、rsgenpoly を参照してください。

ヒント

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

依存関係

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

データ型: logical

原始多項式のソース。"Auto" または "Property" として指定します。

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

  • このプロパティを "Property" に設定すると、オブジェクトは PrimitivePolynomial を使用して原始多項式を定義します。

原始多項式。メッセージおよびコードワードを形成する整数に対応する降べきの順の有限体 gf(2M) を定義するバイナリ行ベクトルとして指定します。

多項式は次のオプションのいずれかとして表現します。

  • 定数項が 1 の多項式の文字ベクトルまたは string スカラー。詳細については、Communications Toolbox での多項式の表現を参照してください。

  • バイナリ値行ベクトル。降べきの順に並べた多項式の係数を表します。このベクトルの長さは M + 1 でなければなりません。ここで M は多項式の次数です。最初と最後のエントリは 1 でなければなりません。これは、次数 M の最初の項と、定数項 1 を示します。

  • 整数値の行ベクトル。降べきの順に並べた多項式の非ゼロの項の指数を表す要素からなります。最後のエントリは 0 でなければなりません。これは定数項 1 を示します。

既定の設定は int2bit(primpoly(3),4)' の結果で、これは [1 0 1 1] または多項式 x3 + x + 1 です。

依存関係

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

パンクチャ パターンのソース。"None" または "Property" として指定します。

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

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

パンクチャ パターン。長さが (N – K) のバイナリ列ベクトルとして指定します。ここで、N は CodewordLength、K は MessageLength です。パンクチャ パターン ベクトルのゼロは、パンクチャされる、つまり各コードワードから除外されるパリティ シンボルの位置を示します。

依存関係

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

消去入力を有効にするオプション。logical の 0 (false) または 1 (true) として指定します。

このプロパティを true に設定した場合、オブジェクトの実行時に erasures ベクトル入力を指定しなければなりません。消去ベクトルの長さについては、BCH System object と RS System object の入出力信号長で説明しています。

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

データ型: logical

訂正された誤り数を出力するオプション。logical の 1 (true) または 0 (false) として指定します。

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

データ型: logical

出力データ型。"Same as input""double"、または "logical" として指定します。

依存関係

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

使用法

説明

Y = dec(X) は、(CodewordLength,MessageLength) RS 復号化器を使用して、符号化された入力データを復号化します。この構文は、NumCorrectedErrorsOutputPortfalse に設定した場合に適用されます。オブジェクトを実行する際の入力および出力の長さについては、BCH System object と RS System object の入出力信号長を参照してください。

Y = dec(X,erasures) は、erasures 入力ベクトルを使用して、X 内の入力コードワードのシンボルを消去します。この構文は、ErasuresInputPorttrue に設定した場合に適用されます。

[Y,err] = dec(___) は、前述のいずれかの構文からの入力を使用して復号化し、RS 復号化された出力ベクトル Y と出力ベクトルで訂正されたシンボルの数 err を返します。誤り出力ベクトルの i 番目の要素の -1 の値は、そのコードワードで発生した復号化の誤りを示します。この構文は、NumCorrectedErrorsOutputPorttrue に設定した場合に適用されます。

入力引数

すべて展開する

入力コードワード。列ベクトルとして指定します。オブジェクトを実行する際の入力および出力の長さについては、BCH System object と RS System object の入出力信号長を参照してください。

データ型: double | single | logical | int8 | int16 | int32 | uint8 | uint16 | uint32 | fi object

入力コードワードから消去するシンボル。バイナリ列入力ベクトルとして指定します。erasures ベクトルの 1 の値は消去されたシンボルに対応し、0 の値は消去されていないシンボルに対応します。

データ型: double | logical

出力引数

すべて展開する

RS 復号化されたデータ。列ベクトルとして返されます。出力ベクトルの長さとデータ型は、BitInput および OutputDataType によって異なります。

入力コードワードを復号化する際に訂正されたシンボルの数。整数として返されます。

  • 非負の値は、現在の入力コードワードで訂正された誤りの数を示します。

  • -1 の値は、そのコードワードで復号化の誤りが発生したことを示します。入力コードワードに RS 符号の誤り訂正能力を超える誤りがあると、復号化の誤りが発生します。

データ型: double

オブジェクト関数

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

release(obj)

すべて展開する

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

すべて折りたたむ

RS 符号化され、8-DPSK 変調されたシンボル ストリームを AWGN チャネル経由で送信します。チャネル フィルター処理を行った後、受信信号を復調して復号化し、誤りをカウントします。

M = 8;
rsEnc = comm.RSEncoder;
rsDec = comm.RSDecoder;
errorRate = comm.ErrorRate(ComputationDelay=3);

for counter = 1:20
    data = randi([0 7], 30, 1);
    encodedData = rsEnc(data);
    modSignal = dpskmod(encodedData,M);
    receivedSignal = awgn(modSignal,10);
    demodSignal = dpskdemod(receivedSignal,M);
    receivedSymbols = rsDec(demodSignal);
    errorStats = errorRate(data,receivedSymbols);
end

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

リード・ソロモン符号化したデータを、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 ビットのいずれかに達するまで実行されます。シミュレーション ループでは、ランダム データを符号化および変調し、AWGN チャネル経由で信号をフィルター処理し、信号を復調および復号化した後、誤り統計を計算します。

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 with xlabel Eb/No (dB), ylabel BER contains 4 objects of type line. One or more of the lines displays its values using only markers 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;
bps = log2(M);

AWGN チャネル System object とエラー レート System object を作成します。

awgnChan = comm.AWGNChannel( ...
    NoiseMethod='Signal to noise ratio (Eb/No)', ...
    EbNo=15, ...
    BitsPerSymbol=bps);
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*bps,1);
    encodedData = enc(bit2int(data,bps));
    modSignal = qammod(encodedData,M,UnitAveragePower=true);
    rxSignal = awgnChan(modSignal);
    demodSignal = qamdemod(rxSignal,M,UnitAveragePower=true);
    rxBits = dec(demodSignal);
    dataOut = int2bit(rxBits,bps);
    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 = 1514

この例では、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 System object およびcomm.ErrorRate System object を構成します。また、この補助関数は、未符号化時の Eb/N0 比 (EbNoUncoded) を 15 dB に設定し、誤りが 500 個発生するか最大 5×106 ビットが送信された時点でシミュレーションを停止するように停止条件を設定します。

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.RSDecoder オブジェクトの構成と一致する comm.RSEncoder 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 は (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 と符号化時の BER を計算する場合は、整数をビットに変換します。

    chanErrorStats(:,1) = ...
        chanBERCalc(int2bit(encData,log2(M)), ...
            int2bit(demodData,log2(M)));
    codedErrorStats(:,1) = ...
        codedBERCalc(int2bit(data,log2(M)), ...
            int2bit(estData,log2(M)));
end

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

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

一連の Eb/N0 の値についてシミュレーションを実行するには、前述の処理ループを for ループで囲みます。未符号化時の Eb/N0 の値の範囲を 4:15 dB とし、目標誤り数を 5000、最大送信回数を 50×106 としてシミュレーションを実行した場合、次の図の結果を見ると、符号化率の分だけ Eb/N0 が低下するため、チャネルの BER は理論上の 64-QAM の BER より悪化していることがわかります。

補助関数

この例では、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 System object およびcomm.ErrorRate System object を構成します。また、この補助関数は、未符号化時の Eb/N0 比 (EbNoUncoded) を 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.RSDecoder オブジェクトの構成と一致する comm.RSEncoder 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 比の値は、これらのパンクチャを考慮して調整しなければなりません。この例では、出力シンボルの数は (NnumPuncs) であり、未符号化時の 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 と符号化時の BER を計算する場合は、整数をビットに変換します。

    chanErrorStats(:,1) = ...
        chanBERCalc(int2bit(encData,log2(M)), ...
            int2bit(demodData,log2(M)));
    codedErrorStats(:,1) = ...
        codedBERCalc(int2bit(data,log2(M)), ...
            int2bit(estData,log2(M)));
end

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

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

一連の Eb/N0 の値についてシミュレーションを実行するには、前述の処理ループを for ループで囲みます。未符号化時の 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 個の誤りだけしか訂正できなくなるためです。

補助関数

この例では、(63,53) 符号を (28,18) 符号に短縮するリード・ソロモン (RS) ブロック符号化を行う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 System object および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 System object はそのコードが (31,21) 符号から短縮されると仮定します (2log2(28+1)-1=31 であるため)。

整数シンボルを入出力し、(63,53) 符号から短縮された (28,18) 符号でブロック符号化を実行するように、comm.RSEncoder System object および comm.RSDecoder System object のペアを作成します。1 つの消去入力と 2 つのパンクチャを受け入れるように復号化器を設定します。64-QAM 復調器の出力における各コードワードに対して、受信機は補助関数 helperRSCodingGetErasures.m を使用して最も信頼性の低いシンボルを 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, ...
    PuncturePatternSource="Property", ...
    PuncturePattern = [ones(N-K-numPuncs,1); zeros(numPuncs,1)]);
rsDecoder = comm.RSDecoder(N,K, ...
    BitInput=false, ...
    ErasuresInputPort=true, ...
    PuncturePatternSource="Property", ...
    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 = ...
    int2bit(primpoly(primPolyDegree,'nodisplay'),7)';

rsDecoder.PrimitivePolynomialSource = 'Property';
rsDecoder.PrimitivePolynomial = ...
    int2bit(primpoly(primPolyDegree,'nodisplay'),7)';

ストリーム処理ループ

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

AWGN チャネルを通る信号は符号化された信号であるため、未符号化時の Eb/N0 の値を符号化器出力におけるエネルギー比に対応するよう変換しなければなりません。この比は符号化された Eb/N0 比です。K 個のシンボルを符号化器に入力し、N 個の出力シンボルを得る場合、このエネルギー関係は K/N の比率で与えられます。RS 符号化器によって生成されたコードワードの長さは、パンクチャ パターン ベクトルで指定されたパンクチャ数だけ短縮されて減少するため、符号化時の Eb/N0 比の値は、短縮符号とパンクチャを考慮して調整しなければなりません。この例では、出力シンボルの数は (NnumPuncsS) であり、未符号化時の 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] の範囲の (KS) 個のシンボルが含まれます。

    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 と符号化時の BER を計算する場合は、整数をビットに変換します。

    chanErrorStats(:,1) = ...
        chanBERCalc(int2bit(encData,log2(M)), ...
            int2bit(demodData,log2(M)));
    codedErrorStats(:,1) = ...
        codedBERCalc(int2bit(data,log2(M)), ...
            int2bit(estData,log2(M)));
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

一連の Eb/N0 の値についてシミュレーションを実行するには、前述の処理ループを for ループで囲みます。未符号化時の 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 値が低い場合に最も顕著になります。

補助関数

アルゴリズム

すべて展開する

このオブジェクトは、[1]およびBCH と RS の誤りのみの復号化のアルゴリズムで説明されているリード・ソロモン (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 で導入

参考

オブジェクト

関数