crcGenerate
説明
例
長さ 6 の 2 つのメッセージ ワードを生成します。
x = logical([1 0 1 1 0 1 0 1 1 1 0 1]');
3 ビット CRC 発生器を使用してメッセージ ワードを符号化します。
cfgObj = crcConfig(Polynomial='z^3 + 1',ChecksumsPerFrame=2);
codeword = crcGenerate(x,cfgObj);各コードワードに 1 のビット エラーを追加します。
errorPattern = randerr(2,9,1).'; codewordWithError = xor(codeword,errorPattern(:));
エラーの有無にかかわらずメッセージを復号化します。crcDetect 関数は、codeword については、送信されたメッセージ ワードにエラーがないことを報告し、codewordWithError については、送信されたメッセージ ワードの両方にエラーがあることを報告します。
[tx,err] = crcDetect(codeword,cfgObj); [tx1,err1] = crcDetect(codewordWithError,cfgObj); disp(err)
0 0
disp(err1)
1 1
ITU-T Recommendation X-25 [1] の Section 2.2.7.4 に記載されているように、Appendix I、I.1 の Example 2 の入力データと期待されるフレーム チェック シーケンス (FCS) を使用して CRC-16-CCITT 発生器を適用します。ここで、アドレス = B、F = 1 とします。
番号なしの ACK (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; crcCfg = crcConfig( ... Polynomial='X^16 + X^12 + X^5 + 1', ... InitialConditions=1, ... DirectMethod=true, ... FinalXOR=1); crcSeq = crcGenerate(input,crcCfg); 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.
802.11™-2016[1] の Section 21.3.10.3 に示されている例の CRC-8 チェックサムを生成し、その結果を期待される CRC と比較します。
802.11-2016 の CRC 計算に準拠した CRC 構成オブジェクトを作成します。生成多項式を に設定します。初期条件を 1 に設定します。直接法を使用するようにアルゴリズムを設定します。最終 XOR を 1 に設定します。
crc8 = crcConfig(Polynomial=[8 2 1 0], ... InitialConditions=1, ... DirectMethod=true, ... FinalXOR=1)
crc8 =
crcConfig with properties:
Polynomial: [8 2 1 0]
InitialConditions: 1
DirectMethod: 1
ReflectInputBytes: 0
ReflectChecksums: 0
FinalXOR: 1
ChecksumsPerFrame: 1
802.11-2016 規格の Section 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 = crcGenerate(x,crc8); checksum = codeword(end-checksumLength+1:end); isequal(checksum,expectedChecksum)
ans = logical
1
参考文献
[1] IEEE® 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 チェックサムを入力フレームに追加します。
内部シフト レジスタが特定の初期状態にあり、入力フレームあたり k 個のチェックサムがある場合、次のようになります。
入力信号は等しいサイズの k 個のサブフレームに分割されます。
k 個の各サブフレームの前に、初期状態のベクトルが付加されます。
CRC アルゴリズムが各サブフレームに適用されます。
各サブフレームの終わりに結果のチェックサムが付加されます。
サブフレームが連結されて、1 つの列ベクトルとして出力されます。
次に示すシナリオでは、10 ビットのフレームが入力であり、生成多項式 z3 + z2 + 1 で CRC チェックサムを計算します。また、初期状態は 0 で、フレームあたりのチェックサムの数は 2 です。

入力フレームはサイズ 5 の 2 つのサブフレームに分割され、サイズ 3 のチェックサムが計算されて、それぞれのサブフレームに付加されます。初期状態 [0] は CRC アルゴリズムの出力に影響を与えないため、初期状態は表示されません。出力から送信されるコードワード フレームのサイズは 5 + 3 + 5 + 3 = 16 ビットになります。
crcGenerate 関数は、間接または直接の CRC アルゴリズムを使用した CRC チェックサムの生成をサポートします。サブフレームのコードワードが連結されて、1 つのフレームが出力されます。入力信号が行列である場合、入力データの各列は個別に処理されます。
間接 CRC アルゴリズム
間接 CRC アルゴリズムは、多項式 M に対応するバイナリ データ ベクトルを受け取り、多項式 C に対応する r ビットのチェックサムを追加します。xr による乗算は入力ベクトルを左側に r ビット シフトすることに相当するので、入力ベクトルとチェックサムの連結は、多項式 T = M×xr + C に対応します。アルゴリズムは、T が次数 r の定義済み多項式 P (生成多項式) によって除算されるように C を選択します。
アルゴリズムは、T を P で除算し、チェックサムを剰余に対応するバイナリ ベクトルに等しくなるように設定します。したがって、T = Q×P + R の場合 (ここで、R は r より小さい次数の多項式)、チェックサムは R に対応するバイナリ ベクトルです。アルゴリズムは、チェックサムの長さが r になるように、必要に応じてチェックサムの先頭に 0 を追加します。
CRC アルゴリズムの伝送位相を実装する CRC 生成機能は、以下の処理を行います。
入力データ ベクトルを r ビットだけ左にシフトし、対応する多項式を P で除算します。
チェックサムを長さ r (ステップ 1 の剰余に相当) のバイナリ ベクトルと等しくなるように設定します。
チェックサムを入力データ ベクトルに追加します。結果は出力ベクトルです。
先に説明したように、CRC 検出機能は、その入力ベクトル全体のチェックサムを計算します。
CRC アルゴリズムは、バイナリ ベクトルを使用してバイナリ多項式を降べきの順で表します。たとえば、ベクトル [1 1 0 1] は、多項式 x3+ x2+ 1 を表します。

ビットは、最小のインデックス ビットから最大のインデックス ビットに向かって線形フィードバック シフト レジスタ (LFSR) に入力されます。入力メッセージ ビットのシーケンスは、メッセージ多項式の係数を降べきの順で表します。メッセージ ベクトルは r 個の 0 で拡張され、LFSR をフラッシュします (ここで r は生成多項式の次数です)。左端のレジスタ ステージからの出力 d(1) が 1 の場合、シフト レジスタ内のビットは生成多項式の係数と XOR 計算されたものです。拡張されたメッセージ シーケンスが LFSR を介して完全に送信されると、レジスタにはチェックサム [d(1) d(2) . . . d(r)] が含まれます。これはバイナリ長除算の実装です (メッセージ シーケンスが分子で多項式が分母です)。CRC チェックサムは、除算演算の剰余です。
直接 CRC アルゴリズム
次のブロック線図は直接 CRC アルゴリズムを示しています。

"メッセージ ブロック入力" が の場合の "コード ワード出力" は次のようになります。
直接 CRC 符号化の初期ステップは、位置 X にある 3 つのスイッチによって生起します。このアルゴリズムは k 個のメッセージ ビットを符号化器に送り込みます。これらのビットは、符号語出力の最初の k ビットです。同時に、線形フィードバック シフト レジスタ (LFSR) に k 個のビットが送信されます。k 番目のメッセージ ビットの LFSR への送り込みが完了すると、スイッチは Y の位置に移動します。この例では、LFSR には多項式除算の数値剰余が含まれます。これらのビットは、LFSR からシフトされます。これらのビットは、符号語出力の残りのビット (チェックサム) です。
参照
[1] Sklar, Bernard. Digital Communications: Fundamentals and Applications. Englewood Cliffs, NJ: Prentice-Hall, 1988.
[2] Wicker, Stephen B. Error Control Systems for Digital Communication and Storage. Upper Saddle River, NJ: Prentice Hall, 1995.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
この関数は、GPU 配列の入力をサポートします。詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2024a で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)