Main Content

comm.PreambleDetector

データのプリアンブルの検出

説明

comm.PreambleDetector System object™ は入力データ シーケンスのプリアンブルを検出します。プリアンブルは一連のシンボルまたはビットで、パケット ベースの通信システムで使用され、パケットの開始を示します。プリアンブル検出器オブジェクトはプリアンブルの末尾に対応する位置を検出します。

入力データ シーケンスのプリアンブルを検出するには、次を行います。

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

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

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

作成

説明

prbdet = comm.PreambleDetector は、既定のプロパティを使用してプリアンブル検出器オブジェクトを作成します。

prbdet = comm.PreambleDetector(Name=Value) は、名前と値の引数を使用して追加プロパティを指定します。たとえば、comm.PreambleDetector(Input="Bit",Detections="First") は、バイナリ入力信号を必要とし、最初に検出されたプリアンブルを選択するプリアンブル検出器を作成します。

prbdet = comm.PreambleDetector(prb,Name=Value) は、名前と値の引数を使用して指定したこれらのプロパティに加え、Preamble プロパティを prb に設定してオブジェクトを作成します。

プロパティ

すべて展開する

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

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

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

入力データのデータ型。'Symbol' または 'Bit' で指定します。

  • バイナリ入力の場合は、このプロパティを 'Bit' に設定します。バイナリ データのデータ型として、doublesingleBooleanint8、または uint8 のデータ型を指定できます。

  • その他すべての入力の場合は、このプロパティを 'Symbol' に設定します。シンボル データのデータ型として、double または single を指定できます。

プリアンブル シーケンス。列ベクトルとして指定します。オブジェクトはこのシーケンスを使用して、入力データに存在するプリアンブルを検出します。

  • Input プロパティを 'Bit' に設定した場合、プリアンブルはバイナリ シーケンスでなければなりません。

  • Input プロパティを 'Symbol' に設定した場合、プリアンブルとして実数または複素数の任意のシーケンスを選択できます。

データ型: double | single | logical | int8 | uint8
複素数のサポート: あり

検出しきい値。非負のスカラーとして指定します。計算される検出メトリクスが Threshold 以上の場合に、プリアンブルが検出されます。

調整可能: Yes

依存関係

このプロパティは、Input プロパティを 'Symbol' に設定した場合に利用できます。

検出するプリアンブル数。'All' または 'First' で指定します。

  • 'All' — 入力データ シーケンスのすべてのプリアンブルを検出します。

  • 'First' — 入力データ シーケンスの最初のプリアンブルのみを検出します。

使用法

説明

idx = prbdet(X) は、データ シーケンス x 内のプリアンブルの最後の位置を返します。

[idx,detmet] = prbdet(X) は検出メトリクス detmet も返します。この構文は、Input プロパティを 'Symbol' に設定した場合に利用できます。

入力引数

すべて展開する

データ シーケンス。スカラーまたは行ベクトルとして指定します。

データ型: double | single | logical | int8 | uint8
複素数のサポート: あり

出力引数

すべて展開する

プリアンブル終端のインデックス。スカラーまたは列ベクトルとして返されます。Detections プロパティが次のように設定されている場合です。

  • "All" — 入力データ シーケンスに含まれるすべてのプリアンブルのインデックスが返されます。

  • "First" — 入力データ シーケンスに含まれる最初のプリアンブルのインデックスが返されます。

検出メトリクス。入力 X と同じ次元とデータ型をもつスカラーまたは行ベクトルとして返されます。

出力 detmet は次のいずれかのアルゴリズムで決定されます。

  • プリアンブルと入力データのいずれかが複素数の場合、検出メトリクスはプリアンブルと入力信号の相互相関の絶対値です。

  • プリアンブルと入力データの両方が実数の場合、検出メトリクスはプリアンブルと入力信号の相互相関です。

依存関係

この出力は、Input プロパティを 'Symbol' に設定した場合に返されます。

オブジェクト関数

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

release(obj)

すべて展開する

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

すべて折りたたむ

6 ビットのプリアンブルを指定します。

prb = [1 0 0 1 0 1]';

プリアンブル prb を使用し、ビット入力を受け入れるプリアンブル検出器オブジェクトを作成します。

prbdet = comm.PreambleDetector(prb,Input='Bit');

2 つのプリアンブルを含むバイナリ データ シーケンスを作成し、ランダム ビットを使用してデータ フィールドを表します。

pkt = [prb; randi([0 1],10,1); prb; randi([0 1],10,1)];

2 つのプリアンブルのインデックスを見つけます。インデックスはプリアンブルの最後に対応します。検出器はインデックス 6 と 22 を、シーケンスに挿入された 2 つのプリアンブルの末尾として正しく識別します。データ フィールド用に生成したランダム シーケンスがプリアンブルのパターンと一致する場合、さらにプリアンブルを検出したことが報告されます。プリアンブルを長くすることで、そのような偽警報の頻度を減らすことができます。

idx = prbdet(pkt)
idx = 2×1

     6
    22

プリアンブルを作成して QPSK 変調を適用します。

p1 = [0 1 2 3 3 2 1 0]';
p = [p1; p1];
prb = pskmod(p,4,pi/4,'gray');

comm.PreambleDetector オブジェクトをプリアンブル prb を使用して作成します。

prbdet = comm.PreambleDetector(prb)
prbdet = 
  comm.PreambleDetector with properties:

         Input: 'Symbol'
      Preamble: [16x1 double]
     Threshold: 3
    Detections: 'All'

ランダムなシンボルのシーケンスを生成します。最初のシーケンスは前のパケットの最後の 20 個のシンボルを表します。2 番目のシーケンスは現在のパケットのシンボルを表します。

d1 = randi([0 3],20,1);
d2 = randi([0 3],100,1);

2 つのシーケンスを変調します。

x1 = pskmod(d1,4,pi/4,'gray');
x2 = pskmod(d2,4,pi/4,'gray');

前のパケットの残り、プリアンブル、および現在のパケットから構成される変調されたシンボルのシーケンスを作成します。

y = [x1; prb; x2];

ホワイト ガウス ノイズを付加します。

z = awgn(y,10);

プリアンブル インデックスおよび検出メトリクスを求めます。

[idx,detmet] = prbdet(z);

idx の要素数を計算します。要素数が 1 より大きいため、検出しきい値が低すぎます。

numel(idx)
ans = 81

最大の検出メトリクスを 5 つ表示します。

detmetSort = sort(detmet,'descend');
detmetSort(1:5)
ans = 5×1

   17.4372
   14.2811
   12.0468
    8.4345
    8.3604

しきい値を大きくしてプリアンブル インデックスを求めます。36 という結果は、プリアンブル長 (16) と前のパケットの残りのサンプル数 (20) の和に一致します。この結果は、プリアンブルが適切に検出されていることを示します。

prbdet.Threshold = 15;
idx = prbdet(z)
idx = 36

良好な相関特性を持つプリアンブル シーケンスを使用して、遅延受信データのストリームで送信データ フレームのプリアンブルの最後のサンプルを検出します。

Zadoff-Chu シーケンスの 9 番目のルートを使用して、長さ 17 のプリアンブルを定義します。ランダムな信号からのいくつかのサンプル、プリアンブル、および 100 サンプルのランダムな信号を連結して、1 つの送信信号を生成します。

M = 16;  % 16-QAM modulation
preamble = zadoffChuSeq(9,17);
x = randi([0 M-1],100,1);
xmod = qammod(x,M,UnitAverage=true);
txsig = [xmod(23:30); preamble; xmod];

可変非整数遅延 System object™ を作成します。82.3 サンプルの可変非整数遅延を導入します。可変非整数遅延オブジェクトの実行時にフル フレームを返すには、送信信号の終わりにゼロ パディングを追加します。送信信号に AWGN を付加します。

vfd = dsp.VariableFractionalDelay; 
samplesToDelay = 82.3;
txsigdelayed = ...
    vfd([txsig; zeros(ceil(samplesToDelay),1)],samplesToDelay);
SNR = 40;
rxsig = awgn(txsigdelayed,SNR);

プリアンブル検出器 System object を作成します。このとき、プリアンブル、しきい値レベル、および最初の検出のインデックスの出力を指定します。この例の条件の場合、しきい値を、プリアンブルのサンプルの合計振幅の 60% に設定すると、プリアンブルの正しいインデックスが検出されます。プリアンブル検出オブジェクトを実行します。プリアンブル インデックスおよび検出メトリクスが返されます。

thr = 0.6*sum(abs(preamble).^2);
preambleDet = comm.PreambleDetector( ...
    Preamble=preamble, ...
    Threshold=thr, ...
    Detections='First');
[idx,detmet] = preambleDet(rxsig);
idx
idx = 107

検出メトリクスはプリアンブルと入力信号の相互相関の絶対値です。相互相関のピークは、返されるプリアンブル インデックスと一致する必要があります。返されるインデックスがプリアンブルを特定していることを確認するには、返される相互相関値をプロットし、返されるインデックス値を相互相関値のピークと比較します。

plot(detmet)

Figure contains an axes object. The axes object contains an object of type line.

アルゴリズム

ビット入力

入力データがビットで構成されている場合、プリアンブル検出器はパターンの完全一致を使用します。

シンボル入力

入力データがシンボルで構成されている場合、プリアンブル検出器は相互相関アルゴリズムを使用します。有限インパルス応答 (FIR) フィルターの場合は係数がプリアンブルから指定され、入力データとプリアンブルとの相互相関が計算されます。入力サンプルのシーケンスがプリアンブルと一致すると、フィルター出力がピークに達します。ピークのインデックスは、入力データのプリアンブル シーケンスの最後に対応します。FIR フィルター アルゴリズムの詳細については、Discrete FIR Filter (Simulink) を参照してください。

指定された検出しきい値以上の相互相関値がピークとして報告されます。

  • 検出しきい値が低すぎる場合、アルゴリズムは偽のピークを検出します。または、極端なケースでは、入力サンプルと同数のピークが検出されます。

  • 検出しきい値が高すぎる場合、アルゴリズムはピークを見落とします。または、極端なケースでは、ピークがまったく検出されません。

したがって、検出しきい値の選択は重要です。

拡張機能

バージョン履歴

R2016b で導入