メインコンテンツ

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

comm.BarkerCode

R2026a

バイポーラ バーカー符号の生成

説明

comm.BarkerCode System object™ はバイポーラ バーカー符号を生成します。バーカー符号には、低自己相関特性があります。長さが短く低相関のサイドローブにより、バーカー符号はデジタル通信システムのフレーム同期で有用です。詳細については、バーカー符号を参照してください。

バーカー符号を生成するには、以下の手順に従います。

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

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

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

作成

説明

barkerCode = comm.BarkerCode は、バーカー符号を生成するバイポーラ バーカー符号生成器 System object を作成します。

barkerCode = comm.BarkerCode(Name,Value) は、1 つ以上の名前と値のペアを使用してプロパティを設定します。たとえば、comm.BarkerCode(Length=11,SamplesPerFrame=11) は、11 サンプルのフレーム内に長さ 11 のバーカー符号を出力するバイポーラ バーカー符号生成器 System object を構成します。各プロパティ名を引用符で囲みます。

例

プロパティ

すべて展開する

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

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

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

生成される符号の長さ。、2、3、4、5、7、11、または 13 として指定します。詳細については、バーカー符号を参照してください。

例: Length=2 はバーカー符号 [–1;1] を出力します。

データ型: double

出力フレームあたりのサンプル数。正の整数として指定します。SamplesPerFrame が M の場合、オブジェクトは、長さ N のバーカー符号シーケンスで構成された M 個のサンプルを含むフレームを出力します。必要に応じて、オブジェクトは M 個のサンプルに達するように符号シーケンスを繰り返します。N は生成される符号の長さであり、Length プロパティで設定されます。

データ型: double

出力のデータ型。double または int8 を指定します。

データ型: char | string

使用法

R2016b より前のバージョンでは、関数 step を使用して System object アルゴリズムを実行します。step に対する引数は作成したオブジェクトであり、この節で示す引数が次に続きます。

たとえば、y = step(obj,x) と y = obj(x) は同等の演算を実行します。

説明

y = barkerCode は、バーカー符号フレームを列ベクトルとして出力します。フレーム長がバーカー符号の長さを超える場合、オブジェクトはバーカー符号を繰り返してフレームを埋めます。

OutputDataType プロパティを使用して、出力データ型を設定します。

例

オブジェクト関数

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

release(obj)

すべて展開する

cloneSystem object の複製
isLockedSystem object が使用中かどうかの判定
stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

例

すべて折りたたむ

フレームあたりのサンプル数が 10 のバーカー符号 System object を作成します。

  barker = comm.BarkerCode('SamplesPerFrame',10)
barker = 
  comm.BarkerCode with properties:

             Length: 7
    SamplesPerFrame: 10
     OutputDataType: 'double'

長さ 7 の既定のバーカー符号シーケンスを使用して複数のフレームを生成します。符号はフレーム内でラップされ、次のフレームに続きます。

  for ii = 1:2
      seq = barker()
  end
seq = 10×1

    -1
    -1
    -1
     1
     1
    -1
     1
    -1
    -1
    -1

seq = 10×1

     1
     1
    -1
     1
    -1
    -1
    -1
     1
     1
    -1

各バーカー符号のピーク サイドローブ レベルを計算します。

CodeLength = [2 3 4 5 7 11 13]';
psl = zeros(length(CodeLength),1);
barker = comm.BarkerCode;
for ii=1:length(CodeLength)
    spf = CodeLength(ii);
    barker.Length = CodeLength(ii);
    barker.SamplesPerFrame = spf;
    seq = barker();
    sll_dB = 20*log10(abs(xcorr(seq)));
    psl(ii) = -(max(sll_dB));
    release(barker);
end
Sidelobe_dB = psl;
T = table(CodeLength,Sidelobe_dB)
T=7×2 table
    CodeLength    Sidelobe_dB
    __________    ___________

         2          -6.0206  
         3          -9.5424  
         4          -12.041  
         5          -13.979  
         7          -16.902  
        11          -20.828  
        13          -22.279  

AWGN チャネルにおける 16-QAM 信号の著しい位相と周波数のオフセット補償は、2 つのステップで行われます。まず、coarse 周波数補償器により提供された推定値を使用して coarse 周波数オフセットを補正してから、搬送波同期を使用して補正を微調整します。coarse 周波数補正なので、正規化帯域幅が低い値に設定されていても、キャリア同期装置はすぐに収束します。正規化帯域幅の値が低いほど、残差が小さい搬送波オフセットをより良く補正できます。受信信号に位相と周波数のオフセットの補正を適用した後に、プリアンブルを使用して位相不確定性を解決します。

シミュレーション パラメーターを定義します。

fs = 10000;                  % Sample rate (Hz)
sps = 4;                     % Samples per symbol
M = 16;                      % Modulation order
k = log2(M);                 % Bits per symbol
rng(1996)                    % Set seed for repeatable results
barker = comm.BarkerCode(... % For preamble
    Length=13,SamplesPerFrame=13);
msgLen = 1e4;
numFrames = 10;
frameLen = msgLen/numFrames;

データ ペイロードを生成し、各フレームにプリアンブルを追加します。このプリアンブルは、後で位相不確定性の解決に使用されます。

preamble = (1+barker())/2;  % Length 13, unipolar
data = zeros(msgLen, 1);
for idx = 1 : numFrames
    payload = randi([0 M-1],frameLen-barker.Length,1);
    data((idx-1)*frameLen + (1:frameLen)) = [preamble; payload];
end

送信パルス整形フィルター、受信パルス整形フィルター、QAM の coarse 周波数補償、搬送波同期、およびコンスタレーション ダイアグラムのための System object™ を作成します。

txFilter = comm.RaisedCosineTransmitFilter( ...
    OutputSamplesPerSymbol=sps);
rxFilter = comm.RaisedCosineReceiveFilter(...
    InputSamplesPerSymbol=sps, ...
    DecimationFactor=sps);
coarse = comm.CoarseFrequencyCompensator( ...
    SampleRate=fs, ...
    FrequencyResolution=10);
fine = comm.CarrierSynchronizer( ...
    DampingFactor=0.4, ...
    NormalizedLoopBandwidth=0.001, ...
    SamplesPerSymbol=1, ...
    Modulation='QAM');
axislimits = [-6 6];
constDiagram = comm.ConstellationDiagram( ...
    ReferenceConstellation=qammod(0:M-1,M), ...
    ChannelNames={'Before convergence','After convergence'}, ...
    ShowLegend=true, ...
    AxesLimits=axislimits);

また、AWGN チャネルの System object と、位相と周波数のオフセットを作成して、信号に劣化要因を追加します。90 度よりも大きい位相オフセットを追加して位相不確定性を引き起こすと、コンスタレーションの象限変化が起こります。

ebn0 = 8;
freqoffset = 110;
phaseoffset = 110;
awgnChannel = comm.AWGNChannel( ...
    EbNo=ebn0, ...
    BitsPerSymbol=k, ...
    SamplesPerSymbol=sps);
pfo = comm.PhaseFrequencyOffset( ...
    FrequencyOffset=freqoffset, ...
    PhaseOffset=phaseoffset, ...
    SampleRate=fs);

ランダム データ シンボルを生成し、16-QAM 変調を適用して、変調された信号を送信パルス整形フィルターを通じて渡します。

txMod = qammod(data,M);
txSig = txFilter(txMod);

pfo System object を使用して位相オフセットと周波数オフセットを適用し、次に AWGN チャネルを通して信号を渡してホワイト ガウス ノイズを付加します。

txSigOffset = pfo(txSig);
rxSig = awgnChannel(txSigOffset);

coarse 周波数補償器 System object は、周波数オフセットの大まかな補正を行います。この例の条件では、受信信号補正の周波数オフセットを、送信信号の 10 Hz 以内に修正するだけで十分です。

syncCoarse = coarse(rxSig);

受信パルス整形フィルターを通して信号を渡し、fine 周波数補正を適用します。

rxFiltSig = fine(rxFilter(syncCoarse));

信号内の最初と最後の 1000 個のシンボルのコンスタレーション ダイアグラムを表示します。同期ループの収束前は、ダイアグラムの表示が螺旋状であり、周波数オフセットが補正されていないことが示されています。キャリア同期装置が解に収束した後は、シンボルが基準コンスタレーションと一致します。

constDiagram([rxFiltSig(1:1000) rxFiltSig(9001:end)])

信号を復調します。受信データと送信データを一致させるために、送信フィルターと受信フィルターによる信号遅延を考慮します。ビット エラーの総数と BER を計算して表示します。ビット エラーをチェックするときは、受信信号の後半部分を使用して、同期ループが収束していることを確認します。

rxData = qamdemod(rxFiltSig,M);
delay = (txFilter.FilterSpanInSymbols + ...
    rxFilter.FilterSpanInSymbols) / 2;
idxSync = 2000; % Check BER after synchronization loop has converged
[syncDataTtlErr,syncDataBER] = biterr( ...
    data(idxSync:end-delay),rxData(idxSync+delay:end))
syncDataTtlErr = 
13280
syncDataBER = 
0.4155

使用されるランダム データによっては、同期ループが収束してロックされた後に、受信信号の位相不確定性によるビット エラーがある可能性があります。この場合は、プリアンブルを使用して同期信号の位相不確定性を判別してから削除し、ビット エラーを減らすことができます。位相不確定性がきわめて小さい場合は、ビット エラーの数が変わらないことがあります。

idx = 9000 + (1:barker.Length);
phOffset = angle(txMod(idx) .* conj(rxFiltSig(idx+delay)));

phOffsetEst = mean(phOffset);
disp(['Phase offset = ',num2str(rad2deg(phOffsetEst)),' degrees'])
Phase offset = -65.8162 degrees
resPhzSig = exp(1i*phOffsetEst) * rxFiltSig;

位相不確定性を解決した後は、信号を復調します。ビット エラーの総数と BER を再計算します。

resPhzData = qamdemod(resPhzSig,M);
[resPhzTtlErr,resPhzBER] = biterr( ...
    data(idxSync:end-delay),resPhzData(idxSync+delay:end))
resPhzTtlErr = 
13440
resPhzBER = 
0.4205

詳細

すべて展開する

参照

[1] Sklar, Bernard, and Fred Harris. Digital Communications: Fundamentals and Applications. Third edition, Pearson, 2021.

拡張機能

すべて展開する

バージョン履歴

R2012a で導入

すべて展開する