Main Content

16-QAM 信号での前方誤り訂正の使用

この例は16-QAM 信号でのパルス整形の使用の例を拡張したもので、前方誤り訂正 (FEC) 符号化を使用した場合のビット エラー レート (BER) 性能の向上を示します。

この例では、ベースバンド変調器、チャネル、復調器、パルス整形、レイズド コサイン フィルター処理、および誤り訂正で構成される通信リンクを使用してバイナリ データ ストリームを処理する方法を示します。

シミュレーションのフレームワークの確立

この例では、BER 推定の精度を高めるために、処理ビット数を16-QAM 信号でのパルス整形の使用の例で使用した値よりも増やします。それ以外のシミュレーション変数はその例の設定と同じです。

16-QAM 変調スキームとレイズド コサイン フィルター処理、および AWGN チャネルについて、シミュレーション パラメーターを定義します。

M = 16;            % Modulation order
k = log2(M);       % Bits per symbol
numBits = k*2.5e5; % Total bits to process
sps = 4;           % Samples per symbol (oversampling factor)
filtlen = 10;      % Filter length in symbols
rolloff = 0.25;    % Filter rolloff factor

ランダム データの生成

例で結果を繰り返し再現できるように、関数rngを既定の状態または静的なシード値に設定します。その後、関数randiを使用してランダムなバイナリ データを生成します。

rng default;                     % Default random number generator
dataIn = randi([0 1],numBits,1); % Generate vector of binary data

畳み込み符号化の適用

ノイズの多いチャネルによって生じる誤りを訂正するために、送信前のデータに畳み込み符号化を適用し、受信データにビタビ復号化を適用します。復号化器では硬判定アルゴリズムを使用します。つまり、受信した各データ ビットが 0 または 1 のいずれかとして解釈されます。

関数poly2trellisを使用して、符号化率 2/3 の畳み込み符号化のトレリスを定義します。定義したトレリスは、バイナリ ベクトル dataIn を符号化するために関数convencで使用する畳み込み符号を表します。

constrlen = [5 4];          % Code constraint length
genpoly = [23 35 0; 0 5 13] % Generator polynomials
genpoly = 2×3

    23    35     0
     0     5    13

tPoly = poly2trellis(constrlen,genpoly);
codeRate = 2/3;

tPoly のトレリスを使用して入力データを符号化します。

dataEnc = convenc(dataIn,tPoly);

データの変調

関数bit2intを使用して、k 組の符号化されたバイナリ データを整数値に変換します。

dataSymbolsIn = bit2int(dataEnc,k);

関数qammodを使用して、16-QAM 変調を適用します。

dataMod = qammod(dataSymbolsIn,M);

レイズド コサイン フィルター処理の適用

関数rcosdesignを使用して、RRC フィルターを作成します。

rrcFilter = rcosdesign(rolloff,filtlen,sps);

関数upfirdnを使用して、オーバーサンプリング係数で信号をアップサンプリングし、RRC フィルターを適用します。関数 upfirdn は、アップサンプリングされた信号の最後にゼロをパディングしてフィルターをフラッシュします。その後、この関数でフィルターが適用されます。

txSignal = upfirdn(dataMod,rrcFilter,sps,1);

AWGN チャネルの適用

シンボルあたりのビット数、シンボルあたりのサンプル数、符号化率、および関数convertSNRを使用して、ノイズ パワー スペクトル密度に対する 1 ビットあたりのエネルギーの比 (EbNo) を、関数awgnで使用する SNR 値に変換します。Eb/N0 を SNR に変換する際は、シンボルあたりの情報ビット数を考慮しなければなりません。FEC を適用しない場合、各シンボルは k ビットに相当します。FEC を適用する場合、各シンボルは (k × codeRate) 情報ビットに相当します。この例で使用している 2/3 の符号化率と 16-QAM の伝送の場合、3 つのシンボルが 12 の符号化されたビットと 8 の符号化されていないビット (情報ビット) に相当します。

EbNo = 10;
snr = convertSNR(EbNo,'ebno', ...
    samplespersymbol=sps, ...
    bitspersymbol=k,CodingRate=codeRate);

フィルター処理された信号を AWGN チャネルを通して渡します。

rxSignal = awgn(txSignal,snr,'measured');

信号の受信と復調

受信信号を RRC フィルターを使用してフィルター処理します。フィルター遅延を考慮して、信号の一部を削除します。

rxFiltSignal = ...
    upfirdn(rxSignal,rrcFilter,1,sps);       % Downsample and filter
rxFiltSignal = ...
    rxFiltSignal(filtlen + 1:end - filtlen); % Account for delay

関数qamdemodを使用して、フィルター処理された受信信号を復調します。

dataSymbOut = qamdemod(rxFiltSignal,M);

ビタビ復号化の適用

関数int2bitを使用して、復元された整数シンボルをバイナリ データに変換します。

codedDataOut = int2bit(dataSymbOut,k); % Return data in column vector

関数vitdecを使用して、硬判定と連続操作モードを使用するように構成し、畳み込み符号化されたデータを復号化します。連続操作モードでは、ループで動作するデータのフレームを受信する場合のように復号化器を繰り返し呼び出す場合に内部状態が維持されます。また、連続操作モードではシステムに遅延が追加されます。この例ではループを使用しませんが、この復号化処理における遅延を補正する方法を説明するため、'cont' モードを使用します。

traceBack = 16;                      % Decoding traceback length
numCodeWords = ...
    floor(length(codedDataOut)*2/3); % Number of complete codewords
dataOut = ...
    vitdec(codedDataOut(1:numCodeWords*3/2), ...
    tPoly,traceBack,'cont','hard');  % Decode data

システム BER の計算

復元されたデータでは、送信と受信の RRC フィルターによる遅延は既に考慮されていますが、復号化器による遅延はまだ考慮されていません。ビタビ復号化器の連続操作モードでは、ビット単位の持続時間がトレースバックの長さ traceBack に符号化器の入力ストリーム数を乗算した数に相当する遅延が発生します。この例で使用している 2/3 の符号化率の場合、符号化器の入力ストリームは 2 つであるため、遅延は 2×traceBack ビットです。その結果、復号化されたベクトル dataOut の最初の 2×traceBack ビットはゼロになります。BER の計算では、dataOut の最初の 2×traceBack ビットと元のベクトル dataIn の最後の 2×traceBack ビットは破棄します。

関数biterrを使用して、dataIndataOut を比較することで誤り数と BER を計算します。同じ 10 dB の Eb/N0 で比較すると、FEC が処理チェーンに含まれている場合の方が誤り数が減少しています。

decDelay = 2*traceBack;              % Decoder delay, in bits
[numErrors,ber] = ...
   biterr(dataIn(1:end - decDelay),dataOut(decDelay + 1:end));       
fprintf('\nThe bit error rate is %5.2e, based on %d errors.\n', ...
    ber,numErrors)
The bit error rate is 6.40e-05, based on 64 errors.

遅延の詳細

この例の復号化操作で生じる遅延により、復号化器の出力が入力より遅れます。タイミングの情報は、例では明確には現れません。遅延の長さは、実行されている特定の操作に依存します。遅延は、畳み込み復号化、畳み込みインターリーブ/デインターリーブ、イコライズ、フィルター処理など、通信システムのさまざまな操作で起こります。特定の関数または操作で引き起こされる遅延の持続時間を調べるには、それらの関数や演算子のドキュメンテーションを参照してください。遅延の詳細については、畳み込みインターリーバーの遅延およびフェージング チャネルを参照してください。

参考

関数

関連するトピック