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