通信原理实验(三)数字基带信号

实验总览

主要分析单极性归零、不归零码,双极性归零、不归零码,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);

实验结果 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值