多径衰落仿真

做实验时写出来的代码,感觉会用的上,记录一下。

task1 - 计算多径衰落的时域分布。

task2 - 计算多径衰落的空间分布。

task3 - 用BPSK调制,对比有无衰落的误码率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
clear;
close all;
clc;

L = 1:1000;
N = 16;
v = 40 / 3.6;
f_c = 800e6;
C = physconst('lightspeed');
R = 9600;

ramda = C / f_c;
T = 1 / R;
FDT = v * f_c / C * T;

% --- Task 1

theta = zeros([N, 1]);
for n = 1 : N
if(n == 1)
theta(n) = rand() * 2 * pi / 16;
else
theta(n) = theta(n - 1) + rand() * 2 * pi / 16;
end
end

phi = rand([N, 1]) * 2 * pi;

alpha = 2 * pi * FDT * cos(theta);

k = 1 : 1000;

Fk = exp(1j * ((alpha * k) + phi));
Fk = sum(Fk, 1) / sqrt(N);
Fk = 20 * log10(abs(Fk));

figure(1);
plot(Fk);
xlabel('k'), ylabel('F(k)/dB');

% --- Task 2

X = 1 : 100;
Y = 1 : 100;

F = zeros(100, 100);
for x = X
for y = Y
F(x, y) = abs(sum(exp(1j * ((y / 100 * cos(theta) - x / 100 * sin(theta)) * 2 * pi / ramda + phi))) / sqrt(N));
end
end

figure(2);
mesh(F);
xlabel('x'), ylabel('y'), zlabel('F(x, y)');

% --- Task 3

snr_in_db = 0 : 20;
M = 1e6;

data = zeros([M, 1]);
for i = 1 : M
temp = rand();
if(temp > 0.5)
data(i) = 1;
else
data(i) = 0;
end
end

signal = zeros([M, 1]);

for i = 1 : M
signal(i) = 2 * data(i) - 1;
end

pf = zeros([length(snr_in_db), 1]);
for i = 1 : length(snr_in_db)
numoferr = 0;

k = 1 : M;

Fk = exp(1j * ((alpha * k) + phi));
Fk = sum(Fk, 1) / sqrt(N);

rk = awgn(signal .* Fk', snr_in_db(i));

dk = real(rk .* conj(Fk'));

for k = 1 : M
if (dk(k) > 0)
a_cd = 1;
else
a_cd = 0;
end

if (a_cd ~= data(k))
numoferr = numoferr + 1;
end
end

pf(i) = numoferr / M;
end

pa = zeros([length(snr_in_db), 1]);
for i = 1 : length(snr_in_db)
numoferr = 0;

snr = power(10, snr_in_db(i) / 10);

rk = signal + wgn(length(signal), 1, 10 * log10(1 / 2 / snr));

dk = rk;

for k = 1 : M
if (dk(k) > 0)
a_cd = 1;
else
a_cd = 0;
end

if (a_cd ~= data(k))
numoferr = numoferr + 1;
end
end

pa(i) = numoferr / M;
end

figure(3);
semilogy(snr_in_db, [pf, pa]);
grid on;
xlabel('SNR'), ylabel('BER');

运行结果

F(k)

F(x, y)

误码率对比(蓝:衰落 橙:无衰落)