【MATLAB】通信の勉強をする前の練習問題【問題編④BERの計算】


【第4章】通信の実行とBERの計算

ここから一気にBERの計算まで行きます。

(1)受信信号を計算する

第3章の問5,第2章の問2を参考にして、QPSK変調された送信シンボルがAWGNの影響を受けた時の受信シンボルを表現してみましょう。
SNRや送信bit数は自由に決めてください。

ヒント

$y_k,x_k,z_k$をそれぞれ時刻kにおける受信シンボル、送信シンボル、雑音ベクトルだとしたとき、それらは
$y_k = x_k + z_k$という関係にあります。

(2) 奇数bit目の復調

まずは受信シンボル$y_k$から奇数bit目を復調しましょう。「どのような変調が施されたことにより$x_k$が作られたのか」を思い出せば,$y_k$のうちどこが奇数bit目に対応するのかが見えてくると思います。復調結果は{-1,1}から構成される行列で出力してください

ヒント

$y_k$は$x_k$と違って雑音が足されていることに注意しましょう。

(3) 偶数bit目の復調

上と同じです。「どのような変調によりそれが作られたのか」を思い出しましょう。

(4) (2),(3)の結果の結合

結合結果は、もし雑音がなければ「送信信号をBPSK変調したもの」と全く同じになるはずです。

ヒント

A(:,1:2:end) = B

このような操作によってAの(2*n-1)行目にBのn行目を代入することができます。(n=1,2,...)

(5) BPSK復調

(4)の結果得られたビット列に対してBPSK復調をしましょう。

ヒント

BPSK変調のときには、0を-1にしたんでしたね。では逆操作である復調は…。

(6) BERの計算

BERの定義とは、「(誤って判定されたbitの個数)/(送信したbitの個数)」です。

解答


% おまじない
clear all

% 今までの復習
N = 10^6;
SNRdB = 10;
SNR = 10^(SNRdB/10);
No = 1/SNR;
noise_comp = sqrt(No/2) * randn(2,N/2) + 1j*sqrt(No/2) * randn(2,N/2);

TX_bit = randi([0,1],2,N);
TX_BPSK = zeros(size(TX_bit));
TX_BPSK(TX_bit == 0) = -1;
TX_BPSK(TX_bit == 1) = 1;
%TX_QPSKの実部は奇数番目の送信bit、虚部は偶数番目の送信bitに対応することに着目
TX_QPSK = (TX_BPSK(:,1:2:end) + 1j*TX_BPSK(:,2:2:end))/sqrt(2);

%問(1) 受信信号の表現
RX_QPSK = TX_QPSK + noise_comp;

%問(2) 奇数bitの復調
RX_BPSK1 = zeros(2,N/2);
RX_BPSK1(real(RX_QPSK) > 0) = 1;
RX_BPSK1(real(RX_QPSK) < 0) = -1;

%問(3) 偶数bitの復調
RX_BPSK2 = zeros(2,N/2);
RX_BPSK2(imag(RX_QPSK) > 0) = 1;
RX_BPSK2(imag(RX_QPSK) < 0) = -1;

%問(4) (2),(3)の結果の結合
RX_BPSK = zeros(size(TX_bit));
RX_BPSK(:,1:2:end) = RX_BPSK1;
RX_BPSK(:,2:2:end) = RX_BPSK2;

%問(5) BPSK復調
RX_bit = zeros(size(TX_bit));
RX_bit(RX_BPSK == -1) = 0;
RX_bit(RX_BPSK == 1) = 1;

%問(6) BERの算出
BER = sum(abs(TX_bit(:) - RX_bit(:)))/(2*N);