Main Content

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

リード・ソロモン符号化を使用した AWGN 環境下での QPSK の BER 推定

リード・ソロモン符号化したデータを、QPSK を使用して AWGN チャネル経由で送信します。受信信号を復調して復号化し、誤り統計を収集します。符号化されたデータおよび符号化されていないデータの理論的ビット エラー レート (BER) を計算します。BER の結果をプロットして性能を比較します。

パラメーター例を定義します。

rng(1993);     % Seed random number generator for repeatable results
M = 4;         % Modulation order
bps = log2(M); % Bits per symbol
N = 7;         % RS codeword length
K = 5;         % RS message length

AWGN チャネルとエラー レート オブジェクトを作成します。

awgnChannel = comm.AWGNChannel( ...
    BitsPerSymbol=bps);
errorRate = comm.ErrorRate;

ビット入力を受け入れる (7,5) リード・ソロモン符号化器と復号化器のペアを作成します。

rsEncoder = comm.RSEncoder( ...
    BitInput=true, ...
    CodewordLength=N, ...
    MessageLength=K);
rsDecoder = comm.RSDecoder( ...
    BitInput=true, ...
    CodewordLength=N, ...
    MessageLength=K);

Eb/N0 の値の範囲を設定し、RS 符号化ゲインを考慮します。誤り統計行列を初期化します。

ebnoVec = (3:0.5:8)';
ebnoVecCodingGain = ...
    ebnoVec + 10*log10(K/N); % Account for RS coding gain
errorStats = zeros(length(ebnoVec),3);

Eb/N0 の値について、ビット エラー レートを推定します。シミュレーションは、100 個の誤りまたは 107 ビットのいずれかに達するまで実行されます。シミュレーション ループでは、ランダム データを符号化および変調し、AWGN チャネル経由で信号をフィルター処理し、信号を復調および復号化した後、誤り統計を計算します。

for i = 1:length(ebnoVec)
    awgnChannel.EbNo = ebnoVecCodingGain(i);
    reset(errorRate)
    while errorStats(i,2) < 100 && errorStats(i,3) < 1e7
        data = randi([0 1],1500,1);
        encData = rsEncoder(data);
        modData = pskmod(encData,M,InputType='bit');
        rxSig = awgnChannel(modData);
        rxData = pskdemod(rxSig,M,OutputType='bit');
        decData = rsDecoder(rxData);
        errorStats(i,:) = errorRate(data,decData);
    end
end

berfitを使用して、BER データを曲線近似します。関数bercodingberawgnを使用して、符号化を行う場合と行わない場合の QPSK のパフォーマンスの推定値を生成します。

berCurveFit = berfit(ebnoVecCodingGain,errorStats(:,1));
berwCoding = bercoding(ebnoVec,'RS','hard',N,K,'psk',M,'nondiff');
berNoCoding = berawgn(ebnoVec,'psk',M,'nondiff');

RS 符号化時の BER データ、BER データの曲線近似、RS 符号化を行う場合の理論上の性能、および RS 符号化を行わない場合の理論上の性能をプロットします。(7,5) RS 符号は、10-2 のビット エラー レートを達成するために必要な Eb/N0 を約 1.2 dB 向上させます。

semilogy(ebnoVecCodingGain,errorStats(:,1),'b*', ...
    ebnoVecCodingGain,berCurveFit,'c-', ...
    ebnoVecCodingGain,berwCoding,'r', ...
    ebnoVec,berNoCoding)
ylabel('BER')
xlabel('Eb/No (dB)')
legend( ...
    'RS-coded BER','Curve fit', ...
    'Theory with coding','Theory no coding')
grid