数字移动通信基础实验书

更新时间:2024-05-20 05:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数字移动通信基础仿真实验指导书

安逹研究室

2003年3月版

(2003.12.19)

1

1. 实验概要

实验1 通过仿真编程和仿真实验,加深对衰落信道的理解.

用软件实现衰落仿真器F(k),编写仿真程序,根据其运行结果观察衰落的振幅如何变动. 实验2 在空间领域观测衰落

编写观测空间领域衰落的程序,并用它来观测衰落的空间领域变化. 实验3 衰落环境下的误码率特性的观测

1. 编写误码率观测软件,测定衰落环境下的误码率特性

2. 测定无衰落环境下的误码率特性,并与衰落环境下的误码率特性进行比较. 实验4 抗衰落措施-分集接受对误码特性的改善 实验5 仲上-莱斯衰落

2. 实验1

2.1.1程序流程

[Start]开始 (void CJikkenDDlg::OnStartButton())

做图 程序 …(1)

衰落的角度与相位的初始設定 …(2)

衰落仿真器

循环 F (k) …(3)

k=0~1000 F (k)的振幅的計算 F(k)的 记录 …(4)

实验者各自完成本程序流程图的(2)和(3)两部分的程序编制.

2

2.1.2. Microsoft Visual C++的原程序说明

在以下的原程序中与衰落无关的部分用绿色表示.

void CJikkenDDlg::OnStartButton() {

/* 实验1的软件記述部分*/

/* 定义以下参数*/ int loop1,loop2; double FDT, NORM; double fading_I, fading_Q; double ALPHA[17], PHI[17], THETA[17]; double T_I[17], T_Q [17]; double rnd1,rnd2; double PI=3.1415926; double fading_abs,fading_log; int N, NM, k, TIME; srand( (unsigned)time( NULL ) ); CClientDC dc(this);

// 縦線 流程图第(1)的部分 for (loop1 = 0; loop1 <=10; loop1=loop1+1) {dc.MoveTo (50+50*loop1,50); dc.LineTo (50+50*loop1,350);} // 横線 for (loop1 = -10; loop1 <=50; loop1=loop1+10) {dc.MoveTo (50,100+loop1*5); dc.LineTo (550,100+loop1*5);}

/*归一化参数 NORM:fading (fading衰落的平均功率为1) */ NORM = sqrt(1./16.);

/* 衰落的角度和相位的初始設定 */ 流程图的第(2)部分 //↓↓↓从这开始,实验者各自添加流程图第(2)部分的程序

(各自的程序做成部分.詳細的请参照程序添加部分说明)

//↑↑↑到此为止

for (k=0; k<=1000; k++) // 以下为循环部分. {

/* 衰落仿真器 */ 流程图的第(3)部分 fading_I = 0; fading_Q = 0; 衰落参数的初始化//↓↓↓从这开始,实验者各自添加流程图第(3)部分的程序

(各自的程序做成部分.詳細的请参照程序添加部分说明)

//↑↑↑到此为止 /* 衰落振幅的計算 */ 流程图的第(4)部分 fading_abs = sqrt(pow(fading_I,2)+pow(fading_Q,2)); fading_log = 20*log10(fading_abs);

/* 作图部分 */ for(loop2 =0; loop2 <=500000; loop2=loop2+1) {}; dc.SetPixel (k*0.5+50,100-fading_log*5,RGB(255,0,0)); } UpdateData(FALSE); }

3

2.2.3.对程序所需追加部分的程序的説明

衰落F(k) 可表示为F(k)?1expj?2??f?NnD(詳細见「讲义」)编写程T?k?cos?n??n?.

序时,为了方便可把衰落分成实部和虚部.(以下,赤的斜体字 是实际程序所使用的变量.) ?首先,根据仿真条件计算fD T.(fD T的計算方法,参照讲义)

FDT = (計算所得的値)

116?将衰落分成实部和虚部(N是到来平面波的波数,可以任意设定不小于1的数,例如N=16)

fading_I (衰落的実部)?cos(2??f?16n?1DT?k?cos?n??n)

DTfading_Q(衰落的虚部)?1sin(2??f?16n?116?k?cos?n??n)

?同样,西格玛和号内的平面波也要分成实部和虚部.

T_I[N](各个平面波的実部)?cos(2??fDT?k?cos?n??n) T_Q[N](各个平面波的虚部)?sin(2??fDT?k?cos?n??n)

?这里,到来波的波数和初始相位,作为事前决定部分的变量,要先行计算.

NORM?1N?116(初始設定計算)

THETA[N]=?n(?1是0~

~2π的随机数)

2?2???n?1),PHI[N]= ?n(?n是0随机数,并且?n?1616ALPHA[N]=2??fDT?cos?n?2??FDT ?cos(THETA)

这部分相当于流程图(2)的部分.

?以下开始用上面定义的变量和初始条件来计算平面波和衰落的各个部分.

T_I[N] =cos(ALPHA[N]?k+PHI[N]) , T_Q[N] =sin(ALPHA[N]?k+PHI[N] ), fading_I =NORM × fading_Q =NORM ×

16??16N?1T_I[N] T_Q[N]

N?1这部分相当于流程图的(3)的部分.

2.2.4. 流程图(2)的「衰落的角度和相位相初始設定」

2?2???n?1) 的随机数, ?n?1616PHI[N]= ?n是(0~2π的随机数), ALPHA[N]=2??fDT?cos?n?2??FDT

FDT = (已经計算出的値), THETA[N]=?n(?1是0~

?cos(THETA[N])

预先用随机数生成?1.之后就可计算,THETA[N],ALPHA[N],PHI[N].计算时可采用一个循环来实现.循环次数N “ for (N=1; N <= 16; ++N) ”.

4

在此程序中,随机函数是调用 ”rand_ra()”函数来产生的.这个函数产生1~30000之间的任意数.首先定义double型变量,再付值(定义变量)=rand_ra()之后,就可以方便地使用了.例如需要0~1均匀分布的随机数x时,可定义rnd1=rand_ra(); x=rnd1/30000;(rnd1,x是double型变量).三角函数cos是作为数学函数,可以直接调用,如y=cos(x)那样.

2.2.5. 流程图(3)的「衰落仿真器」

T_I[N] =cos(ALPHA[N]?k+PHI[N]) , T_Q[N] =sin(ALPHA[N]?k+PHI[N] ) fading_I =NORM × fading_Q =NORM ×

16??16N?1T_I[N] T_Q[N]

N?1 计算T_I[N],T_Q[N]的时候,可使用流程图(2)的同一个循环N.在此之后,计算衰落时也可用同一循环.方法如:fading_I=fading_I+T_I[N] (虚部也如此),这样一来,西格玛和数计算就可完成了.最后不要忘记归一化(即乘以NORM),在循环完了后将fading_I和fading_Q乘以

NORM.

图仿真结果一例

5

3. 实验2

3.1. 实验2概要

在实验2中,首先做成观测空间领域衰落的仿真程序,之后进行仿真实验.(如果手头没有三位做图软件,此实验可以后有条件时自己完成). 3.2. 程序的做成

3.2.1. 流程图

初始 设定 …. (1)

参数的输入 衰落的初始角度和相位的設定

…. (2)

循环 <1> x=0~ x_max 循环 <2>

y=0 ~y_max 衰落仿真器 生成 F(x,y ) …. (3)

計算|F(x,y) | 的振幅 …. (4)

输出|F(x,y)| 循环 <2>结束 循 环 <1>结 束

按照讲义的原理,请各自编写此流程图的(2)和(3)部分.

6

3.2.2. 原程序说明

// Fading Simulator for 实验D

// Copyright by Adachi Lab., SAO Tomoki, KOBAYASHI Kazurari

/* 初始定義 */

#include #include #include #include #include #define PI 3.1415926535 PI=3.1415926535的定義

/* 随机函数 rand_ra() 的定義 */

/* rand_ra() : 返回从1到30000的随机数 */ int rand_ra() {

int r,i=0; 个定义发生1~30000的随机数

計算中如使用随机数,就调用这函数. while(i == 0){ r = rand() - 2767; if (r >= 0) break; } return r; }

/* 主程序 */ void main() {

/* 变量的定義 */ double fading,fading_I,fading_Q; double THETA[17],PHI[17]; double ramda; long double PSI; int N,x_max,y_max,X,Y; double NORM; double rnd1,rnd2;

/* 随机数表的初始化 */ srand((unsigned)time(NULL)); /* 仿真参数输入 */ 程序流图(1)的部分 printf(\scanf(\x_max,y_max:是定义仿真的最大空间範囲 printf(\scanf(\単位是cm.(输入整数)

/* 衰落初始条件的设定 */ 程序流图(2)的部分 ramda= ; NORM=sqrt(1./16.); ramda:是载波的波長.

(这里是添加的程序部分.詳細的请参照程序添加部分说明)

/* 衰落的生成 */ 程序流图(3)的部分 for (x=0;x 从x=0(cm)以1cm的步长到x_max为止 for (y=0;y从 y=0(cm)以1cm的步长到y_max

fading_I=0; fading_Q=0;

7

(这里是需要添加的程序部分.详细的请参照程序添加部分说明)

/* 归一化*/

fading_I=fading_I*NORM; fading_Q=fading_Q*NORM;

/* 衰落振幅的計算 */ 程序流图(4)的部分

fading=sqrt(pow(fading_I,2)+pow(fading_Q,2)); fading:衰落的振幅 /* 衰落振幅输出 */ printf(\ } y轴循环结束 printf(\} x轴循环结束 }

3.2.3. 程序追加部分的説明

到达地点(x,y)的N個平面波的合成波可表示为:F(x,y)?里?n(x,y)?1Nn?1?expj??n(x,y)??n?,这

Nycos?n?xsin?n?.编写程序时,将衰落的实部和虚部分开来写容易计算.

详细叙述如下:(以下,赤色斜体字为程序所使用的变量.)

?分开衰落的实部和虚部 (N为到来平面波的数目,本仿真用N=16)

fading_I (衰落的实部) ?fading_Q(衰落的虚部)?1161n?1?cos??n(x,y)??n?

1616

16n?1?sin??n(x,y)??n?

?按此思路,西格玛和内的相位的位置变化量?n(x,y)は,可表示如下.

PSI(相位的位置变化量)?ycos?n?xsin?n?

?以下是衰落的仿真的初始条件,是事前决定部分的変量,要首先算出. NORM?1N?116(初始設定計算-功率归一化)ramda=(载波的波長)

THETA[N]=?N(?1为0~π的随机数)

2?2???N?1),PHI[N]= ?N为(0~2的随机数,其后确定?N?1616这部分相当于程序流图(2)的部分. ?使用以上变量,计算衰落的部分.

PSI=(y/100.*cos(THETA[N])-x/100.*sin(THETA[N]))*2*PI/ramda , fading_I =NORM × 16?cos(PSI+PHI[N]) N?1 8

fading_Q =NORM ×

这部分相当于(3)的部分.

?16sin(PSI+PHI[N])

N?13.2.4. 程序流图(2)的「设定衰落的角度?相位的初始值」

ramda = (計算値),

THETA[N]=?N(?1是0~

2?2???N?1) 的随机数, ?N?1616PHI[N]= ?N是(0~2π的随机数)

3.2.5. 程序流图(3)的部分-「衰落仿真器」

PSI=(y/100.*cos(THETA[N])-x/100.*sin(THETA[N]))*2*PI/ramda , fading_I =NORM × fading_Q =NORM ×

16??16N?1cos(PSI+PHI[N]) sin(PSI+PHI[N])

N?1在PSI的計算式中,将x,y除以100是为了将x,y的単位统一到m上来.

备注:立体图可用gnuplot等来完成.

gnuplot表示例

9

4. 实验3

4.1. 实验3概要

在实验3中,将编写误码率测试程序,并对衰落环境的与无衰落环境的误码特性进行测试,并将所的结果进行比较. 4.2. 程序的编写

4.2.1. 程序流图

10

开始

初始条件设定 fDT,SNR的输入 …. (1)

衰落角度和相位相的初始设定

…. (2)

数据生成

a(k) …. (3)

发信信号的生成 s(k) …. (4) 衰落仿真器 F(k) …. (5)

循环 (No_symbol) 次

高斯噪音生成w(k) …. (6) 接收信号生成 r(k)=s(k)*F(k)+w(k) …. (7)

同步检波 * (k) d(k)=r(k)*F…. (8) 数据判别 if Re[d(k) ]>0 a_cd=1 else a_cd=0 误码率 測定 …. (9)

(10)

11

流程图中(2)和(5)的部分请各自独立编成.

4.2.2. 原程序说明

?程序说明文用蓝色来表示,语句说明文用绿色,它们都不是程序部分.

”2PSK-1.c”

/* 瑞利衰落仿真 */

/* Visual C++ 版 Ver. 2.10 / 2001.4.10 */ /* Adachi Lab. / SAO Tomoki */

/* 初始定義 */ #include #include #include #include

#define PI 3.1415926535 PI=3.1415926535的定義 /* 参数 No_symbols:循环次数 */ #define No_symbols 1000000 循环次数的定义.

/* 随机数产生函数 rand_ra() 的定義 */

/* rand_ra() : 返回从1到30000的随机数(only Visual C++) */ int rand_ra() { int r,i=0; while(i == 0){ r = rand() - 2767; if (r >= 0) break; } return r; }

/* 主程序 */ void main() {

/* 各変量的定義 */ double FDT, EBNR, SNR, B, AA, NORM; double fading_I, fading_Q; double ALPHA[17], PHI[17], THETA[17]; double T_I[17], T_Q [17]; double SIGNAL_I, SIGNAL_Q; double RECEIVEDSIGNAL_I, RECEIVEDSIGNAL_Q, d_I; double AWGN_I, AWGN_Q; double rnd1,rnd2,rnd3,rnd4,rnd5,rnd6; double BER_CD, BER_CD_total; int R[6],temp; int A, N, NM, k, TIME, A_CD; int ERROR,BITERROR;

/* 随机数表的初始化 */ srand((unsigned)time(NULL)); /*参数的输入 */ 流程图(1)的部分 /* fDT的输入 */

/* 变量 FDT:FDT的値 */ printf (\ 输入FDT的值 printf (\ scanf(\

12

printf (\

/* S/N的输入 */

/* 变量 EBNR:SNR(dB) SNR:SNR(真値) */ printf (\ SN比(信号対噪音的功率比,与SNR,S/N相同)的输入 scanf(\

SNR = pow(10,EBNR/10); pow(x,y):x的y次方涵数.

printf (\/* 数据生成的初始設定 */

/* 变量 BER_CD:数据错误累加器 */ BER_CD = 0; 累加器的初始化

/* PN码用 位移存储器的初始化 */ R[1]=1; R[2]=1; R[3]=1; R[4]=1; R[5]=1;

/* 变量 NORM:为使衰落的平均功率归一化*/ NORM = sqrt(1./16.); 到来波为16个 /* 衰落的角度,相位的初始花设定*/ 流程图(2)的部分

(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」)

for (k=0; k < No_symbols; k++) { 以下,复数比特发信的循环.

/* 数据a(k)的生成 用PN码生成数字序列*/ 流程图(3)的部分 /* A:发生的数字序列*/ 用PN码的生成 A = R[5]; temp = (R[2] + R[5]) % 2; R[5] = R[4]; R[4] = R[3]; R[3] = R[2]; R[2] = R[1]; R[1] = temp;

/* 2PSK信号s(k)的生成 */ 流程图(4)的部分 /* 变量 SIGNAL_I:信号s(k)的实部, SIGNAL_Q:信号s(k)的虚部 */ /* A是\时,SIGNAL_I(信号的实部)是1,\时,是-1*/ /* SIGNAL_Q(信号的虚部)は\ SIGNAL_I = 2 * A - 1; SIGNAL_Q = 0;

/* 瑞利衰落器 */ 流程图(5)的部分 fading_I = 0; fading_Q = 0; 衰落的初始

(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」)

(★无衰落时的仿真如何实现也在这里考虑★)

/* 高斯噪声w(k)的生成 */ 流程图(6)の部分 /* AWGN_I: 高斯噪声w(k)的实部 AWGN_Q: 高斯噪声w(k)的虚部 */ rnd3= rand_ra()000; rnd4= rand_ra()000; rnd5= rand_ra()000; rnd6= rand_ra()000; AA = sqrt(-2. * log((rnd3*0.0001)+(rnd4*0.00000001) + 0.000000001)); B = (rnd5* 0.0001)+(rnd6* 0.00000001); AWGN_I = AA*cos(2*PI*B);

AWGN_Q = AA*sin(2*PI*B);

/* 接收信号r(k)的生成 */ 流程图(7)の部分

/* 变量 RECEIVEDSIGNAL_I:接收信号r(k)的实部 RECEIVEDSIGNAL_Q:接收信号r(k)的虚部 */

与r(k)=s(k)*F(k)+w(k)实部和虚部相对应的计算. RECEIVEDSIGNAL_I=(SIGNAL_I*fading_I - SIGNAL_Q*fading_Q)+AWGN_I/sqrt(2*SNR); RECEIVEDSIGNAL_Q=(SIGNAL_I*fading_Q + SIGNAL_Q*fading_I)+AWGN_Q/sqrt(2*SNR); /* 同步检波*/ 流程图(8)的部分 /* 变量 d_I: 同步检波后的信号d(k)的实部*/

13

与d(k)=r(k)*F*(k)的实部和虚部相对应的计算.

但是,2PSK调制的时候,只需计算实部(虚部为0). d_I = RECEIVEDSIGNAL_I * fading_I + RECEIVEDSIGNAL_Q * fading_Q;

/* 数据判别 */ 流程图(9)的部分 /* d_I:( 同步检波后的信号d(k)的实部)为正时,A_CD(接收信号)为1,負时为0 */ if (d_I > 0.) A_CD = 1; else A_CD = 0;

/* 错误识别 */ 流程图(10)的部分 /* 变量 ERROR:传输错误时为1,传输正确时为0 */ ERROR = (A - A_CD) % 2; if (ERROR == 0) BITERROR = 0; else BITERROR = 1; /* BER_CD: 错误次数累加*/ BER_CD = BER_CD + BITERROR; }

/* 误码率(BER)的計算?输出 */ /* 变量 BER_CD_total: 误码率*/ BER_CD_total = BER_CD / No_symbols; (误码率)=(错误比特数)/(发信总比特数) printf (\ 误码率输出 }

4.2.3. 程序追加部分的説明

在实验1编写的「衰落角度和相位的初始设定」和「衰落仿真器」,可应用与本仿真程序.

但要注意,实验1「衰落角度和相位的初始设定」記述的FDT的値,在本程序中用scanf语句方式来输入.

4.3. 衰落环境下的SNR对误码率特性的測定

误码特性测定时,可以采用1dB的步长,从1dB到30dB的范围进行测定,FDT可作为比较参数来设定.

4.4. 无衰落环境下SNR对误码率特性的測定

这时只要使衰落部分的归一化功率为1就可以消除衰落的影响了,即fading_I=1和fading_Q=0

14

5. 实验4

5.1. 实验4概要

在这个实验中,编写采用分两天线分集接收的仿真程序,来测试分集接受的效果.简单起见,仍采用2PSK调制. 5.2. 程序的做成

15

5.2.1. 程序流图

开始

…. (1) 初始设定 fDT,SNR的输入 衰落的角度和相位的初始設定 …. (2) 数据生成

a(k) …. (3) 发信信号生成

s(k) …. (4) 衰落仿真器 F1(k), F2(k) …. (5)

循环 (No_symbol) 次

高斯噪声的生成 w(k) …. (6) 接收信号生成 r1 (k)=s(k)*F 1(k) 1 (k)+wr2 (k)=s(k)*F2 (k)+w2(k) 同步检波 * d1 (k)=r 1 (k)*F 1(k) d2 (k)=r2 (k)*F2*(k) …. (7)

…. (8)

误码率

測定 数据判别 if Re[d 1 (k)]>0 a_cd1=1 else a_cd 1=0 if Re[d 2 (k)]>0 a_cd2=1 else a_cd 2=0

…. (9)

如 |F1(k)| > | F2(k)| 则 a_cd1 如|F1(k)| < |F2(k)| 则 a_cd2 …. (10)

选择

16

请实验者自己完成流图的(2)和(5)的部分.

5.2.2. 原程序说明

(橘色文字的部分是在实验3的程序”2PSK-1.c”之上的追加部分)

”2PSK-2.c”

/* 瑞利国衰落仿真*/

/* Visual C++ 版 Ver. 2.10 / 2001.4.10 */ /* Adachi Lab. / SAO Tomoki */ /* 分集接收版 */

/* 初始定义 */ #include #include #include #include

#define PI 3.1415926535

/* 变量 No_symbols:循环次数 */ #define No_symbols 1000000

/* rand_ra() : 返回1到30000的随机数(only Visual C++) */ int rand_ra() { int r,i=0; while(i == 0){ r = rand() - 2767; if (r >= 0) break; } return r; }

/* 主程序 */ void main() {

/* 各个变量型的定义 */ double FDT, EBNR, SNR, B, AA, NORM; double fading_I, fading_Q; double ALPHA[17], PHI[17], THETA[17]; double T_I[17], T_Q [17]; double SIGNAL_I, SIGNAL_Q; double RECEIVEDSIGNAL_I, RECEIVEDSIGNAL_Q, d_I; double AWGN_I, AWGN_Q; double rnd1,rnd2,rnd3,rnd4; double BER_CD, BER_CD_total; int R[6],temp; int A, N, k, TIME, A_CD; int ERROR,BITERROR; double fading_I_D, fading_Q_D, AWGN_D_I, AWGN_D_Q; double fading_F,fading_F_D,fading_F_T; double T_I_D[17], T_Q_D[17]; double RECEIVEDSIGNAL_I_D, RECEIVEDSIGNAL_Q_D,d_I_D; double BER_CD_total_D,BER_CD_D; double BER_CD_total_T,BER_CD_T; double l; int A_CD_D,A_CD_T,M;

17

int ERROR_D,ERROR_T; double BITERROR_D,BITERROR_T

/* 随机数表的初期化 */ srand((unsigned)time(NULL));

/* 信道参数的输入 */

/* fD = 最大多谱勒频移, 1/T = 码速*/ /* 输入fDt */

/* 变量 FDT:FDT的値 */ printf (\ printf (\ scanf(\ printf (\

/* l:分集接收天线的位置?(距離)/(波長) */ l=0.5;

/* S/N的输入 */

/* 变量 EBNR:SNR(dB) SNR:SNR(真値) */ printf (\ scanf(\ SNR = pow(10,EBNR/10); printf (\

/* 数据生成的初始化设定 */ /* 变量 BER_CD:误码检测器 */ BER_CD = 0; BER_CD_D=0; BER_CD_T=0;

/* PN码用位移寄存器的初始化 */ R[1]=1; R[2]=1; R[3]=1; R[4]=1;

/* 变量 NORM:fading功率的归一化用*/ NORM = sqrt(1./16.);

/* 衰落的角度和相位的初始化*/

(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」) /* 主程序 */

for (k=1; k < No_symbols+1; k++) { /* 数据a(k)的生成 用PN码来生成*/ /* A:用PN码产生的信号 */ A = R[5]; temp = (R[2] + R[5]) % 2; R[5] = R[4]; R[4] = R[3]; R[3] = R[2]; R[2] = R[1]; R[1] = temp;

/* 2PSK信号s(k)的生成 */

/* 变量 SIGNAL_I:信号s(k)的实部, SIGNAL_Q:信号s(k)的虚部 */ /* A是\时,SIGNAL_I(信号的实部)为1,\时,为-1*/

/* SIGNAL_Q(信号的虚部)是\注:因为使用了2PSK调制 */ SIGNAL_I = 2 * A - 1; SIGNAL_Q = 0;

/* 瑞利衰落仿真器*/ fading_I = 0; fading_Q = 0; fading_I_D = 0; fading_Q_D = 0;

(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」)

R[5]=1;

18

/* fading_F:衰落在天线#1的振幅(絶対値), fading_F_D:衰落在天线#2的振幅(絶対値)*/ fading_F = sqrt(pow(fading_I,2)+pow(fading_Q,2)); fading_F_D = sqrt(pow(fading_I_D,2)+pow(fading_Q_D,2));

/* 高斯噪声w(k)的生成 */

/* AWGN_I: 高斯噪声w(k)的实部, AWGN_Q: 高斯噪声w(k)的虚部 */ rnd3= rand_ra()000; rnd4= rand_ra()000; rnd5= rand_ra()000; rnd6= rand_ra()000; AA = sqrt(-2. * log((rnd3*0.0001)+(rnd4*0.00000001) + 0.000000001)); B = (rnd5* 0.0001)+(rnd6* 0.00000001); AWGN_I = AA*cos(2*PI*B); AWGN_Q = AA*sin(2*PI*B); rnd3= rand_ra()000; rnd4= rand_ra()000; rnd5= rand_ra()000; rnd6= rand_ra()000; AA = sqrt(-2. * log((rnd3*0.0001)+(rnd4*0.00000001) + 0.000000001)); B = (rnd5* 0.0001)+(rnd6* 0.00000001); AWGN_D_I = AA*cos(2*PI*B); AWGN_D_Q = AA*sin(2*PI*B);

/* 接收信号r(k)的生成 */

/* 变量 RECEIVEDSIGNAL_I:#1接收信号r(k)的实部 RECEIVEDSIGNAL_Q:#1接收信号r(k)的虚部 */ /* 变量RECEIVEDSIGNAL_I_D:#2接收信号r(k) 的实部 RECEIVEDSIGNAL_Q_D:#2接收信号r(k)的虚部 */ RECEIVEDSIGNAL_I=(SIGNAL_I*fading_I - SIGNAL_Q*fading_Q)+AWGN_I/sqrt(2*SNR); RECEIVEDSIGNAL_Q=(SIGNAL_I*fading_Q + SIGNAL_Q*fading_I)+AWGN_Q/sqrt(2*SNR); RECEIVEDSIGNAL_I_D=(SIGNAL_I*fading_I_D - SIGNAL_Q*fading_Q_D)+AWGN_D_I/sqrt(2*SNR); RECEIVEDSIGNAL_Q_D=(SIGNAL_I*fading_Q_D + SIGNAL_Q*fading_I_D)+AWGN_D_Q/sqrt(2*SNR);

/* 同步检波*/

/* 变量 d_I:#1同步检波后的信号d(k)的实部*/ /* 变量 d_I_D:#2同步检波后的信号d(k)的实部*/ d_I = RECEIVEDSIGNAL_I * fading_I + RECEIVEDSIGNAL_Q * fading_Q; d_I_D = RECEIVEDSIGNAL_I_D * fading_I_D + RECEIVEDSIGNAL_Q_D * fading_Q_D;

/* 数据判别 */

/* #1のd_I:( 同步检波的实部)如果为正,A_CD(接收信号)为1,負时A_CD为0 */

/* #2のd_I_D:( 同步检波的实部)如果为正,A_CD_D(接收信号)为1,負时A_CD 为0 */ if (d_I > 0.) A_CD = 1; else A_CD = 0; if (d_I_D > 0.) A_CD_D = 1; else A_CD_D = 0; /* 分集接收信号的选择(接收信号)*/

/* 变量A_CD_T :#1的振幅fading_Fと#2的振幅fading_F_D两者相比较较大的信号一个被采用 */ if (fading_F >= fading_F_D) A_CD_T = A_CD; else A_CD_T = A_CD_D;

/* 误码判别 */

/* 变量 ERROR:#1有错误置1,无错置0 */ /* 变量 ERROR_D:#2有错误置1,无错置0 */ /* 变量 ERROR_T:分集接受信号有错误置1,无错置0*/ ERROR = (A - A_CD) % 2; ERROR_D =(A - A_CD_D) % 2; ERROR_T =(A - A_CD_T) % 2; if (ERROR == 0) BITERROR = 0.; else BITERROR = 1.; if (ERROR_D == 0) BITERROR_D = 0.; else BITERROR_D = 1.; if (ERROR_T == 0) BITERROR_T = 0.; else BITERROR_T = 1.;

19

/* BER_CD:#1的误码记数器 */ /* BER_CD_D:#2的误码记数器*/

/* BER_CD_T:分集接收信号的的误码记数器*/ BER_CD = BER_CD + BITERROR; BER_CD_D = BER_CD_D + BITERROR_D; BER_CD_T = BER_CD_T + BITERROR_T; }

/* 误码率的计算和输出 */

/* 变量 BER_CD_total:#1的误码率 */ /* 变量BER_CD_total_D:#2的误码率*/

/* 变量BER_CD_total_T:分集接收的误码率*/ BER_CD_total = BER_CD / No_symbols; BER_CD_total_D = BER_CD_D / No_symbols; BER_CD_total_T = BER_CD_T / No_symbols; printf (\\\n\ }

5.2.3. 程序追加部分的説明 各个接收点的衰落F(k) 表示如下

F(k)?l??expj2??fT?k?cos?????sin??Dnnn?(#1接收点-天线1) ?n?N??1l??(#2接收点-天线2) F(k)?expj2??fT?k?cos???-?sin??Dnnn??n?N??1这里,l是两个天线间的距离.请和讲义的原理图相对照来理解. 下面仍将衰落分成实部和虚部来表示.

(以下,赤的斜体 是实际程序中所使用的变量.)

?将衰落分成实部和虚部 (N是到来的平面波的个数,这里设为N=16)

l??cos2??fT?k?cos?????sin???Dnnn?

?16n?1??116l??fading_Q(#1衰落的虚部)?sin2??fT?k?cos?????sin?n? ??Dnn?16n?1??116l??fading_I_D (#2衰落的实部)?cos2??fT?k?cos?????sin???Dnnn?

?16n?1??116l??fading_Q_D(#2衰落的虚部)?sin2??fT?k?cos?????sin?n? ??Dnn?16n?1??fading_I (#1衰落的实部)??同理,西格码和中的平面波也表示为实部和虚部两部分.

116?sin?n? ??l??T_Q[N](各个到达#1平面波的虚部)?sin?2??fDT?k?cos?n??n??sin?n?

???T_I[N](各个到达#1平面波的实部)?cos?2??fDT?k?cos?n??n????l 20

?sin?n? ??l??T_Q_D[N](各个到达#2平面波的虚部)?sin?2??fDT?k?cos?n??n-?sin?n?

???T_I_D[N](各个到达#2平面波的实部)?cos?2??fDT?k?cos?n??n-??这里,需要事先决定的参数要先行计算.

NORM???l1N?116(在初始设定时)

THETA[N]=?n(?1是0~

2?2???n?1), 的随机数,?n?1616PHI[N]= ?n是(0~2π的随机数)

ALPHA[N]=2??fDT?cos?n?2??FDT ?cos(THETA[N]) DIVER[N] = ?l?sin?n???l? sin (THETA[N])

以上相当于流程图的(2)的部分.

?从这开始所用的变量为平面波的衰落部分的计算.

T_I[N] =cos(ALPHA[N]?k+PHI[N] +DIVER[N]) , T_Q[N] =sin(ALPHA[N]?k+PHI[N]+DIVER[N]) T_I_D[N] =cos(ALPHA[N]?k+PHI[N] -DIVER[N]) , T_Q_D[N] =sin(ALPHA[N]?k+PHI[N]-DIVER[N])

fading_I =NORM × fading_Q =NORM ×

16??16N?1T_I[N] T_Q[N] N?1fading_I_D =NORM × fading_Q_D =NORM ×

??16N?116T_I_D[N] T_Q_D[N] N?1这部分相当于流程图(5)的部分.

(a) 在「衰落的角度和相位的初始设定中」(流程图(2))如下,

THETA[N]=?n(?1是0~

的随机数)

ALPHA[N]=2??fDT?cos?n?2??FDT ?cos(THETA[N])

2?2???n?1),PHI[N]= ?n是(0~2π的随机数, ?n?1616 21

DIVER[N] = ?l?sin?n???l? sin (THETA[N])

L的値是,l=0.5λ(2个天线间的距离为0.5波長).

(b) 「衰落仿真器」(流程图(5))

T_I[N] =cos{ALPHA[N]?k+PHI[N] +DIVER[N]} , T_Q[N] =sin{ALPHA[N]?k+PHI[N]+DIVER[N]} T_I_D[N] =cos{ALPHA[N]?k+PHI[N] -DIVER[N]} , T_Q_D[N] =sin{ALPHA[N]?k+PHI[N]-DIVER[N]} fading_I =NORM × fading_Q =NORM ×

16??16N?1T_I[N] T_Q[N] N?1fading_I_D =NORM × fading_Q_D =NORM ×

??16N?116T_I_D[N] T_Q_D[N] N?1 用以前编写的程序,在把2#天线的计算追加上就成了分集接收的衰落仿真器了.

5.2.4. 如何进行仿真

程序完成后就可运行了.首先计算fD T的值,可采用实验1的同样的结果作为初始值输入.同样地SN比从0dB到30dB以2dB为步长进行,这样一来就可以测得SN对BER的特性了.将测得的特性与无衰落时的相比较,可以直观的了解衰落对误码率的影响.

5.3. 观测分集接收后的衰落F(k)的振幅和相位

用已经做成的仿真程序来观测分集接收后的衰落F(k)的振幅和相位的时间变化.

有兴趣的人可以独立继续完成这部分工作.

5.4. 观测F(k)的振幅和相位的概率密度函数.

有兴趣的人可以独立继续完成这部分工作.

22

6. 实验5

6.1. 实验5概要

实验5仿真的是在众多的到来波当中有一直射波的情况.这一直射波较其他波强,这种衰落信道被称做仲上-莱斯衰落信道.通过仿真观测振幅变化,并测定误码特性,然后和无衰落环境下的误码特性进行比较,从而理解仲上-莱斯衰落信道.

6.1. 编写观测衰落F(k)振幅的仿真程序

6.1.1. 流程图

[Start]开始 (void CJikkenDDlg::OnStartButton())

做图单 元

初始 设定衰落的角度? 相位 衰落仿真器

循环 F (k) k=0~1000 F(k) 的振幅的計算 F(k) 打印

请各自独立编成流程图的(2),(3)的部分.

(1)

(2)

…(3)

(4)

23

…… …6.1.2. 原程序的説明

以下所示为原程序框架部分.和衰落无关的部分用绿色来表示.

void CJikkenDDlg::OnStartButton() {

/* 实验4程序的沿用部分 */

/*定义以下变量来*/ int loop1,loop2; double FDT, NORM1, NORM2; double fading_I, fading_Q; double fading1_I, fading1_Q; double fading2_I, fading2_Q; double ALPHA1[17], PHI1[17], THETA1[17]; double ALPHA2, PHI2, THETA2; double T1_I[17], T1_Q[17]; double rnd1,rnd2,rnd3,rnd4; double PI=3.1415926; double K; double fading_abs,fading_log; srand( (unsigned)time( NULL ) ); CClientDC dc(this);

// 竖线 流程图(1)的部分 for (loop1 = 0; loop1 <=10; loop1=loop1+1) {dc.MoveTo (50+50*loop1,50); dc.LineTo (50+50*loop1,350);} // 横线 for (loop1 = -10; loop1 <=50; loop1=loop1+10) {dc.MoveTo (50,100+loop1*5); dc.LineTo (550,100+loop1*5);} // 初始設定 K=5.; K: K参数

/* 为使散射波与直射波的功率总和为1的归一化设定*/ /* NORM1:散射波归一化变量 */ /* NORM2:直接波归一化变量*/ NORM1=sqrt(1./16.)*sqrt(1./(K+1)); 详细的请参照后面的实验说明 NORM2=sqrt(K/(K+1));

/* 初始设定衰落的角度?相位 */ 流程图(2)的部分 //↓↓↓从这开始追加

(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」)

//↑↑↑到此为止

for (k=0; k<=1000; k++) // 以下进入循环. {

/* 衰落仿真器 */ 流程图(3)的部分

/* 初始設定 */ fading1_I = 0; fading1_Q = 0; fading2_I = 0; fading2_Q = 0; //↓↓↓从这开始追加

(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」)

24

//↑↑↑到此为止

/* 衰落振幅的計算 */ 流程图(4)的部分 fading_abs = sqrt(pow(fading_I,2)+pow(fading_Q,2)); fading_log = 20*log10(fading_abs);

/* 做图部分 */ for(loop2 =0; loop2 <=500000; loop2=loop2+1) {}; dc.SetPixel (k*0.5+50,100-fading_log*5,RGB(255,0,0)); } UpdateData(FALSE); }

25

6.1.3. 程序追加部分的说明 散射波的衰落F1(k) 可表示为F1(k)?11?expj?2??fDT?k?cos?n??n?,方?nNK?1便起见编程时将其分成实部与虚部来计算.(以下,红色斜体 为编程时使用的实际变量.)

? 首先根据实验条件计算fD T.

FDT = (計算値)

?将衰落分成实部与虚部.(N是到来平面波数,本实验设N=16)

1116fading1_I (衰落的实部)??cos?2??fDT?k?cos?n??n? ?16K?1n?1

1116fading1_Q(衰落的虚部)??sin?2??fDT?k?cos?n??n? ?16K?1n?1

?同样,西格玛和中的平面波也分成实部与虚部来表示.

T1_I[N](各个平面波的实部)?cos?2??fDT?k?cos?n??n? T1_Q[N](各个平面波的虚部)?sin?2??fDT?k?cos?n??n?

?这里,代表事前决定的部分的变量要先行计算. NORM1(于初始设定时计算)=THETA1[N]=?n(?1是0~

11 ?NK?12?2???n?1), 的随机数, ?n?1616PHI1[N]= ?n是(0~2π的随机数)

ALPHA1[N]=2??fDT?cos?n?2??FDT ?cos(THETA1[N]) 这部分相当与流程图(2)的部分.

?用以下变量来计算平面波和衰落部分.

T1_I[N] =cos{ALPHA1[N]?k+PHI1[N]} , T1_Q[N] =sin{ALPHA1[N]?k+PHI1[N] } , fading1_I =NORM1 × fading1_Q =NORM1 ×

16??16N?1T1_I[N] T1_Q[N]

N?1这部分相当于流程图(3)的部分. →散射波的衰落除了归一化参数NORM1=此,只需改变一下基本变量就可实现.

11之外,和实验1,2的手法相同,因?NK?1 26

直接波的衰落F2(k) 可表示为はF2(k)?

?将直接波衰落分成实部与虚部.

fading2_I (衰落的实部)?Kexpj?2??fDT?k?cos???? K?1Kcos?2??fDT?k?cos???? K?1

fading2_Q(衰落的虚部)?

Ksin?2??fDT?k?cos???? K?1?这里,代表事前决定的部分的变量要先行计算. NORM2(于初始设定时计算)=

K K?1THETA2=?是(0~2π的随机数),PHI2= ?是(0~2π的随机数) ALPHA2=2??fDT?cos?n?2??FDT ?cos(THETA2)

这部分相当于流程图(2)的追加部分.

?用这些变量来计算直接波的衰落.

fading2_I = NORM2 × cos(ALPHA2?k+PHI2) fading2_Q =NORM2 × sin(ALPHA2?k+PHI2)

这部分相当于流程图(3)的追加部分.

以上将散射波和直接波的衰落部分用程序变量完全的表达出来了,以下把它们和在一起就是有一个直射波情况下的仲上-莱斯衰落环境了.

fading_I = fading1_I + fading2_I fading_Q = fading1_Q + fading2_Q

6.1.4. 流程图(2)的「衰落的角度和相位的初始设定」 FDT = (計算値)

■散射波衰落的初始设定

THETA1=?n(?1是0~

2?2???n?1) 的随机数,以后 ?n?1616PHI1[N]= ?n是(0~2π的随机数)

ALPHA1[N]=2??fDT?cos?n?2??FDT ?cos(THETA1)

这些可以使用循环来求得.

27

■直射波衰落的初始设定

THETA2=?是(0~2π的随机数), PHI2= ?是(0~2π的随机数) ALPHA2=2??fDT?cos?n?2??FDT ?cos(THETA2)

6.2.5. 流程图(3)的「衰落仿真器」

■散射波衰落的计算

T1_I[N] =cos(ALPHA1[N]?k+PHI1[N]) , T1_Q[N] =sin(ALPHA1[N]?k+PHI1[N] ) fading1_I =NORM1 × ?16T1_I[N] N?1fading1_Q =NORM1 ×

?16T1_Q[N]

N?1这些可采用循环来计算.

■直射波的衰落的計算

fading2_I = NORM2 × cos(ALPHA2?k+PHI2) fading2_Q =NORM2 × sin(ALPHA2?k+PHI2)

■散射波衰落和直射波衰落的合成

fading_I = fading1_I + fading2_I fading_Q = fading1_Q + fading2_Q

6.3. 观测衰落F(k)的振幅

参照实验1.

28

6.3. 作成观测误码特性的程序

6.4.2. 流程图 开始 初始设定 …. (1)

fDT,SNR的输入 衰落角度?位相的初始设定

…. (2)数据生成

a(k) …. (3) 发信信号生成 s(k) …. (4) 衰落仿真器 F(k) 高斯噪声生成 …. (6) 循环 w(k) (No_symbol) 次 接收信号生成

r(k)=s(k)*F(k)+w(k) 同步检波 d(k)=r(k)*F * (k) …. (8) 数据判别 if Re[d(k) ]>0 a_cd=1 else a_cd=0 误 码率 测定 . (5)

. (7)

. (9)

29

………(10) 请各自作成流程图的(2)和(5)的部分.

6.4.3. 原程序说明

?提示语用蓝色表示,说明用绿色表示.

/* 瑞利衰落仿真 */

/* K-factor Version */ /* Program by SAO Tomoki, OKUNO Kousuke */

/* 初始定义 */ #include #include #include #include

#define PI 3.1415926535 PI=3.1415926535的定义 /* 变量 No_symbols:循环次数 */ #define No_symbols 1000000 循环次数的定义.

/*随机数发生的函数 rand_ra() 的定义*/

/* rand_ra() : 返回从1到30000的随机数(only Visual C++) */ int rand_ra() { int r,i=0; while(i == 0){ r = rand() - 2767; if (r >= 0) break; } return r; }

/* 主程序 */ void main() {

/* 各个变量的定义 */ double FDT, EBNR, SNR, NORM1, NORM2, AA, B; 代表的意义请参照说明 double fading_I, fading_Q; double fading1_I, fading1_Q; double fading2_I, fading2_Q; double ALPHA1[17], PHI1[17], THETA1; double ALPHA2, PHI2, THETA2; double T1_I[17], T1_Q[17]; double SIGNAL_I, SIGNAL_Q; double RECEIVEDSIGNAL_I, RECEIVEDSIGNAL_Q, d_I; double AWGN_I, AWGN_Q; double rnd1,rnd2,rnd3,rnd4,rnd5,rnd6,rnd7,rnd8,K; double BER_CD, BITERROR ,BER_CD_total; int R[6],temp; int A, N, k, TIME, A_CD; int ERROR;

/* 随机数表的初始化 */ srand((unsigned)time(NULL));

30

/*参数的输入 */ 流程图(1)的部分 /* fDt的输入 */

/* 变量 FDT:FDT的値 */ printf (\ 输入FDT printf (\ scanf(\ printf (\/* K值的输入 */ printf(\ 输入K scanf(\ printf(\/* S/N的输入 */

/* 变量 EBNR:SNR(dB) SNR:SNR(真値) */ printf (\ 输入SN比(信噪比,SNR与S/N相同) scanf(\

SNR = pow(10,EBNR/10); pow(x,y):x的y次方函数.

printf (\/* 数据生成的确初始设定 */

/* 变量 BER_CD:数据差错检测器 */ BER_CD = 0; 检测器的初始化(详细的见(10))

/* PN用移位寄存器的初始化 */ R[1]=1; R[2]=1; R[3]=1; R[4]=1; R[5]=1;

/* 使散射波与直射波的功率和为1的归一化*/ /* NORM1:散射波归一化变量 */ /* NORM2: 直射波归一化变量*/ NORM1=sqrt(1./16.)*sqrt(1./(K+1)); NORM2=sqrt(K/(K+1)); /* 衰落的角度和相位的初始设定 */ 流程图(2)的部分

(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」)

for (k=0; k < No_symbols; k++) { 以下,进入循环部分.

/*用PN码生成数据a(k) */ 流程图(3)的部分 /* A:发生的信号(发信) */ PN码生成 A = R[5]; temp = (R[2] + R[5]) % 2; R[5] = R[4]; R[4] = R[3]; R[3] = R[2]; R[2] = R[1]; R[1] = temp;

/* 2PSK信号s(k)的生成 */ 流程图(4)の部分 /* 变量 SIGNAL_I:信号s(k)的实部, SIGNAL_Q:信号s(k)的虚部 */

/* A为\时,SIGNAL_I(信号的实部)是1,为\时,SIGNAL_I(信号的实部)是-1*/ /* SIGNAL_Q(信号的虚部)为\\ SIGNAL_I = 2 * A - 1; SIGNAL_Q = 0;

/* 瑞利仿真器 */ 流程图(5)的部分 /* 初始设定 */ 衰落的初始化 fading1_I = 0; fading1_Q = 0; fading2_I = 0; fading2_Q = 0;

(这里是各自编写的程序部分.詳細的说明请参照「程序追加部分的説明」)

/* 高斯噪声w(k)的生成 */ 流程图(6)的部分 /* AWGN_I: 高斯噪声w(k)的实部 AWGN_Q: 高斯噪声w(k)的虚部 */ rnd3= rand_ra()000; rnd4= rand_ra()000; rnd5= rand_ra()000; rnd6= rand_ra()000; AA = sqrt(-2. * log((rnd3*0.0001)+(rnd4*0.00000001) + 0.000000001)); B = (rnd5* 0.0001)+(rnd6* 0.00000001);

31

AWGN_I = AA*cos(2*PI*B); AWGN_Q = AA*sin(2*PI*B);

/* 接受信号r(k)的生成 */ 流程图(7)的部分

/* 变量 RECEIVEDSIGNAL_I:接受信号r(k)的实部 RECEIVEDSIGNAL_Q:接受信号r(k)的虚部 */ 与计算r(k)=s(k)*F(k)+w(k)的实部与虚部对应. RECEIVEDSIGNAL_I=(SIGNAL_I*fading_I - SIGNAL_Q*fading_Q)+AWGN_I/sqrt(2*SNR); RECEIVEDSIGNAL_Q=(SIGNAL_I*fading_Q + SIGNAL_Q*fading_I)+AWGN_Q/sqrt(2*SNR); /* 同步检波*/ 流程图(8)的部分 /* 变量 d_I: 同步检波后的信号d(k)的实部*/ 与计算r(k)=s(k)*F(k)+w(k)的实部与虚部对应. 但2PSK只有实际部,没有虚部. d_I = RECEIVEDSIGNAL_I * fading_I + RECEIVEDSIGNAL_Q * fading_Q;

/* 数据判别 */ 流程图(9)的部分 /* d_I:(同步检波后的信号的实部)为正时,A_CD(接受信号)为1,負时为A_CD 0 */ if (d_I > 0.) A_CD = 1; else A_CD = 0;

/* 误码检测 */ 流程图(10)的部分 /* 变量 ERROR:接收信号错误时置1,正确知置0 */ ERROR = (A - A_CD) % 2; if (ERROR == 0) BITERROR = 0; else BITERROR = 1; /* BER_CD:错误次数累加 */ BER_CD = BER_CD + BITERROR; }

/* 误码率(BER)的計算和输出 */ /* 变量 BER_CD_total:误码率 */ BER_CD_total = BER_CD / No_symbols; (误码率)=(出错次数)/(发信次数) printf (\ 误码率输出 }

6.4.4. 程序追加部分的説明

参照实验1,2,3,4

6.5. SNR对误码率的測定

fD T的值确定后,在参数K=1,3,5的条件下,SNR从0dB开始到30dB以步长2dB変化来测定BER特性.数据可用各自熟悉的软件来做图.

将结果与无衰落和瑞利衰落环境下的结果相比较,从而得出实验结论.

7. 结束语

通过以上仿真实验,了解移动通信电波的传播以及衰落对误码率的影响.大家可通过这一方法,来研究各自感兴趣的实际问题.本次所涉及的仿真实验是窄带通信,宽带通信的数理模型和窄带的有所区别.但仿真实验的基本手法是一致的.

32

本文来源:https://www.bwwdw.com/article/3di7.html

Top