(9)OFDMシミュレーション


以下にあるノイズを与えた時のシンボルエラーレイトを測定するOFDM通信システムシミュレーションのSCILABコードを示す。

コードのリンク: qpsk_ofdm1.sce

//Program:
//Simple OFDM system
//Fire Wada Lab
//
//Usage:
//Execute-> Load into Scilab (or Ctrl L)

clear;
num_symbol = 2 ; // number of symbols
num_point = 1024; // points in symbol 
M = 4; // size of signal constellation
modqpsk= [1+%i, -1+%i, 1-%i, -1-%i];


//1 . create random data
rand("uniform");
data = floor(rand(num_point,num_symbol)*M);
//data = [0 1 2 3];
clear により以前の状況をクリアする。

modqpsk(1)=1+%i
modqpsk(2)=-1+%i
modqpsk(3)=1-%i
modqpsk(4)=-1-%i

を設定し、後ほどデータ値からコンスタレーションへの変換に用いる。

 

[0..1)の一様乱数を使用する。一様uniform

1024*2個の0から3の整数をデータとして生成する。

//2. mapping into I-Q constellation
data_1 = matrix(modqpsk(1+data),num_point,num_symbol);

subplot(2,2,1);
a = get("current_axes");
a.data_bounds = [-3,-3;3,3];
xtitle("I-Q constellation","I", "Q");
plot(real(data_1),imag(data_1),'r.');
dataを1024*2の行列の形で、コンスタレーション値に対応させる。

コンスタレーションをPLOTする。

//serial to parallel
data_2 = data_1;

//3. IFFT 
data_3 = ifft(data_2);
subplot(2,2,2);
a = get("current_axes");
xtitle("IFFT");
plot((real(data_3)),'ob-');

//4. GI add
data_4 = [data_3(897:1024,:);data_3] ;
IFFTを実行してOFDM波形とする。

波形をプロットする。ここでは、複素数なので、実成分のみPLOTしている。

ガードインターバルを追加する。

//4.1 Add Noise
sigpower=mean(abs(data_4).^2);
sn= 10; // 10dB
rand("normal");
awgn = (rand(num_point+128,num_symbol)+%i*rand(num_point+128,num_symbol));
awgnpower=mean(abs(awgn).^2);
awgn = awgn/sqrt(awgnpower)*10^(-sn/20)*sqrt(sigpower);
data_4=data_4+awgn;

subplot(2,2,3);
a = get("current_axes");
xtitle("GI add");
plot(real(data_4),'*cya--');
 

信号のパワーを計測する。 sigpower

正規分布の乱数を用いて、ノイズ信号を発生する。

ベースバンド処理であり、ノイズの複素数である。

ノイズパワーを計測する。awgnpower

sn比に応じてノイズ信号振幅を調整する。

ノイズを信号に加算する。

 

//5. GI remove
data_5 = data_4(129:1152,:);

//6. FFT
data_6 = fft(data_5);

受信信号のガードインターバル部分を消去する。

FFTして復調を行う。

//Parallel to serial
data_7 = data_6;

subplot(2,2,4);
a = get("current_axes");
xtitle("The result after FFT");
a.data_bounds = [-3,-3;3,3];
plot(real(data_7),imag(data_7),'r.');
復調シンボルのコンスタレーションを表示する。
// data decode
for j=1:num_symbol
 for i=1:num_point
  if (real(data_7(i,j))>=0 & imag(data_7(i,j))>=0) then 
   decdata(i,j)=0;
  elseif (real(data_7(i,j))<0 & imag(data_7(i,j))>=0) then 
   decdata(i,j)=1;
  elseif (real(data_7(i,j))>=0 & imag(data_7(i,j))<0) then 
   decdata(i,j)=2;
  else
   decdata(i,j)=3;
  end
 end
end
コンスタレーションの値より、0から3の元データに変換する。
// calculate number of different data
diff1 = data - decdata;
diff2 = sign(abs(diff1));
serr = sum(diff2) // error symbols
tsym = num_point*num_symbol // total number of symols
mprintf(' SNR(dB)= %3d SYMBOL ERROR RATE = % 5.4e \n', sn, serr/tsym);
元データと受信データの違う個数を数える。

全データ数との比がシンボルエラー率となる。

 


HW-10

(1)上記SCILABプログラムを利用して、1KFFT、QPSKを用いるOFDM伝送での、
シンボルエラー率 vs SN比の関係を示すSEMILOGのグラフを作成せよ。

SN比は0から10dBで1dBステップとする。

(2)上記SCILABプログラムを利用して、変調方式がBPSKでコンスタレーションが”1”もしくは”−1”の場合の
シンボルエラー率 vs SN比の関係を示すSEMILOGのグラフを作成せよ。

(3)上記2つのシミュレーションの結果から言えることを全て述べよ。

以上