实验总览
主要分析单极性归零、不归零码,双极性归零、不归零码,AMI码和HDB3码。
单极性不归零码
单极性不归零码产生
信号发生程序
function [signal, t] = SNRZ(N, Ts, L)
dt = Ts / L;
totalt = N * Ts;
wave = round(rand(1, N));
signal = zeros(1, N * L);
t = 0 : dt : totalt - dt; %得到自变量时间采样点,从0采样到totalt - dt,采样间隔为dt
for i = 1 : N
if wave(i) == 1
signal((i - 1) * L + 1 : i * L) = 1;
else
signal((i - 1) * L + 1 : i * L) = 0;
end
end
end
实验主程序
clc;clear;
%% 参数定义
N = 2000;
Ts1 = 1;
Ts2 = 0.1;
L = 200;
%% 产生码型
[SNRZ1, t1] = SNRZ(N, Ts1, L);
[SNRZ2, t2] = SNRZ(N, Ts2, L);
%% 频谱分析
HSNRZ1 = fft(SNRZ1);
HSNRZ2 = fft(SNRZ2);
n1 = length(t1);
n2 = length(t2);
nf1 = 0 : 1 / n1 : 1 - 1 / n1;
nf2 = 0 : 1 / n2 : 1 - 1 / n2;
fs1 = L / Ts1;
fs2 = L / Ts2;
f1 = nf1 * fs1;
f2 = nf2 * fs2;
%% 画图
subplot(3, 1, 1); plot(t1, SNRZ1); title('单极性不归零码时域波形 Ts = 1');
subplot(3, 1, 2); plot(f1, abs(HSNRZ1)); title('单极性不归零码频谱 Ts = 1');
subplot(3, 1, 3); plot(f2, abs(HSNRZ2)); title('单极性不归零码频谱 Ts = 0.1');
实验结果
单极性不归零码频谱中含有直流分量,没有定时信息,谱零点带宽为fB。
单极性归零码
单极性归零码产生
信号发生程序
function [signal, t] = SRZ(N, Ts, L)
dt = Ts / L;
totalt = N * Ts;
wave = round(rand(1, N));
signal = zeros(1, N * L);
t = 0 : dt : totalt - dt; %得到自变量时间采样点,从0采样到totalt - dt,采样间隔为dt
for i = 1 : N
if wave(i) == 1
signal((i - 1) * L + 1 : (i - 1 / 2) * L) = 1;
signal((i - 1 / 2) * L + 1 : i * L) = 0;
else
signal((i - 1) * L + 1 : i * L) = 0;
end
end
end
实验主程序
clc;clear;
%% 参数定义
N = 2000;
Ts1 = 1;
Ts2 = 0.1;
L = 200;
%% 产生码型
[SRZ1, t1] = SRZ(N, Ts1, L);
[SRZ2, t2] = SRZ(N, Ts2, L);
%% 频谱分析
HSRZ1 = fftshift(fft(SRZ1));
HSRZ2 = fftshift(fft(SRZ2));
n1 = length(t1);
n2 = length(t2);
nf1 = - 1 / 2 + 1 / n1 : 1 / n1 : 1 / 2;
nf2 = - 1 / 2 + 1 / n2 : 1 / n2 : 1 / 2;
fs1 = L / Ts1;
fs2 = L / Ts2;
f1 = nf1 * fs1;
f2 = nf2 * fs2;
%% 画图
subplot(3, 1, 1); plot(t1, SRZ1); title('单极性归零码时域波形 Ts = 1');
subplot(3, 1, 2); plot(f1, abs(HSRZ1)); title('单极性归零码频谱 Ts = 1');
subplot(3, 1, 3); plot(f2, abs(HSRZ2)); title('单极性归零码频谱 Ts = 0.1');
实验结果
单极性归零码含有定时信息,直流分量,谱零点带宽为2fB。
双极性不归零码
双极性不归零码产生
信号发生程序
function [signal, t] = DNRZ(N, Ts, L)
dt = Ts / L;
totalt = N * Ts;
wave = round(rand(1, N));
signal = zeros(1, N * L);
t = 0 : dt : totalt - dt; %得到自变量时间采样点,从0采样到totalt - dt,采样间隔为dt
for i = 1 : N
if wave(i) == 1
signal((i - 1) * L + 1 : i * L) = 1;
else
signal((i - 1) * L + 1 : i * L) = -1;
end
end
end
实验主程序
clc;clear;
%% 参数定义
N = 2000;
Ts1 = 1;
Ts2 = 0.1;
L = 200;
%% 产生码型
[DNRZ1, t1] = DNRZ(N, Ts1, L);
[DNRZ2, t2] = DNRZ(N, Ts2, L);
%% 频谱分析
HDNRZ1 = fft(DNRZ1);
HDNRZ2 = fft(DNRZ2);
n1 = length(t1);
n2 = length(t2);
nf1 = 0 : 1 / n1 : 1 - 1 / n1;
nf2 = 0 : 1 / n2 : 1 - 1 / n2;
fs1 = L / Ts1;
fs2 = L / Ts2;
f1 = nf1 * fs1;
f2 = nf2 * fs2;
%% 画图
subplot(3, 1, 1); plot(t1, DNRZ1); title('双极性不归零码时域波形 Ts = 1');
subplot(3, 1, 2); plot(f1, abs(HDNRZ1)); title('双极性不归零码频谱 Ts = 1');
subplot(3, 1, 3); plot(f2, abs(HDNRZ2)); title('双极性不归零码频谱 Ts = 0.1');
实验结果
双极性不归零码没有直流分量,没有定时信息,谱零点带宽为fB。
双极性归零码
双极性归零码产生
信号发生程序
function [signal, t] = DRZ(N, Ts, L)
dt = Ts / L;
totalt = N * Ts;
wave = round(rand(1, N));
signal = zeros(1, N * L);
t = 0 : dt : totalt - dt; %得到自变量时间采样点,从0采样到totalt - dt,采样间隔为dt
for i = 1 : N
if wave(i) == 1
signal((i - 1) * L + 1 : (i - 1 / 2) * L) = 1;
signal((i - 1 / 2) * L + 1 : i * L) = 0;
else
signal((i - 1) * L + 1 : (i - 1 / 2) * L) = -1;
signal((i - 1 / 2) * L + 1 : i * L) = 0;
end
end
end
实验主程序
clc;clear;
%% 参数定义
N = 2000;
Ts1 = 1;
Ts2 = 0.1;
L = 200;
%% 产生码型
[DRZ1, t1] = DRZ(N, Ts1, L);
[DRZ2, t2] = DRZ(N, Ts2, L);
%% 频谱分析
HDRZ1 = fft(DRZ1);
HDRZ2 = fft(DRZ2);
n1 = length(t1);
n2 = length(t2);
nf1 = 0 : 1 / n1 : 1 - 1 / n1;
nf2 = 0 : 1 / n2 : 1 - 1 / n2;
fs1 = L / Ts1;
fs2 = L / Ts2;
f1 = nf1 * fs1;
f2 = nf2 * fs2;
%% 画图
subplot(3, 1, 1); plot(t1, DRZ1); title('双极性归零码时域波形 Ts = 1');
subplot(3, 1, 2); plot(f1, abs(HDRZ1)); title('双极性归零码频谱 Ts = 1');
subplot(3, 1, 3); plot(f2, abs(HDRZ2)); title('双极性归零码频谱 Ts = 0.1');
实验结果
双极性归零码不含直流分量,不含定时信息,谱零点带宽为2fB。
AMI码
AMI码简介
AMI码就是将1码元以+1,-1电平交替的形式来表示,0码元保持用0电平表示,这样可以得到一个不含有直流分量的基带码型。
AMI码产生
信号发生程序
function [signal, t] = AMI(N, Ts, L)
count = 0;
dt = Ts / L;
totalt = N * Ts;
wave = round(rand(1, N));
signal = zeros(1, N * L);
t = 0 : dt : totalt - dt; %得到自变量时间采样点,从0采样到totalt - dt,采样间隔为dt
for i = 1 : N
if wave(i) == 1 && mod(count, 2) == 0
wave(i) = 1;
count = count + 1;
elseif wave(i) == 1 && mod(count, 2) == 1
wave(i) = -1;
count = count + 1;
end
end
for i = 1 : N
if wave(i) == 1
signal((i - 1) * L + 1 : i * L) = 1;
elseif wave(i) == -1
signal((i - 1) * L + 1 : i * L) = -1;
elseif wave(i) == 0
signal((i - 1) * L + 1 : i * L) = 0;
end
end
end
实验主程序
clc;clear;
%% 参数定义
N = 2000;
Ts1 = 1;
Ts2 = 0.1;
L = 200;
%% 产生码型
[AMI1, t1] = AMI(N, Ts1, L);
[AMI2, t2] = AMI(N, Ts2, L);
%% 频谱分析
HAMI1 = fft(AMI1);
HAMI2 = fft(AMI2);
n1 = length(t1);
n2 = length(t2);
nf1 = 0 : 1 / n1 : 1 - 1 / n1;
nf2 = 0 : 1 / n2 : 1 - 1 / n2;
fs1 = L / Ts1;
fs2 = L / Ts2;
f1 = nf1 * fs1;
f2 = nf2 * fs2;
%% 画图
subplot(3, 1, 1); plot(t1, AMI1); title('AMI码时域波形 Ts = 1');
subplot(3, 1, 2); plot(f1, abs(HAMI1)); title('AMI码频谱 Ts = 1');
subplot(3, 1, 3); plot(f2, abs(HAMI2)); title('AMI码频谱 Ts = 0.1');
实验结果
实验结果标明AMI码没有直流分量,没有定时信息,谱零点带宽为fB。
HDB3码
HDB3码简介
编码
HDB3码是在AMI码上的改进,解决了长连0的问题,基本操作是先将基带码型变为AMI码,如果有四个连0,就将第四个0改为符号V(正负交替+V,-V),后续也如此操作,之后还要保证V符号的正负与前面第一个非0码元正负相同,如果不相同,类似+1000-V,那么就改为+1-B00-V,保证1、V、B符号都正负交替并且最长连0数为3。
译码
本实验采用二进制系统传输,那么V、B的值也是1,那么只需要看编码后1码元是否正负交替出现,从第一个非0码元开始,如果第二个非零码元相对于前面一个非零码元不是异号,那么就将这个码元置0,假设这个码元的位置是k,那么低k-3个码元也置0,然后再进行此操作,即可完成译码。
HDB3码产生
信号发生程序
function [signal, origin_signal, wave, t] = HDB3(N, Ts, L)
count_one = 0;
count_zero = 0;
count = 0;
dt = Ts / L;
totalt = N * Ts;
wave = round(rand(1, N));
origin_wave = wave;
signal = zeros(1, N * L);
t = 0 : dt : totalt - dt; %得到自变量时间采样点,从0采样到totalt - dt,采样间隔为dt
%% 让1码 +1,-1交替
for i = 1 : N
if wave(i) == 1 && mod(count_one, 2) == 0
wave(i) = 1;
count_one = count_one + 1;
elseif wave(i) == 1 && mod(count_one, 2) == 1
wave(i) = -1;
count_one = count_one + 1;
end
end
%% 统计最长连0,让最长连0将为3,并让改变符号的0与前面第一个非0码同号
for i = 1 : N
if wave(i) == 0
count_zero = count_zero + 1;
if mod(count_zero, 4) == 0
count = count + 1;
if mod(count, 2) == 1
wave(i) = 1;
if wave(i - 4) == -1
wave(i - 3) = 1;
end
elseif mod(count, 2) == 0
wave(i) = -1;
if wave(i - 4) == 1
wave(i - 3) = -1;
end
end
end
elseif wave(i) == 1 || wave(i) == -1
count_zero = 0;
end
end
%%
for i = 1 : N
if wave(i) == 1
signal((i - 1) * L + 1 : i * L) = 1;
elseif wave(i) == -1
signal((i - 1) * L + 1 : i * L) = -1;
elseif wave(i) == 0
signal((i - 1) * L + 1 : i * L) = 0;
end
end
%%
for i = 1 : N
if origin_wave(i) == 1
origin_signal((i - 1) * L + 1 : i * L) = 1;
elseif origin_wave(i) == 0
origin_signal((i - 1) * L + 1 : i * L) = 0;
end
end
end
实验主程序
clc;clear;
%% 参数定义
N = 20;
Ts1 = 1;
Ts2 = 0.1;
L = 200;
%% 产生码型
[HDB31, origin_signal1, wave1, t1] = HDB3(N, Ts1, L);
[HDB32, origin_signal2, wave2, t2] = HDB3(N, Ts2, L);
%% HDB3译码
% [signals, symbols, t] = decode_HDB3(wave1, Ts1, L);
%% 频谱分析
HHDB31 = fft(HDB31);
HHDB32 = fft(HDB32);
n1 = length(t1);
n2 = length(t2);
nf1 = 0 : 1 / n1 : 1 - 1 / n1;
nf2 = 0 : 1 / n2 : 1 - 1 / n2;
fs1 = L / Ts1;
fs2 = L / Ts2;
f1 = nf1 * fs1;
f2 = nf2 * fs2;
%% 画图
figure(1)
subplot(3, 1, 1); plot(t1, HDB31); title('HDB3码时域波形 Ts = 1');
subplot(3, 1, 2); plot(f1, abs(HHDB31)); title('HDB3码频谱 Ts = 1');
subplot(3, 1, 3); plot(f2, abs(HHDB32)); title('HDB3码频谱 Ts = 0.1');
figure(2)
subplot(3, 1, 1); plot(t1, origin_signal1); title('原始码元波形 Ts = 1');
subplot(3, 1, 2); plot(t1, HDB31); title('HDB3码时域波形 Ts = 1');
% subplot(3, 1, 3); plot(t1, signals); title('译码后波形 Ts = 1');
实验结果
码型变换前后
可以看到,在12s-17s区间有5个连0,编码后这段变为(+1)000+1,符合预期结果。
频谱
可以看出,HDB3码无直流分量,因为HDB3码各个非0码符号都是正负交替出现,没有定时信息,谱零点带宽为fB。
HDB3码译码
译码原理已在HDB3码简介中给出
译码程序
function [signals, symbols, t] = decode_HDB3(x, Ts, L)
lengthx = length(x);
for k = 2 : lengthx
if x(k) ~= 0
i = k - 1;
while x(i) == 0 && i ~= 1 %防止开头就有超三个连0,导致之后回溯是无止境回溯,如果到开头还是没找到1
%就考虑是这种情况,就不再查找。
i = i - 1;
end
if x(i) == x(k)
x(k) = 0;
x(k - 3) = 0;
end
end
end
symbols = x;
dt = Ts / L;
totalt = lengthx * Ts;
signals = zeros(1, lengthx * L);
t = 0 : dt : totalt - dt; %得到自变量时间采样点,从0采样到totalt - dt,采样间隔为dt
for i = 1 : lengthx
if symbols(i) == 1 || symbols(i) == -1
signals((i - 1) * L + 1 : i * L) = 1;
else
signals((i - 1) * L + 1 : i * L) = 0;
end
end
实验主程序
clc;clear;
%% 参数定义
N = 30;
Ts1 = 1;
Ts2 = 0.1;
L = 200;
%% 产生码型
[HDB31, origin_signal1, wave1, t1] = HDB3(N, Ts1, L);
[HDB32, origin_signal2, wave2, t2] = HDB3(N, Ts2, L);
%% HDB3译码
[signals, symbols, t] = decode_HDB3(wave1, Ts1, L);
%% 频谱分析
HHDB31 = fft(HDB31);
HHDB32 = fft(HDB32);
n1 = length(t1);
n2 = length(t2);
nf1 = 0 : 1 / n1 : 1 - 1 / n1;
nf2 = 0 : 1 / n2 : 1 - 1 / n2;
fs1 = L / Ts1;
fs2 = L / Ts2;
f1 = nf1 * fs1;
f2 = nf2 * fs2;
%% 画图
figure(1)
subplot(3, 1, 1); plot(t1, HDB31,'LineWidth', 1.2); title('HDB3码时域波形 Ts = 1');
subplot(3, 1, 2); plot(f1, abs(HHDB31),'LineWidth', 1.2); title('HDB3码频谱 Ts = 1');
subplot(3, 1, 3); plot(f2, abs(HHDB32),'LineWidth', 1.2); title('HDB3码频谱 Ts = 0.1');
figure(2)
subplot(3, 1, 1); plot(t1, origin_signal1,'LineWidth', 1.2); title('原始码元波形 Ts = 1');
subplot(3, 1, 2); plot(t1, HDB31,'LineWidth', 1.2); title('HDB3码时域波形 Ts = 1');
subplot(3, 1, 3); plot(t1, signals,'LineWidth', 1.2); title('译码后波形 Ts = 1');
error = sum(origin_signal1 - signals);
实验结果