Main Content

comm.HDLRSDecoder

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

説明

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

メッセージ ベクトルをリード・ソロモン コードワード ベクトルから復元するには、以下を行います。

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

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

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

トラブルシューティング

  • 各入力フレームには、(N-K)*2 より多く、かつ N とまったく同じかそれより少ないシンボル数が含まれていなければなりません。オブジェクトは、startInendIn の間の有効データ サンプルの数が N 未満の場合に短縮符号を推測します。短縮符号でチェン サーチを実行するためにはさらに N サイクルを必要とします。入力メッセージが N シンボル未満の場合は、次のフレームを開始する前に少なくとも N - size の非アクティブ サイクルの保護間隔を取ります。ここで size はメッセージ長です。

  • 復号化器は、メッセージを一度に 4 つまで処理できます。最初のメッセージを完全に復号化する前に 5 番目のメッセージの開始を受け取った場合、オブジェクトは最初のメッセージからデータ サンプルを除外します。この問題を回避するには、入力メッセージ間の非アクティブ サイクルの数を増やします。

  • 生成多項式は明示的には指定されません。ただし、根の開始指数のコードワード長、メッセージ長および B の値によって定義されます。生成多項式から B の値を求めるために、関数 genpoly2b を使用します。

作成

説明

RSDec = comm.HDLRSDecoder は、リード・ソロモン復号化を実行する HDL 最適化 RS 復号化器の System object、RSDec を作成します。

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

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

RSDec = comm.HDLRSDecoder(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) は偶数の整数でなければなりません。

このプロパティが true に設定されている場合、オブジェクトは訂正された誤りの数を返します。errOuttrue の場合、訂正可能な誤りの数より多くの誤りがあったことになるので、訂正された誤りの数は有効ではありません。

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

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

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

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

依存関係

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

使用法

説明

[Y,startOut,endOut,validOut,errOut] = RSDec(X,startIn,endIn,validIn) は 1 つの符号化されたメッセージ シンボル X を復号化して、復号化されたシンボル Y を返します。start 信号と end 信号はメッセージ フレーム境界を示します。errOut1 (true) の場合、オブジェクトは入力フレームに修正不可能な誤りがあることを検出しています。

[Y,startOut,endOut,validOut,errOut,numErrors] = RSDec(X,startIn,endIn,validIn) は入力データを復号化し、さらに検出および修正された誤り数を返します。この構文を使用するには、NumErrorsOutputPort プロパティを true に設定します。errOut1 (true) の場合、オブジェクトは出力フレームに訂正不可能な誤りがあることを検出しており、numErrors は無効となります。

入力引数

すべて展開する

入力メッセージ データとパリティ シンボル。一度に 1 つのシンボルで、符号なし整数または 2 進小数点スケーリングの fi() で指定します。

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

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

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

データ型: logical

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

データ型: logical

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

データ型: logical

出力引数

すべて展開する

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

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

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

データ型: logical

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

データ型: logical

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

データ型: logical

出力データ フレームの訂正不可能な誤り。logical スカラーとして返されます。メッセージ フレームに訂正不可能な誤りが含まれる場合は、信号が 1 (true) になります。この場合、出力データ シンボルが破損します。この値は、endOut が 1 (true) の場合に有効です。

データ型: logical

検出および訂正された誤り数。整数として返されます。この値は、endOut が 1 (true) および errOut が 0 (false) の場合に有効です。

データ型: uint8

オブジェクト関数

オブジェクト関数を使用するには、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 で導入