1. 实验目的与实验任务

本实验使用Matlab编写脚本程序对通信系统的典型数字调制技术(ASK调制)进行蒙特卡洛仿真(不使用Simulink)。要求对ASK调制的误码性能进行仿真分析,符号间隔T=1s,载频imgimg。具体步骤如下:

① 生成二进制基带数据;

② 分别考虑2ASK、4ASK调制,将比特映射为调制符号,画出星座图;

③ 对基带符号进行载波调制,画出调制信号的波形;

④ 在AWGN信道,画出基带接收信号(相关采样之后)的星座图;

⑤ 进行信号解调,统计不同信噪比下的误符号率和误码率,画出SER~SNR和BER~SNR仿真曲线,并与理论结果进行对比验证。

2. 实验过程与结果分析

1.1 分别考虑2ASK、4ASK 调制,将比特映射为调制符号,画出星座图

img

1 2ASK 星座图

img

图 2 4ASK 星座图

1.2 对基带符号进行载波调制,画出调制信号的波形

img

3 2ASK调制波形

img

4 4ASK调制波形

1.3 在 AWGN 信道,画出基带接收信号(相关采样之后)的星座图

img

图 5 2ASK 接收信号星座图

img

图 6 4ASK接收信号星座图

1.4 进行信号解调,统计不同信噪比下的误符号率和误码率,画出 SER~SNR和 BER~SNR 仿真曲线,并与理论结果进行对比验证

img img

图 7 2ASK 的SER~SNR/ BER~SNR仿真曲线并与理论结果对比图

img img

图 8 4ASK 的SER~SNR/ BER~SNR仿真曲线并与理论结果对比图

代码

2ASK

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
clc
clear all

%% 参数定义
T = 1; %符号间隔
fc = 40/T; %载波频率
fs = 1000; %采样点数
n = 10000; %符号数
Bt_StrNumber = n; %一个比特对应了一个符号
t = linspace(0, n, n*fs); %生成离散时间序列
SNR_dB = -8:35; %信噪比(dB)
SNR = 10.^(SNR_dB/10); %线性信噪比
Ps = 0.5; %Ps=1/2*d^2;
Pn = Ps./SNR; %噪声方差

%% 生成二进制基带数据
source = round(rand(1,n));

%% 将比特映射为调制符号,画出星座图
M = 2; %载波的幅度个数
d = 1; %幅度的间隔
A = [0:M-1]*d; %𝑀个可选的幅度、及其比特映射关系
figure(1);
scatter(real(A),imag(A),'filled'); %绘制星座图
xlim([-0.1 1.1])
title('2ASK-星座图');

%% 对基带符号进行载波调制,画出调制信号的波形
ask_output = zeros(1,n*fs);%调制的信号
X = zeros(1,n);%ASK映射后
Y = zeros(1,n);%加高斯白噪声后
maptable = [0;1]; %格雷码映射
for i = 1:1:n
for m = 1:M
if isequal(source(i),maptable(m,:))
X(i) = A(m);
break;
end
end
end
for i = 1:n
index = (i-1)*fs+1:i*fs;
g(index) = 1;
ask_output(index) = X(i).*g(index).*cos(2*pi*fc.*t(index));%载波信号调制
end
figure(2);
plot(t,ask_output);%绘制调制后图像
xlim([-5,105]);
ylim([-1.5,1.5]);
title('2ASK-调制信号');

%% 在AWGN信道,画出基带接收信号(相关采样之后)的星座图
X1 = zeros(1,n);%AWGN信道判决后的符号串
Bt_Str1 = zeros(1,Bt_StrNumber);%AWGN信道比特串
ReBt_Str1 = zeros(1,Bt_StrNumber);%AWGN信道恢复编码的比特串
Z = sqrt(Pn(15)/2).*(randn(1,n)+1i.*randn(1,n));%6dB信噪比的噪声函数
Y = X+Z;%AWGN信道加噪声
figure(3);
plot(real(Y),imag(Y),'b.');
xlim([-1.5,2.5]);
ylim([-1.2,1.2]);
title('SNR=6dB 2ASK-AWGN信道星座图');
hold on;

%% 进行信号解调,画出SER~SNR和BER~SNR仿真曲线,并与理论结果进行对比验证
SER1 = zeros(1,length(SNR_dB));%AWGN信道误符号率真实值
BER1 = zeros(1,length(SNR_dB));%AWGN信道误比特率真实值
T_SER1 = zeros(1,length(SNR_dB));%AWGN信道误符号率理论值
T_BER1 = zeros(1,length(SNR_dB));%AWGN信道误比特率理论值
times = 100;%蒙特卡洛循环次数

Bt_Str1 = source; %比特映射
for j = 1:44

SER1_sum = 0;
BER1_sum = 0;

for time = 1:times %蒙特卡洛循环

source = round(rand(1,n));%随机生成二进制数据并调制
maptable = [0;1]; %格雷码映射
for i = 1:1:n
for m = 1:M
if isequal(source(i),maptable(m,:))
X(i) = A(m);
break;
end
end
end

Z = sqrt(Pn(j)/2).*(randn(1,n)+1i.*randn(1,n));%噪声函数
Y = X+Z;%AWGN信道下加噪声
for k = 1:n
if Y(k) >= 0.5
X1(k) = 1;
else
X1(k) = 0;
end
end
Bt_Str1 = source; %比特映射
SError_Num1 = length(find(source ~= X1));%误码个数
SER1(j) = SError_Num1/n;%单个噪声下的误码率
ReBt_Str1 = X1; %符号恢复成二进制比特
BError_Num1=length(find(Bt_Str1 ~= ReBt_Str1));%误比特个数
BER1(j) = BError_Num1/n;%单个噪声下的误比特率
SER1_sum = SER1_sum+SER1(j);%循环叠加
BER1_sum = BER1_sum+BER1(j);
end
SER1(j) = SER1_sum/times;
BER1(j) = BER1_sum/times;

T_SER1(j)=1/2*erfc(sqrt(SNR(j)/2));%理论值
T_BER1(j)=T_SER1(j);%理论值
end
figure(4)

semilogy(SNR_dB,SER1,'bO'); hold on;
semilogy(SNR_dB,T_SER1,'r');hold off;
axis([-8,16,10^-4,1]);
title('SER-SNR曲线');
xlabel('SNR(dB)');ylabel('误符号率SER');
legend({'SER实际值','SER理论值'});

figure(5)
semilogy(SNR_dB,BER1,'bO');hold on;
semilogy(SNR_dB,T_SER1,'r');hold off;
axis([-8,16,10^-4,1]);
title('BER-SNR曲线');
xlabel('SNR(dB)');ylabel('误码率BER');
legend({'BER实际值','BER理论值'});

4ASK

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
clc
clear all

%% 参数定义
T = 1; %符号间隔
fc = 40/T; %载波频率
fs = 1000; %采样点数
n = 10000; %符号数
t = linspace(0,n/2,n/2*fs); %生成离散时间序列
SNR_dB = -8:35;%信噪比(dB)
SNR = 10.^(SNR_dB/10);%线性信噪比
Ps = 1; %Ps=1/2*d^2;
Pn = Ps./SNR;%噪声方差

%% 生成二进制基带数据
source = round(rand(1,n));

%% 将比特映射为调制符号,画出星座图
M = 4;
d = sqrt(2/7);
A = [0:M-1]*d;
figure(1);
scatter(real(A),imag(A),'filled'); %绘制星座图
xlim([-0.2,1.8]);
title('4ASK-星座图');

%% 对基带符号进行载波调制,画出调制信号的波形
ask_output = zeros(1,n/2*fs);%调制的信号
X = zeros(1,n/2);%ASK映射后
Y = zeros(1,n/2);%加高斯白噪声后
maptable = [0 0;0 1;1 1;1 0]; %格雷码映射
for i = 1:2:n
for m = 1:4
if isequal(source(i:i+1),maptable(m,:))
X((i+1)/2) = A(m);
break;
end
end
end
for i = 1:n/2
index = (i-1)*fs+1:i*fs;
g(index) = 1;
ask_output(index) = X(i).*g(index).*cos(2*pi*fc.*t(index));%载波信号调制
end
figure(2);
plot(t,ask_output);%绘制调制后图像
xlim([-0.5,10]);
ylim([-2,2]);
title('4ASK-调制信号');

%% 在AWGN信道,画出基带接收信号(相关采样之后)的星座图
X1 = zeros(1,n/2);%AWGN信道判决后的符号串
Z = sqrt(Pn(15)/2).*(randn(size(X))+1i.*randn(size(X)));%6dB信噪比的噪声函数
Y = 1.*X+Z;%AWGN信道加噪声
figure(3);
plot(real(X),imag(X),'r*');
hold on;
plot(real(Y),imag(Y),'b.');
title('SNR=6dB 4ASK-AWGN信道星座图');
hold on;

%% 进行信号解调,画出SER~SNR和BER~SNR仿真曲线,并与理论结果进行对比验证
SER1 = zeros(1,length(SNR_dB));%AWGN信道误符号率真实值
BER1 = zeros(1,length(SNR_dB));%AWGN信道误比特率真实值
T_SER1 = zeros(1,length(SNR_dB));%AWGN信道误符号率理论值
T_BER1 = zeros(1,length(SNR_dB));%AWGN信道误比特率理论值
times = 100;%蒙特卡洛循环次数

for j = 1:44

SER1_sum = 0;
BER1_sum = 0;

for time = 1:times %蒙特卡洛循环

source = round(rand(1,n));%随机生成二进制数据并调制輻
X = zeros(1,n/2);%ASK映射后
Y = zeros(1,n/2);%加高斯白噪声后
maptable = [0 0;0 1;1 1;1 0]; %格雷码映射
for i = 1:2:n
for m = 1:4
if isequal(source(i:i+1),maptable(m,:))
X((i+1)/2) = A(m);
break;
end
end
end
Z = sqrt(Pn(j)/2).*(randn(size(X))+1i.*randn(size(X)));%噪声函数
Y = 1.*X + Z;%AWGN信道下给调制后的信号加噪声
for i = 1:length(Y)
dist = abs(Y(i)-A); %计算y到星座图各点距离
[~,ind] = min(dist); %找最近的点
X11(i) = A(ind);
X1(2*i-1:2*i) = maptable(ind,:); %估计s,X
end
[F_Num,SER1(j)] = symerr(X,X11);
[M_Num,BER1(j)] = biterr(source,X1);
SER1_sum=SER1_sum+SER1(j);
BER1_sum=BER1_sum+BER1(j);
end
SER1(j) = SER1_sum/times;
BER1(j) = BER1_sum/times;


end

T_SER1 = 0.75.*erfc(sqrt(SNR./14)); %AWGN误符号率理论值
T_BER1 = T_SER1./2;%AWGN误符号率理论值

figure(4)
semilogy(SNR_dB,SER1,'bO'); hold on;
semilogy(SNR_dB,T_SER1,'r');hold off;
axis([-8,25,10^-4,1]);
title('SER-SNR曲线');
xlabel('SNR(dB)');ylabel('误符号率SER');
legend({'SER实际值','SER理论值'});

figure(5)
semilogy(SNR_dB,BER1,'bO');hold on;
semilogy(SNR_dB,T_BER1,'r');hold off;
axis([-8,25,10^-4,1]);
title('BER-SNR曲线');
xlabel('SNR(dB)');ylabel('误码率BER');
legend({'BER实际值','BER理论值'});