matlab实现码型转换——AMI码、HDB3码、BPH码、CMI码

理论部分内容学完之后再更新,本文主要是根据码型转换的规则,使用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
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
%% 实现码型转换;并绘制出相应的图形
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;
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);
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 2*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 2*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 2*length(code_HDB3) -1.5 1.5]);
title('HDB3码');
break;
else
fprintf('输入格式错误,请重新选择\n');
end
end

演示

以输入[1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0]为例

输入界面

码型总览

结语

本文在仓促之下完成,文章内容如若有错,望在评论中斧正,万分感激。

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