通信原理实验课matlab仿真汇总

本文目前主要是放置matlab 的仿真程序,实验内容的理论部分抽空更新。

幅度调制与解调

仿真程序

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
%-----------------------
% 调制信号
t=-1:0.00001:1;
A1=5; %调制信号振幅
f=3; %调制信号频率
w0=2*f*pi;
mes=A1*cos(w0*t); %调制信号
subplot(3,2,1);
plot(t,mes);
xlabel('t');
title('调制信号');
subplot(3,2,2);
Y2=fft(mes); % 对调制信号进行傅里叶变换
plot(abs(Y2));
title('调制信号频谱');
axis([198000,202000,0,1000000]);

%-------------------
% 载波
t=-1:0.00001:1;
A0=10; %载波信号振幅
f=3000; %载波信号频率
w0=2*f*pi;
Uc=A0*cos(w0*t); %载波信号
figure(1);
subplot(3,2,3);
plot(t,Uc);
title('载频信号波形');
axis([0,0.01,-15,15]);
subplot(3,2,4);
Y1=fft(Uc); %对载波信号进行傅里叶变换
plot(abs(Y1));
title('载波信号频谱');
axis([5800,6200,0,1000000]);

%---------------------------
% AM调制
t=-1:0.00001:1;
A0=10; %载波信号振幅
A1=5; %调制信号振幅
A2=3; %已调信号振幅
f=3000; %载波信号频率
w0=2*f*pi;
m=0.15; %调制度
mes=A1*cos(0.001*w0*t); %消调制信号
Uam=A2*(1+m*mes).*cos((w0).*t); %AM 已调信号
subplot(3,2,5);
plot(t,Uam);
grid on;
title('AM调制信号波形');
subplot(3,2,6);
Y3=fft(Uam); % 对AM已调信号进行傅里叶变换
plot(abs(Y3)),grid;
title('AM调制信号频谱');
axis([5950,6050,0,500000]);

%----------------------------
% 正常 ,临界 过载

Uam_over=A2*(0.5+m*mes).*cos((w0).*t);
Uam_lin=A2*(1+m*mes).*cos((w0).*t);
Uam_true=A2*(1.5+m*mes).*cos((w0).*t);

figure;
subplot(3,1,1);
plot(t,Uam_true);
grid on;
title('AM调制正常');

subplot(3,1,2);
plot(t,Uam_lin);
title('AM调制临界');

subplot(3,1,3);
plot(t,Uam_over);
title('AM调制过调');

仿真结果展示

基带传输编译码——AMI,HDB3,BPH/CMI

仿真程序

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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
%% 实现码型转换;并绘制出相应的图形
clc;
clear;
sym x ;
sym flag;
code = input('请输入你的消息码\n 如:[1 0 0 1]\n切勿输入非 0 或 1的数值\n');
x = 1;
flag = 0;
while 1
for x = 1:length(code)
if code(x) ~= 0 && code(x)~=1
fprintf('输入格式有误,请重新输入\n');
flag = 1;
break;
else
flag = 0;
end
end

if(flag == 1)
code = input('请输入你的消息码\n 如:[1 0 0 1]\n切勿输入非 0 或 1的数值\n');
else
break;
end
end



%% AMI码; 规则 1 正负交替 +1 -1 +1 -1; 0 保持不变;
i = 1;
sym k;
sym code_AMI;
code_AMI =zeros(1,length(code));
for k=1:1:length(code)
if code(k) == 1
i = i+1;
end
if code(k) == 1 && rem(i,2)== 0
code_AMI(k) = -code(k);
else
code_AMI(k) = code(k);
end
end

%% BPH码 1用10表示;0用01表示
sym k;
sym code_BPH;
code_BPH = zeros(1,length(code));
sym k2;
k2 = 1;
for k=1:1:length(code)
if code(k) == 1
code_BPH(k2) = 1;
code_BPH(k2+1) = 0;
else
code_BPH(k2) = 0;
code_BPH(k2+1) = 1;
end
k2 = k2+2;
end

%% CMI码 1 用 11和00 交替出现;0 固定用01表示

i = 1;
sym k;
sym code_CMI;
code_CMI = zeros(1,length(code));
sym k3;
k3 = 1;
for k=1:1:length(code)
if code(k) == 1
i = i+1;
end
if code(k) == 1
if rem(i,2)== 0
code_CMI(k3) = 1;
code_CMI(k3+1) = 1;
else
code_CMI(k3) = 0;
code_CMI(k3+1) = 0;
end
else
code_CMI(k3) = 0;
code_CMI(k3+1) = 1;
end
k3 = k3+2;
end


%% HDB3码
%1、连0的个数不超过3时,规则与AMI相同,即0不变,1变为-1、+1交替;
%2、若连0的个数超过3,则将每4个0看作一小节,定义为B00V,B可以是-1、0、+1,V可以是-1、+1;
%3、B和V具体值满足以下条件:V和前面相邻非0符号极性相同;不看V时极性交替;V与V之间极性交替;

code_HDB3=zeros(1,length(code));
last_y=-1; %设定初始值,低电平开始
last_v=-1;
zero_flag=0;
for i=1:length(code)
if(code(i)==1)
code_HDB3(i)=-last_y;
last_y=code_HDB3(i);
zero_flag=0;
else
code_HDB3(i)=0;
zero_flag=zero_flag+1; %%数0的个数
end
if(zero_flag==4)
if(last_y==last_v)
code_HDB3(i-3)=-last_y;
code_HDB3(i)=code_HDB3(i-3);
last_y=code_HDB3(i);
last_v=code_HDB3(i);
else
code_HDB3(i)=last_y;
last_y=code_HDB3(i);
last_v=code_HDB3(i);
end
zero_flag=0;
end
end
%% ------- 绘图 --------
sym ami;
sym code_out;
sym bph;
sym cmi;
sym hdb3;

% 输出波形初始化
ami=zeros(1,length(code));
code_out=zeros(1,length(code));
bph=zeros(1,2*length(code));
cmi=zeros(1,2*length(code));
hdb3=zeros(1,length(code));

t0=100;
t=0:1/t0:length(code);
for i=1:length(code)
for j=1:t0
ami((i-1)*t0+j)=code_AMI(i)*cos(pi*0.1*j);
ami((i-1)*t0+j)=code_AMI(i);
code_out((i-1)*t0+j)=code(i);
hdb3((i-1)*t0+j)=code_HDB3(i);
end
end

sym i2;
t1=100;
t2=0:1/t0:2*length(code);
for i2=1:2*length(code)
for j2=1:t1
bph((i2-1)*t1+j2)=code_BPH(i2);
cmi((i2-1)*t1+j2)=code_CMI(i2);
end
end

hdb3=[hdb3,hdb3(i*t0)];
code_out=[code_out,code_out(i*t0)];
ami =[ami,ami(i*t1)];
cmi =[cmi,cmi(i*t1)];
bph =[bph,bph(i*t0)];


%% ------- 输出 --------
while(1)
choose = input('请选择您需要的码型转换\n 1.AMI码\n 2.BPH码\n 3.CMI码\n 4.HDB3码\n 5.全部码型均输出\n');
if choose == 1
code_AMI
figure();
plot(t,zeros(1,length(t)),'LineWidth',1);hold on
plot(t,ami,'LineWidth',2);
grid on
axis([0 length(code_AMI) -1.5 1.5]);
title('AMI码');
break;
elseif choose == 2
code_BPH
figure();
plot(t2,zeros(1,length(t2)),'LineWidth',1);hold on
plot(t2,bph,'LineWidth',2);
grid on
axis([0 length(code_BPH) -0.5 1.5]);
title('BPH码');
break;
elseif choose == 3
code_CMI
figure();
plot(t2,zeros(1,length(t2)),'LineWidth',1);hold on
plot(t2,cmi,'LineWidth',2);
grid on
axis([0 length(code_CMI) -0.5 1.5]);
title('CMI码');
break;
elseif choose == 4
code_HDB3
figure();
plot(t,zeros(1,length(t)),'LineWidth',1);hold on
plot(t,hdb3,'LineWidth',2);
grid on
axis([0 length(code_HDB3) -1.5 1.5]);
title('HDB3码');
break;
elseif choose == 5
code_AMI
code_BPH
code_CMI
code_HDB3

figure();
subplot(5,1,1);
plot(t,zeros(1,length(t)),'LineWidth',1);hold on
plot(t,code_out,'LineWidth',2);
grid on
axis([0 length(code) -1.5 1.5]);
title('输入的消息码');

subplot(5,1,2);
plot(t,zeros(1,length(t)),'LineWidth',1);hold on
plot(t,ami,'LineWidth',2);
grid on
axis([0 length(code_AMI) -1.5 1.5]);
title('AMI码');

subplot(5,1,4);
plot(t2,zeros(1,length(t2)),'LineWidth',1);hold on
plot(t2,bph,'LineWidth',2);
grid on
axis([0 length(code_BPH) -0.5 1.5]);
title('BPH码');

subplot(5,1,5);
plot(t2,zeros(1,length(t2)),'LineWidth',1);hold on
plot(t2,cmi,'LineWidth',2);
grid on
axis([0 length(code_CMI) -0.5 1.5]);
title('CMI码');

subplot(5,1,3);
plot(t,zeros(1,length(t)),'LineWidth',1);hold on
plot(t,hdb3,'LineWidth',2);
grid on
axis([0 length(code_HDB3) -1.5 1.5]);
title('HDB3码');
break;
else
fprintf('输入格式错误,请重新选择\n');
end
end

仿真结果展示

基带数字调制——ASK,FSK,PSK

仿真程序

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
135
136
137
138
139
140
%  ASK,PSK,BPSK 调制
clc;
clear;
sym x ;
sym flag;
code = input('请输入你的消息码\n 如:[1 0 0 1]\n切勿输入非 0 或 1的数值\n');
x = 1;
flag = 0;
while 1
for x = 1:length(code)
if code(x) ~= 0 && code(x)~=1
fprintf('输入格式有误,请重新输入\n');
flag = 1;
break;
else
flag = 0;
end
end

if(flag == 1)
code = input('请输入你的消息码\n 如:[1 0 0 1]\n切勿输入非 0 或 1的数值\n');
else
break;
end
end
%输入的波形
sym i;
sym j;
sym code_out;
t0=100;
code_out = zeros(1,length(code)*t0);
for i=1:length(code)
for j=1:t0
code_out((i-1)*t0+j)=code(i);
end
end


% ASK 调制
sym code_ASK;
code_ASK = zeros(1,length(code)*t0);
for i=1:length(code)
for j=1:t0
if code(i)==1
code_ASK((i-1)*t0+j)=sin(pi*0.02*j);
else
code_ASK((i-1)*t0+j)=0;
end
end
end

% FSK
sym code_FSK;
code_FSK = zeros(1,length(code)*t0);
for i=1:length(code)
for j=1:t0
if code(i)==1
code_FSK((i-1)*t0+j)=sin(pi*0.02*j);
else
code_FSK((i-1)*t0+j)=sin(pi*0.04*j);
end
end
end


%PSK
sym code_PSK;
code_PSK = zeros(1,length(code)*t0);
t=0:1/t0:length(code);
for i=1:length(code)
for j=1:t0
if code(i)==1
code_PSK((i-1)*t0+j)=sin(pi*0.02*j);
else
code_PSK((i-1)*t0+j)=sin(pi*0.02*j+pi);
end
end
end

t=1/100:1/t0:length(code);
while(1)
choose = input('请选择您需要的调制方式\n 1.ASK码\n 2.FSK码\n 3.PSK码\n 4.选择全部\n');
if choose == 1
figure();
plot(t,zeros(1,length(t)),'LineWidth',1);hold on
plot(t,code_ASK,'LineWidth',2);
grid on
axis([0 length(code) -1.5 1.5]);
title('ASK调制');
break;
elseif choose == 2
figure();
plot(t2,zeros(1,length(t2)),'LineWidth',1);hold on
plot(t2,code_FSK,'LineWidth',2);
grid on
axis([0 length(code) -0.5 1.5]);
title('FSK调制');
break;
elseif choose == 3
figure();
plot(t2,zeros(1,length(t2)),'LineWidth',1);hold on
plot(t2,code_PSK,'LineWidth',2);
grid on
axis([0 length(code) -0.5 1.5]);
title('PSK调制');
break;
elseif choose == 4
figure();
subplot(4,1,1);
plot(t,zeros(1,length(t)),'LineWidth',1);hold on
plot(t,code_out,'LineWidth',2);
grid on
axis([0 length(code) -1.5 1.5]);
title('输入的源码');

subplot(4,1,2);
plot(t,zeros(1,length(t)),'LineWidth',1);hold on
plot(t,code_ASK,'LineWidth',2);
grid on
axis([0 length(code) -1.5 1.5]);
title('ASK调制');

subplot(4,1,3);
plot(t,zeros(1,length(t)),'LineWidth',1);hold on
plot(t,code_FSK,'LineWidth',2);
grid on
axis([0 length(code) -1.5 1.5]);
title('FSK调制');

subplot(4,1,4);
plot(t,zeros(1,length(t)),'LineWidth',1);hold on
plot(t,code_PSK,'LineWidth',2);
grid on
axis([0 length(code) -1.5 1.5]);
title('PSK调制');
break;
else
fprintf('输入格式错误,请重新选择\n');
end
end

仿真结果展示

请我喝杯咖啡~
------ 本文结束------
0%