Main Content

comm.HDLRSEncoder

リード・ソロモン符号化器を使用したメッセージの符号化

説明

HDL 最適化 HDLRSEncoder System object™ は、指定したメッセージ長とコードワード長でリード・ソロモン (RS) 符号を作成します。

リード・ソロモン符号を使用したメッセージを符号化するには、以下を行います。

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

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

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

作成

説明

RSEnc = comm.HDLRSEncoder は、HDL に対してストリーミング方式でリード・ソロモン符号化を実行する、HDL 最適化ブロック符号化器 System object、RSEnc を作成します。

RSEnc = comm.HDLRSEncoder(Name,Value) は、1 つ以上の名前と値のペアを使用してプロパティを設定します。各プロパティ名を一重引用符で囲みます。次に例を示します。

comm.HDLRSEncoder('BSource','Property','B',2) 
は原始多項式の根の 2 つの開始累乗を設定します。

RSEnc = comm.HDLRSEncoder(N,K,Name,Value) は、CodewordLength プロパティを N に、MessageLength プロパティを K に設定し、指定の他のプロパティ名は指定の値に設定しています。

プロパティ

すべて展開する

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

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

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

原始多項式の根の開始累乗。正の整数で指定します。

依存関係

BSource'Property' に設定する場合、オブジェクトはこの値を使用します。

原始多項式の根の開始累乗のソース。'Property' または 'Auto' のいずれかで指定します。'Auto' を設定すると、オブジェクトは B = 1 を使用します。

RS コードワードのシンボル数 N。正の整数で指定します。この値は 2M-1 に丸められます。M は、原始多項式の次数です。PrimitivePolynomialSource および PrimitivePolynomial プロパティによって指定されます。差 (CodewordLengthMessageLength) は偶数の整数でなければなりません。

このプロパティの値が 2M–1 未満の場合、オブジェクトは短縮された RS 符号とみなされます。

PrimitivePolynomialSource'Auto' に設定した場合、CodewordLength は 3 < CodewordLength ≤ 216 –1 の範囲内でなければなりません。

PrimitivePolynomialSource'Property' に設定した場合、CodewordLength は、3 ≤ CodewordLength ≤ 2M– 1 の間の値でなければなりません。M は 3 ≤ M ≤ 16 の間の値でなければなりません。

メッセージの長さ K。正の整数で指定します。差 (CodewordLengthMessageLength) は偶数の整数でなければなりません。

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

  • このプロパティを 'Auto' に設定すると、オブジェクトは次数 M = ceil(log2(CodewordLength+1)) の原始多項式を使用します。これは、int2bit(primpoly(M),bpi)' の結果です。ここで、bpi は整数あたりのビット数です。

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

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

依存関係

PrimitivePolynomialSource'Property' に設定する場合、オブジェクトはこの値を使用します。

パンクチャ パターンのソース。'None' または 'Property' のいずれかで指定します。このプロパティを 'None' に設定すると、オブジェクトはコードにパンクチャを適用しません。このプロパティを 'Property' に設定すると、オブジェクトは PuncturePattern プロパティで指定したパンクチャ パターン ベクトルに基づいてコードをパンクチャします。

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

依存関係

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

使用法

説明

[Y,startOut,endOut,validOut] = RSEnc(X,startIn,endIn,validIn) は、1 つの入力メッセージ シンボル X を符号化し、符号化されたデータの 1 つのシンボル Y を返します。start 信号と end 信号はメッセージ フレーム境界を示します。オブジェクトは各メッセージ フレームの最後で関連するパリティ シンボルを返します。

入力引数

すべて展開する

入力メッセージ データ。一度に 1 つのシンボルで、符号なし整数または 2 進小数点スケーリングの fi() で指定します。各シンボルの語長は、ceil(log2(CodewordLength+1)) でなければなりません。

double 型は、シミュレーションでは許可されますが、HDL コード生成ではサポートされません。

データ型: double | uint8 | uint16 | uint32 | fi

入力データ フレームの先頭。logical スカラーで指定します。

データ型: logical

入力データ フレームの末尾。logical スカラーで指定します。

データ型: logical

入力データの有効性。logical スカラーで指定します。

データ型: logical

出力引数

すべて展開する

メッセージ データとパリティ シンボル。入力メッセージ X と同じデータ型をもつ整数として一度に 1 つのシンボルを返します。

データ型: double | uint8 | uint16 | uint32 | fi

出力データ フレームの先頭。logical スカラーとして返されます。

データ型: logical

出力データ フレームの末尾。logical スカラーとして返されます。

データ型: logical

出力データの有効性。logical スカラーとして返されます。

データ型: logical

オブジェクト関数

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

release(obj)

すべて展開する

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

すべて折りたたむ

リード・ソロモン符号化器と復号化器 System object を使用して信号を符号化および復号化します。この例では、HDL コード生成の関数に各オブジェクトを含める方法を説明します。

符号化するランダムなメッセージを作成します。オブジェクトの短縮符号をサポートする方法を表示するために、このメッセージはコードワード長より短くなっています。チェン サーチを含む復号化器のレイテンシに対応するように、メッセージにゼロを付加します。

messageLength = 188;
dataIn = [randi([0,255],1,messageLength,'uint8') zeros(1,1024-messageLength)];

符号が RS(255,239) の HDLRSEncoder System object™ を作成して呼び出す関数を記述します。この符号は IEEE® 802.16 Broadband Wireless Access 規格で使用されます。B は原始多項式の根の開始累乗です。この関数から HDL を生成できます。

function  [dataOut,startOut,endOut,validOut] = HDLRSEnc80216(dataIn,startIn,endIn,validIn)
%HDLRSEnc80216 
% Processes one sample of data using the comm.HDLRSEncoder System object(TM)
% dataIn is a uint8 scalar, representing 8 bits of binary data. 
% startIn, endIn, and validIn are logical scalar values.
% You can generate HDL code from this function.

  persistent rsEnc80216;
  if isempty(rsEnc80216)
    rsEnc80216 = comm.HDLRSEncoder(255,239,'BSource','Property','B',0)
  end    
  [dataOut,startOut,endOut,validOut] = rsEnc80216(dataIn,startIn,endIn,validIn);
end

% Copyright 2019-2022 The MathWorks, Inc.

関数を呼び出して、メッセージを符号化します。

for ii = 1:1024
    messageStart = (ii==1);
    messageEnd = (ii==messageLength);
    validIn = (ii<=messageLength);
    [encOut(ii),startOut(ii),endOut(ii),validOut(ii)] = ...
        HDLRSEnc80216(dataIn(ii),messageStart,messageEnd,validIn);
end
rsEnc80216 = 

  comm.HDLRSEncoder with properties:

               CodewordLength: 255
                MessageLength: 239
    PrimitivePolynomialSource: 'Auto'
        PuncturePatternSource: 'None'
                      BSource: 'Property'
                            B: 0

符号化されたメッセージのランダムな位置に誤りを投入します。リード・ソロモンは、各 N シンボルの (N-K)/2 までの誤りを訂正できます。したがって、この例の誤り訂正能力は (255 – 239)/2=8 シンボルです。

numErrors = 8;
loc = randperm(messageLength,numErrors);
% encOut is qualified by validOut, use an offset for injecting errors
vi = find(validOut==true,1);
for i = 1:numErrors
   idx = loc(i)+vi;
   symbol = encOut(idx);
   encOut(idx) = randi([0 255],'uint8');
   fprintf('Symbol(%d): was 0x%x, now 0x%x\n',loc(i),symbol,encOut(idx))
end
Symbol(147): was 0x1f, now 0x82
Symbol(16): was 0x6b, now 0x82
Symbol(173): was 0x3, now 0xd1
Symbol(144): was 0x66, now 0xcb
Symbol(90): was 0x13, now 0xa4
Symbol(80): was 0x5a, now 0x60
Symbol(82): was 0x95, now 0xcf
Symbol(56): was 0xf5, now 0x88

HDLRSDecoder System object™ を作成および呼び出す関数を記述します。このオブジェクトの符号と多項式は符号化器と同じでなければなりません。この関数から HDL を生成できます。

function  [dataOut,startOut,endOut,validOut,err] = HDLRSDec80216(dataIn,startIn,endIn,validIn)
%HDLRSDec80216 
% Processes one sample of data using the comm.HDLRSDecoder System object(TM)
% dataIn is a uint8 scalar, representing 8 bits of binary data. 
% startIn, endIn, and validIn are logical scalar values.
% You can generate HDL code from this function.

  persistent rsDec80216;
  if isempty(rsDec80216)
    rsDec80216 = comm.HDLRSDecoder(255,239,'BSource','Property','B',0)
  end    
  [dataOut,startOut,endOut,validOut,err] = rsDec80216(dataIn,startIn,endIn,validIn);
end

% Copyright 2019-2022 The MathWorks, Inc.

関数を呼び出して、符号化されたメッセージ内の誤りを検出します。

for ii = 1:1024
 [decOut(ii),decStartOut(ii),decEndOut(ii),decValidOut(ii),decErrOut(ii)] = ...
     HDLRSDec80216(encOut(ii),startOut(ii),endOut(ii),validOut(ii));
end
rsDec80216 = 

  comm.HDLRSDecoder with properties:

               CodewordLength: 255
                MessageLength: 239
    PrimitivePolynomialSource: 'Auto'
                      BSource: 'Property'
                            B: 0
          NumErrorsOutputPort: false

有効な復号化器出力を選択して、復号化されたシンボルを元のメッセージと比較します。

decOut = decOut(decValidOut==1);
originalMessage = dataIn(1:messageLength);
if all(originalMessage==decOut)
    fprintf('All %d message symbols were correctly decoded.\n',messageLength)
else
   for jj = 1:messageLength
      if dataIn(jj)~=decOut(jj)
        fprintf('Error in decoded symbol(%d). Original 0x%x, Decoded 0x%x.\n',jj,dataIn(jj),decOut(jj))
      end
   end
end
All 188 message symbols were correctly decoded.

拡張機能

バージョン履歴

R2012b で導入