【MATLAB】通信の勉強をする前の練習問題【問題編③SNRと雑音の生成】


【第3章】SNRと雑音の生成

第1章、第2章で正規分布に従う乱数の生成と変調信号の生成ができるようになりました。通信のシミュレーションが実行できるようになるまであと少しです。

(1) SNR[dB]を真値に変換する

通常、信号検出性能を評価する際には横軸に「SNR(Signal-to-Noise ratio)[dB]」など信号が雑音に対してどの程度大きいかを取り、縦軸に「BER(Bit Error Rate)」などを全体のうち何bitが結局誤ってしまったかを取ることが多いです。シミュレーションのために雑音を生成するときには、送信電力を大きくしたり小さくしたりするのではなく、送信電力を1と固定して、雑音の大きさをSNR[dB]によって変えます。そのために、まずはSNR[dB]を真値に変換する必要があります。
まずは、SNR[dB]=12[dB]を真値に直しましょう。

ヒント

${\rm SNR}[{\rm dB}]=10\log_{10}\frac{1}{N_0} = 10\log_{10}(SNR[真値])$
これを変形しましょう。

(2) SNR[真値]を元に生成するべき雑音の分散を求める

上の式をじっくり見ればわかるはずです。

(3) 実数雑音を表す行列を生成する

2行$N$列の、雑音を表す実数の行列を生成しましょう。
第1章の知識と、本章問題(2)の結果を合わせて考えましょう。ちなみに、今回生成したいのはAWGN(加法性白色ガウス雑音)なので平均値は0です。

ヒント

正規分布を生成するために必要なものは「標準偏差」でした。一方、問題(2)で求めているものは「分散」であることに注意してください。

(4) 生成した実数雑音の分散を計算する

本章問題(3)で生成した実数雑音の分散を計算することにより、$N$が十分に大きいときその計算結果が$N_0$とほぼ一致することを確かめましょう。これも第1章の知識でできるはずです。

(5) 複素雑音を表す行列を生成する

問題(4)では実数雑音を生成してもらいましたが、基本的には通信では複素信号を扱うことが多いので複素雑音が乗ると考えます。2行$N$列の、雑音を表す複素数の行列を生成しましょう。

ヒント

・雑音は、実数方向と虚数方向で同じ分散のものがかかります。

(6) 生成した複素雑音の分散を計算する

本章問題(5)で生成した複素雑音の分散を計算することにより、$N$が十分に大きいときその計算結果が$N_0$とほぼ一致することを確かめましょう。

ヒント

・実数方向と複素方向の両方に標準偏差$\sqrt{N_0}$の雑音が乗ると、実は雑音が大きすぎになってしまうことに注意してください。

解答


% おまじない
clear all

% 送信ビット数
N = 10^6;

%問(1) SNR[dB]をSNR[真値]に変換する
SNRdB = 8;
SNR = 10^(SNRdB/10);

%問(2) 生成するべき雑音の分散を求める
No = 1/SNR;

%問(3) 実数雑音の行列を生成する
noise = sqrt(No) * randn(2,N);

%問(4) 雑音分散を計算する
disp(noise(1,:)*noise(1,:)'/N)

%問(5) 複素雑音の行列を生成する
noise_comp = sqrt(No/2) * randn(2,N) + 1j*sqrt(No/2) * randn(2,N);

%問(6) 雑音分散を計算する
disp(noise_comp(1,:)*noise_comp(1,:)'/N)