Main Content

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

comm.CRCGenerator

CRC 符号ビットの生成と入力データへの付加

説明

comm.CRCGenerator System object™ は入力フレームごとに巡回冗長検査 (CRC) 符号ビットを生成し、それらをフレームに付加します。詳細については、CRC 発生器の動作を参照してください。

入力フレームごとに CRC 符号ビットを生成し、それらをフレームに付加するには、以下の手順に従います。

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

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

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

作成

説明

crcgenerator = comm.CRCGenerator は CRC 符号発生器 System object を作成します。このオブジェクトは、指定された生成多項式に従って CRC ビットを生成し、それらを入力フレームに付加します。

crcgenerator = comm.CRCGenerator(Name,Value) は、1 つ以上の名前と値のペアを使用してプロパティを設定します。たとえば、comm.CRCGenerator('Polynomial','z^16 + z^14 + z + 1') は CRC 発生器 System object を構成し、CRC-16 巡回冗長検査ビットを入力フレームに付加します。各プロパティ名を引用符で囲みます。

crcgenerator = comm.CRCGenerator(poly,Name,Value) は CRC 符号発生器 System object を作成します。このオブジェクトは、Polynomial プロパティを poly に設定し、指定の他のプロパティは指定の値に設定しています。

プロパティ

すべて展開する

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

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

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

CRC アルゴリズムの生成多項式。次のいずれかとして指定します。

  • 'z^3 + z^2 + 1' などの多項式の文字ベクトル。

  • バイナリ行ベクトル。降べきの順に並べた生成多項式の係数を表します。このベクトルの長さは (N+1) です。ここで N は生成多項式の次数です。たとえば、[1 1 0 1] は、多項式 z3+ z2+ 1 を表します。

  • 多項式の非ゼロの項の z の指数を降べきの順に含む整数行ベクトル。たとえば、[3 2 0] は、多項式 z3 + z2 + 1 を表します。

詳細については、Communications Toolbox での多項式の表現を参照してください。

最もよく使用される生成多項式には、次のものがあります。

CRC メソッド生成多項式
CRC-32'z^32 + z^26 + z^23 + z^22 + z^16 + z^12 + z^11 + z^10 + z^8 + z^7 + z^5 + z^4 + z^2 + z + 1'
CRC-24 'z^24 + z^23 + z^14 + z^12 + z^8 + 1'
CRC-16 'z^16 + z^15 + z^2 + 1'
反転 CRC-16'z^16 + z^14 + z + 1'
CRC-8'z^8 + z^7 + z^6 + z^4 + z^2 + 1'
CRC-4 'z^4 + z^3 + z^2 + z + 1'

例: 'z^7 + z^2 + 1'[1 0 0 0 0 1 0 1]、および [7 2 0] は同一の多項式 p(z) = z 7 + z 2 + 1 を表します。

データ型: double | char

内部シフト レジスタの初期状態。バイナリ スカラー、または生成多項式の次数に等しい長さをもつバイナリ行ベクトルとして指定します。スカラー値は、生成多項式の次数に等しい長さの行ベクトルに拡張されます。

データ型: logical

CRC チェックサムの計算での直接アルゴリズムの使用。false または true を指定します。

このプロパティを true に設定すると、CRC チェックサムの計算に直接アルゴリズムが使用されます。このプロパティを false に設定すると、CRC チェックサムの計算に非直接アルゴリズムが使用されます。

直接アルゴリズムと非直接アルゴリズムの詳細については、誤りの検出と訂正を参照してください。

データ型: logical

入力バイトを反転する。false または true を指定します。このプロパティを true に設定すると、シフト レジスタに入力される前に入力フレームがバイト単位で反転されます。

このプロパティを true に設定する場合、入力フレーム長を ChecksumsPerFrame プロパティの値で除算した結果が整数で 8 の倍数でなければなりません。

データ型: logical

最終の XOR の前にチェックサムを反転する。false または true を指定します。このプロパティを true に設定すると、入力データがシフト レジスタを完全に通過した後に CRC チェックサムが 180° 反転されます。

データ型: logical

Final XOR。バイナリ スカラー、または生成多項式の次数に等しい長さをもつバイナリ行ベクトルとして指定します。FinalXOR プロパティの値と CRC チェックサムを使用して XOR 演算が実行されてから、入力チェックサムとの比較が実行されます。スカラー値は、生成多項式の次数に等しい長さの行ベクトルに拡張されます。0 に設定すると、XOR 演算を実行しないことと等価になります。

データ型: logical

各フレームで計算されるチェックサムの数。正の整数として指定します。詳細については、CRC 発生器の動作を参照してください。

データ型: double

使用法

説明

codeword = crcgenerator(x) は、入力フレームごとに CRC 符号ビットを生成し、それらをフレームに付加します。

入力引数

すべて展開する

入力信号。バイナリ列ベクトルとして指定します。入力フレームの長さは ChecksumsPerFrame プロパティの値の倍数でなければなりません。入力データ型が double の場合は、最下位ビットがバイナリ値として使用されます。詳細については、CRC 発生器の動作を参照してください。

データ型: double | logical

出力引数

すべて展開する

出力コードワード フレーム。入力信号のデータ型を継承するバイナリ列ベクトルとして返されます。出力には、CRC 符号シーケンス ビットが付加された入力フレームが含まれています。

出力コードワード フレームの長さは m + k * r です。ここで、m は入力メッセージのサイズ、k は入力フレームあたりのチェックサムの数、r は生成多項式の次数です。詳細については、CRC 発生器の動作を参照してください。

オブジェクト関数

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

release(obj)

すべて展開する

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

すべて折りたたむ

802.11™-2016[1]、節 21.3.10.3 に示されている例の CRC-8 チェックサムを生成し、期待される CRC と比較します。

CRC 発生器 System object™ を作成します。802.11-20016 の CRC 計算に一致させるため、System object は、生成多項式を z8+z2+z+1、初期状態を 1、最終の XOR を 1 に設定し、直接法を有効にします。

crc8 = comm.CRCGenerator('Polynomial','z^8 + z^2 + z + 1', ...
    'InitialConditions',1,'DirectMethod',true,'FinalXOR',1)
crc8 = 
  comm.CRCGenerator with properties:

           Polynomial: 'z^8 + z^2 + z + 1'
    InitialConditions: 1
         DirectMethod: true
    ReflectInputBytes: false
     ReflectChecksums: false
             FinalXOR: 1
    ChecksumsPerFrame: 1

802.11-2016 規格の節 21.3.10.3 にある例に従って 1 つの入力フレームを処理します。この例では、入力ビット ストリーム {m0, ... m22} は {1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1} で、期待される CRC チェックサム {c7, ... c0} は {0 0 0 1 1 1 0 0} です。

x = [1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1]';
expectedChecksum = [0 0 0 1 1 1 0 0]';
checksumLength = length(expectedChecksum);

生成された CRC チェックサムを期待されるチェックサムと比較します。

codeword = crc8(x);
checksum = codeword(end-checksumLength+1:end);
isequal(checksum,expectedChecksum)
ans = logical
   1

参考文献

[1] IEEE® Std 802.11™-2016 IEEE Standard for Information Technology—Local and Metropolitan Area Networks—Specific Requirements Part 11: Wireless LAN MAC and PHY Specifications.

バイナリ データを CRC 発生器を通して渡し、ビット誤りを発生させてから、CRC 検出器を使用して誤りを検出します。

ランダムなバイナリ ベクトルを作成します。

x = randi([0 1],12,1);

ChecksumsPerFrame プロパティを 2 に設定した CRC 発生器を使用して、入力メッセージ フレームを符号化します。これにより、受信フレームが同じ長さの 2 つのサブフレームに分割されます。

crcgenerator = comm.CRCGenerator([1 0 0 1],'ChecksumsPerFrame',2);
codeword = crcgenerator(x);

コードワードを復号化して、いずれのサブフレームにも誤りがないことを確認します。

crcdetector = comm.CRCDetector([1 0 0 1],'ChecksumsPerFrame',2);
[~, err] = crcdetector(codeword)
err = 2×1

     0
     0

サブフレーム 2 の最後の要素を反転させることで、2 番目のサブフレームに誤りを発生させます。誤りを含むコードワードを CRC 検出器を通して渡し、2 番目のサブフレームの誤りが検出されるかを検証します。

codeword(end) = not(codeword(end));
[~,err] = crcdetector(codeword)
err = 2×1

     0
     1

CRC 符号を使用して、ノイズを含む BPSK 信号のフレーム誤りを検出します。

標準 CRC-4 多項式 z4+z3+z2+z+1 を使用して、CRC 発生器と CRC 検出器のペアを作成します。

poly = 'z4+z3+z2+z+1';
crcgenerator = comm.CRCGenerator(poly);
crcdetector = comm.CRCDetector(poly);

12 ビット フレームのバイナリ データを生成し、CRC ビットを追加します。多項式の次数に基づき、各フレームに 4 ビットが追加されます。BPSK 変調を適用し、AWGN チャネルを通して信号を渡します。復調を行い、CRC 検出器を使用してフレームに誤りが発生しているかどうかを判断します。

numFrames = 20;
frmError = zeros(numFrames,1);

for k = 1:numFrames
    data = randi([0 1],12,1);                 % Generate binary data
    encData = crcgenerator(data);                   % Append CRC bits
    modData = pskmod(encData,2);              % BPSK modulate
    rxSig = awgn(modData,5);                  % AWGN channel, SNR = 5 dB
    demodData = pskdemod(rxSig,2);            % BPSK demodulate
    [~,frmError(k)] = crcdetector(demodData); % Detect CRC errors
end

CRC 符号のビット誤りが検出されたフレームを特定します。

find(frmError)
ans =

  0x1 empty double column vector

ITU-T Recommendation X-25[1] の 2.2.7.4 節で説明されているように、付録 I、I.1 の例 2 の入力データと期待されるフレーム チェック シーケンス (FCS) を使用して CRC-16-CCITT 発生器を作成します。

アドレス = B および F = 1 として、番号なしの肯定応答 (UA) の応答フレームを作成します。

Address = [1 0 0 0 0 0 0 0];
UA = [1 1 0 0 1 1 1 0];
input = [Address UA]';
expectedChecksum = [1 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0]'; % Expected FCS
checksumLength = 16;

crcGen = comm.CRCGenerator(...
    'Polynomial','X^16 + X^12 + X^5 + 1',...
    'InitialConditions',1,...
    'DirectMethod',true,...
    'FinalXOR',1);
crcSeq = crcGen(input);
checkSum =  crcSeq(end-checksumLength+1:end);

計算されたチェックサムを期待されるチェックサムと比較します。

isequal(expectedChecksum,checkSum)
ans = logical
   1

参考文献

[1] ITU Telecommunication Standardization Sector. Series X:Data Networks And Open System Communication.Public data networks – Interfaces. 1997

IEEE Standard for Ethernet [1] の 3.2.9 節の説明に従って、イーサネットのフレーム チェック シーケンス (FCS) フィールドの CRC-32 符号を作成します。

rng(1865);  % Seed for repeatable results

MAC フレームの保護されているフィールド、特に、宛先アドレス、ソース アドレス、長さフィールドまたはタイプ フィールド、MAC クライアント データ、およびパディングを表すため、ランダム データを使用してメッセージを初期化します。

data = randi([0,1],100,1);

イーサネット メッセージの符号化に使用する CRC-32 生成多項式を指定します。

poly = [32,26,23,22,16,12,11,10,8,7,5,4,2,1,0];

規格に指定されている手順に従い、CRC 符号を生成する非直接法を使用して、CRC を計算します。

% Section 3.2.9 step a) and b)
dataN = [not(data(1:32));data(33:end)];
crcGen1 = comm.CRCGenerator(...
    'Polynomial',poly, ...
    'InitialConditions',0, ...
    'DirectMethod',false, ...
    'FinalXOR',1);
% Section 3.2.9 step c), d) and e)
seq = crcGen1(dataN);
csNondirect = seq(end-31:end);

規格に指定されている手順に従い、CRC 符号を生成する直接法を使用して、CRC を計算します。

crcGen2 = comm.CRCGenerator( ...
    'Polynomial',poly, ...
    'InitialConditions',1, ...
    'DirectMethod',true, ...
    'FinalXOR',1);
txSeq = crcGen2(data);
csDirect = txSeq(end-31:end);

非直接法と直接法を使用して生成された CRC 符号を比較します。

disp([csNondirect';csDirect']);
     1     1     1     0     1     1     0     0     1     0     0     1     0     1     0     0     1     0     1     0     1     1     0     0     0     1     1     1     0     0     1     0
     1     1     1     0     1     1     0     0     1     0     0     1     0     1     0     0     1     0     1     0     1     1     0     0     0     1     1     1     0     0     1     0
isequal(csNondirect,csDirect)
ans = logical
   1

rng('default');  % Reset the random number generator

参考文献

[1] IEEE Computer Society. IEEE Standard for Ethernet:Std 802.3-2012.New York, NY:2012.

詳細

すべて展開する

参照

[1] Sklar, Bernard. Digital Communications: Fundamentals and Applications. Englewood Cliffs, N.J.: Prentice-Hall, 1988.

[2] Wicker, Stephen B. Error Control Systems for Digital Communication and Storage. Upper Saddle River, N.J.: Prentice Hall, 1995.

拡張機能