このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
リード・ソロモン符号化を使用した 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);
の値の範囲を設定し、RS 符号化ゲインを考慮します。誤り統計行列を初期化します。
ebnoVec = (3:0.5:8)'; ebnoVecCodingGain = ... ebnoVec + 10*log10(K/N); % Account for RS coding gain errorStats = zeros(length(ebnoVec),3);
各 の値について、ビット エラー レートを推定します。シミュレーションは、100 個の誤りまたは ビットのいずれかに達するまで実行されます。シミュレーション ループでは、ランダム データを符号化および変調し、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 データを曲線近似します。関数bercoding
とberawgn
を使用して、符号化を行う場合と行わない場合の 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 符号は、 のビット エラー レートを達成するために必要な を約 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