このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
comm.CRCGenerator
CRC 符号ビットの生成と入力データへの付加
説明
comm.CRCGenerator
System object™ は入力フレームごとに巡回冗長検査 (CRC) 符号ビットを生成し、それらをフレームに付加します。詳細については、CRC 発生器の動作を参照してください。
入力フレームごとに CRC 符号ビットを生成し、それらをフレームに付加するには、以下の手順に従います。
comm.CRCGenerator
オブジェクトを作成し、そのプロパティを設定します。関数と同様に、引数を指定してオブジェクトを呼び出します。
System object の機能の詳細については、System object とは を参照してください。
作成
構文
説明
は CRC 符号発生器 System object を作成します。このオブジェクトは、指定された生成多項式に従って CRC ビットを生成し、それらを入力フレームに付加します。crcgenerator
= comm.CRCGenerator
は、1 つ以上の名前と値のペアを使用してプロパティを設定します。たとえば、crcgenerator
= comm.CRCGenerator(Name
,Value
)comm.CRCGenerator('Polynomial','z^16 + z^14 + z + 1')
は CRC 発生器 System object を構成し、CRC-16 巡回冗長検査ビットを入力フレームに付加します。各プロパティ名を引用符で囲みます。
は CRC 符号発生器 System object を作成します。このオブジェクトは、crcgenerator
= comm.CRCGenerator(poly,Name
,Value
)Polynomial
プロパティを poly
に設定し、指定の他のプロパティは指定の値に設定しています。
プロパティ
特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release
を使用します。
プロパティが "調整可能" の場合、その値をいつでも変更できます。
プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。
Polynomial
— 生成多項式
'z^16 + z^12 + z^5 + 1'
(既定値) | 多項式の文字ベクトル | バイナリ行ベクトル | 整数行ベクトル
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
InitialConditions
— 内部シフト レジスタの初期状態
0
(既定値) | 1
| バイナリ行ベクトル
内部シフト レジスタの初期状態。バイナリ スカラー、または生成多項式の次数に等しい長さをもつバイナリ行ベクトルとして指定します。スカラー値は、生成多項式の次数に等しい長さの行ベクトルに拡張されます。
データ型: logical
DirectMethod
— CRC チェックサムの計算での直接アルゴリズムの使用
false
(既定値) | true
CRC チェックサムの計算での直接アルゴリズムの使用。false
または true
を指定します。
このプロパティを true
に設定すると、CRC チェックサムの計算に直接アルゴリズムが使用されます。このプロパティを false
に設定すると、CRC チェックサムの計算に非直接アルゴリズムが使用されます。
直接アルゴリズムと非直接アルゴリズムの詳細については、誤りの検出と訂正を参照してください。
データ型: logical
ReflectInputBytes
— 入力バイトを反転する
false
(既定値) | true
入力バイトを反転する。false
または true
を指定します。このプロパティを true
に設定すると、シフト レジスタに入力される前に入力フレームがバイト単位で反転されます。
このプロパティを true
に設定する場合、入力フレーム長を ChecksumsPerFrame
プロパティの値で除算した結果が整数で 8
の倍数でなければなりません。
データ型: logical
ReflectChecksums
— 最終の XOR の前にチェックサムを反転する
false
(既定値) | true
最終の XOR の前にチェックサムを反転する。false
または true
を指定します。このプロパティを true
に設定すると、入力データがシフト レジスタを完全に通過した後に CRC チェックサムが 180° 反転されます。
データ型: logical
FinalXOR
— Final XOR
0 (既定値) | バイナリ スカラー | バイナリ ベクトル
Final XOR。バイナリ スカラー、または生成多項式の次数に等しい長さをもつバイナリ行ベクトルとして指定します。FinalXOR
プロパティの値と CRC チェックサムを使用して XOR 演算が実行されてから、入力チェックサムとの比較が実行されます。スカラー値は、生成多項式の次数に等しい長さの行ベクトルに拡張されます。0
に設定すると、XOR 演算を実行しないことと等価になります。
データ型: logical
ChecksumsPerFrame
— 各フレームで計算されるチェックサムの数
1 (既定値) | 正の整数
各フレームで計算されるチェックサムの数。正の整数として指定します。詳細については、CRC 発生器の動作を参照してください。
データ型: double
使用法
入力引数
x
— 入力信号
バイナリ列ベクトル
入力信号。バイナリ列ベクトルとして指定します。入力フレームの長さは ChecksumsPerFrame
プロパティの値の倍数でなければなりません。入力データ型が double の場合は、最下位ビットがバイナリ値として使用されます。詳細については、CRC 発生器の動作を参照してください。
データ型: double
| logical
出力引数
codeword
— 出力コードワード フレーム
バイナリ列ベクトル
出力コードワード フレーム。入力信号のデータ型を継承するバイナリ列ベクトルとして返されます。出力には、CRC 符号シーケンス ビットが付加された入力フレームが含まれています。
出力コードワード フレームの長さは m + k * r です。ここで、m は入力メッセージのサイズ、k は入力フレームあたりのチェックサムの数、r は生成多項式の次数です。詳細については、CRC 発生器の動作を参照してください。
オブジェクト関数
オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj
という名前の System object のシステム リソースを解放するには、次の構文を使用します。
release(obj)
例
CRC-8 チェックサムの生成
802.11™-2016[1]、節 21.3.10.3 に示されている例の CRC-8 チェックサムを生成し、期待される CRC と比較します。
CRC 発生器 System object™ を作成します。802.11-20016 の CRC 計算に一致させるため、System object は、生成多項式を 、初期状態を 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 発生器を通して渡し、ビット誤りを発生させてから、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
ノイズを含む BPSK データ フレームの巡回冗長検査
CRC 符号を使用して、ノイズを含む BPSK 信号のフレーム誤りを検出します。
標準 CRC-4 多項式 を使用して、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 = 6
X.25 の CRC-16-CCITT 発生器
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
イーサネットの CRC-32 発生器
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']);
Columns 1 through 13 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 0 1 0 Columns 14 through 26 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 Columns 27 through 32 1 1 0 0 1 0 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.
詳細
巡回冗長検査符号化
巡回冗長検査 (CRC) 符号化は、データ フレームが送信されるときに発生する誤りを検出するための誤り制御符号化手法です。ブロック符号や畳み込み符号とは異なり、CRC 符号には組み込みの誤り訂正能力がありません。代わりに、通信システムが受信コードワードに誤りを検出すると、受信側はコードワードを再送信するよう送信側に要求します。
CRC 符号化では、送信側で各データ フレームに規則が適用され、"チェックサム" または "シンドローム" という余分な CRC ビットが作成され、チェックサムがデータ フレームに追加されます。送信されたコードワードを受信した後、受信側は受信したコードワードに同じ規則を適用します。結果のチェックサムが 0 以外である場合、誤りが発生しているので、送信側はデータ フレームを再送信する必要があります。
フレームあたりのチェックサムの数が 1 より大きい場合、入力データ フレームがサブフレームに分割され、各データ サブフレームに規則が適用され、個々のチェックサムが各サブフレームに追加されます。サブフレームのコードワードが連結されて、1 つのフレームが出力されます。
サポートされている CRC アルゴリズムの詳細は、巡回冗長検査符号を参照してください。
CRC 発生器の動作
CRC 発生器は、指定された生成多項式とフレームあたりのチェックサムの数に従って、CRC チェックサムを入力フレームに追加します。
内部シフト レジスタが特定の初期状態にあり、入力フレームあたり k 個のチェックサムがある場合、次のようになります。
入力信号は等しいサイズの k 個のサブフレームに分割されます。
k 個の各サブフレームの前に、初期状態のベクトルが付加されます。
CRC アルゴリズムが各サブフレームに適用されます。
各サブフレームの終わりに結果のチェックサムが付加されます。
サブフレームが連結されて、1 つの列ベクトルとして出力されます。
次に示すシナリオでは、10 ビットのフレームが入力であり、3 次生成多項式で CRC チェックサムを計算します。また、初期状態は 0 で、フレームあたりのチェックサムの数は 2 です。
入力フレームはサイズ 5 の 2 つのサブフレームに分割され、サイズ 3 のチェックサムが計算されて、それぞれのサブフレームに付加されます。[0]
の初期状態は CRC アルゴリズムの出力に影響しないため、初期状態は示されていません。出力から送信されるコードワード フレームのサイズは 5 + 3 + 5 + 3 = 16 になります。
参照
[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.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
MATLAB コード生成における System object (MATLAB Coder)を参照してください。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)