通信原理实验(六)PCM、DPCM基带和带通通信系统

实验总览

主要是利用PCM和DPCM信源编码技术,利用数字技术来传输模拟信号,整个通信系统包括信源、信源编码、调制器、信道、解调器、信源译码、信宿。

PCM基带、带通通信系统

PCM信源编码技术

简介

信源编码主要包括采样,量化,编码。

采样需要满足采样定理,即采样频率要大于被采样信号最高频率的两倍。

量化包括均匀量化和非均匀量化,本次实验采用A律13折线非均匀量化。

本实验中编码采用基于A律13折线的1位极性码、3位段落码、4位段内码组成的8位编码。

采样部分

采样部分直接使用信号产生程序,产生的序列相当于是原始序列的理想采样序列。

量化编码部分

将量化、编码整合成一个部分,根据编码规律,写出以下编码程序

前置程序1.十进制转4位二进制(对应4位段内码)

function temp = d2b(x)
    temp = zeros(1, 4);
    for k = 4 : -1 :  1
        temp(k) = mod(x, 2);
        x = floor(x / 2);
    end
end

量化编码主程序

function [codex, y] = quantify_c(x)
    maxim = max(abs(x));
    y = x / maxim;
    y = y * 2048;
    y_abs = abs(y);
    L = 8; %编码长度
    N = length(x); %采样电平个数
    code = zeros(N, L);
    for i = 1 : N
        if y(i) >= 0
            code(i, 1) = 1;
        elseif y(i) < 0
            code(i, 1) = 0;
        end
        
        if y_abs(i) < 16
            code(i, 2 : 4) = [0, 0, 0];
            temp = floor(y_abs(i) / 1);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 32
            code(i, 2 : 4) = [0, 0, 1];
            y_abs(i) = y_abs(i) - 16;
            temp = floor(y_abs(i) / 1);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 64
            code(i, 2 : 4) = [0, 1, 0]; 
            y_abs(i) = y_abs(i) - 32;
            temp = floor(y_abs(i) / 2);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 128
            code(i, 2 : 4) = [0, 1, 1];
            y_abs(i) = y_abs(i) - 64;
            temp = floor(y_abs(i) / 4);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 256
            code(i, 2 : 4) = [1, 0, 0];
            y_abs(i) = y_abs(i) - 128;
            temp = floor(y_abs(i) / 8);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 512
            code(i, 2 : 4) = [1, 0, 1];
            y_abs(i) = y_abs(i) - 256;
            temp = floor(y_abs(i) / 16);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 1024
            code(i, 2 : 4) = [1, 1, 0];
            y_abs(i) = y_abs(i) - 512;
            temp = floor(y_abs(i) / 32);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 2048
            code(i, 2 : 4) = [1, 1, 1];
            y_abs(i) = y_abs(i) - 1024;
            temp = floor(y_abs(i) / 64);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) == 2048
            code(i, 2 : 8) = [1, 1, 1, 1, 1, 1, 1];
        end
    end
    for k = 1 : N
        codex(1 + (k - 1) * L : k * L) = code(k, :);
    end
end












            

 A律13折线编码的横坐标是采样电平的归一化电平的Δ单位表示,需要先将采样的电平进行归一化处理,并且用Δ单位代替归一化电平,1 = 2048Δ。

译码部分

译码就是将编码好的序列重新恢复为量化电平,译码规律需要满足A律13折线采用的8位码。

具体程序如下

子程序1.二进制转十进制程序

function value = b2d(x)
    lengthx = length(x);
    value = 0;
    for k = 1 : lengthx
        value = value + x(k) * 2 ^ (lengthx - k);
    end
end

子程序2.SNRZ码抽样判决子程序

function symbols = sj_SNRZ(signal, TB, fs)
    L = length(signal);
    N = L / TB / fs;
    n = TB * fs;
    symbols = zeros(1, N);
    starttime = TB * fs/ 2;
    minim = min(signal);
    maxm = max(signal);
    maxm = max(abs(minim), abs(maxm));
    level = 0.5 * maxm;
    for k = 1 : N
        samplinglevel = signal(starttime + (k - 1) * n);
        if samplinglevel > level
            symbols(k) = 1;
        elseif samplinglevel < level
            symbols(k) = 0;
        end
    end
end

因为在基带传输中本实验采用的是SNRZ码,防止与DPSK解调混淆,单独写一个SNRZ码抽样判决程序。

子程序3.DPSK解调后产生的基带信号抽样判决子程序

function symbols = sj(signal, TB, fs)
    L = length(signal);
    N = L / TB / fs;
    n = TB * fs;
    symbols = zeros(1, N);
    starttime = TB * fs/ 2;
    minim = min(signal);
    maxm = max(signal);
    minim = min(abs(minim), abs(maxm));
    level = 0.2 * minim;
    for k = 1 : N
        samplinglevel = signal(starttime + (k - 1) * n);
        if samplinglevel > level
            symbols(k) = 0;
        elseif samplinglevel < -level
            symbols(k) = 1;
        end
    end
end

因为DPSK解调后产生的是有正负极性的基带信号,并且本实验1码对应pi相位,0码对应0相位,所以1码对应的是负电平,0码对应正电平,与SNRZ不同。 

译码子程序

function [signal, endblock, numinblock, block, inblock] = decoding_pcm(x)
    L = 8; % 编码长度
    N = length(x); % 总编码长度
    n = N / L; % 一共多少个采样点
    y = zeros(n, L);
    for k = 1 : n
        y(k, :) = x(1 + (k - 1) * L : k * L);
    end
    x = y;
    signal = zeros(1, n);
    for k = 1 : n
        block = b2d(x(k, 2 : 4)); % 编号为几的段落
        inblock = b2d(x(k, 5 : 8));% 编号为几的段内
        numinblock = 15 - inblock + 0.5;
        endblock = (2 ^ 4) * (2 ^ block);
        if block == 0 || block == 1
            facto = 1;
        else
            facto = 2 ^ (block - 1);
        end
        signal(k) = endblock - facto * numinblock;
        polar = b2d(x(k, 1));
        if polar == 0
            signal(k) = - signal(k);
        end
    end
end

由极性码得知采样电平的正负,由3位段落码得知采样电平在第几段 ,由4位段内码得知采样电平落在这个段落的第几个子段,然后把该码译为这个子段中间代表的电平(以Δ为单位的电平),然后在后续程序中将Δ单位转换为归一化电平,再去归一化,就处理完毕,得到一组电平序列,根据采样频率将电平序列进行排列,可以得到一组译码后的理想抽样冲激序列,只不过这个理想抽样冲激序列的幅值是离散、有限取值,即只能取量化电平的大小,然后再通过一个理想低通滤波器,就可以恢复出要得到的信号,最理想情况下,如果没有量化噪声,采样满足采样定理,那么就可以恢复出和发送端一模一样的信号。

具体算法操作,由段落码得出落于第几段,段尾电平 = 2 ^ 4 * 2 ^ block,block为段落编号,得到落于这段的段尾电平,根据段内码,得到落于第几个子段,子端编号为inblock,从第一个子段到该子段一共有inblock + 1子段,那么后面就有16 - 1 - inblock = 15 - inblock个子段,那么从最后一个子段末尾电平即段尾电平到需要量化的电平,需要移动 15 - inblock + 0.5 = 15.5 - inblock = numinblock个子段,需要向左移动的电平为 facto * numinblock,facto为每个段落对应的子段长度,第一段和第二段为1,后续满足2 ^ (block - 1),并都以Δ为单位,这样就可以得到需要译码成的电平的绝对值,然后再根据极性码判断正负,如果极性码为0,那么就加一个负号即可,这样就完成了译码部分。

实验主程序

PCM基带传输系统

clc;clear;
%% 余弦理想采样信号参数
A = 1;
t1 = 0;
t2 = 5;
fc1 = 1;
fc2 = 2;
fs = 100;
%% 传输使用的基带信号参数
TB = 1;
%% 产生余弦理想采样信号
[x1, t] = cosx(A, t1, t2, fc1, fs);
[x2, t3] = cosx(A, t1, t2, fc1, fs);
y = x1 .* x2;
%% PCM量化编码
pcm = quantify_c(x1);
pcmy = quantify_c(y);
%% 传输的基带信号
[pcm, t_pcm] = SNRZ(pcm, TB, fs);
[pcmy, t_pcmy] = SNRZ(pcmy, TB, fs);
%% 加入噪声
pcm = awgn(pcm, 20);
pcmy = awgn(pcmy, 20);
%% 接收端抽样判决
pcmsj = sj_SNRZ(pcm, TB, fs);
pcmysj = sj_SNRZ(pcmy, TB, fs);
%% PCM译码
decode = decoding_pcm(pcmsj);
decodey = decoding_pcm(pcmysj);
%% 变换单位并去归一化
decode = decode / 2048;
decode = decode * max(abs(x1));
decodey = decodey / 2048;
decodey = decodey * max(abs(y));
%% 画图
subplot(2, 1, 1); plot(t, y, 'LineWidth', 1.2); title('余弦理想采样信号');
subplot(2, 1, 2); plot(t, decodey, 'LineWidth', 1.2); title('PCM译码信号');
%% 测试
% x = [512, 1024, 2048];
% [b, y] = quantify_c(x);
% [a, endblock, numinblock, block, inblock] = decoding_pcm(b(1, :));

 PCM带通传输系统(采用DPSK调制,具体子程序可参考我写的数字调制部分博客)

clc;clear;
%% 余弦理想采样信号参数
A = 1;
t1 = 0;
t2 = 5;
fB = 1;
TB = 1 / fB;
fc = 50;
fc1 = 1;
fs = 100;
%% 产生余弦理想采样信号
[x, t] = cosx(A, t1, t2, fc1, fs);
%% PCM量化编码
pcm = quantify_c(x);
%% 将编码序列进行DPSK调制
[signal, csignal, baseband, nbaseband, t1 , t2] = tDPSK(pcm, TB, fc, fs);
%% 加入信道噪声
signal = awgn(signal, 4);
%% 2DPSK非相干解调
dmode_dco = dDPSK(signal, 1.5 * fB, fc / 1.5, fs, TB);
%% 非相干解调抽样判决
sapsd = sj(dmode_dco, TB, fs);
dbasebandd = SNRZ(sapsd, TB, fs);
%% PCM译码
decode = decoding_pcm(sapsd);
%% PCM变换单位并去归一化
decode = decode / 2048;
decode = decode * max(abs(x));
%% 余弦信号PCM编译码画图
figure(1);
subplot(2, 1, 1); plot(t, x, 'LineWidth', 1.2); title('余弦理想采样信号');
subplot(2, 1, 2); plot(t, decode, 'LineWidth', 1.2); title('PCM译码信号');
%% DPSK调制解调画图
% figure(2);
% subplot(2, 1, 1); plot(t1, baseband, 'LineWidth', 1.2); title('码型变换前信号');
% subplot(2, 1, 2); plot(t1, dbasebandd, 'LineWidth', 1.2); title('码型变换后信号');
%% 测试
% x = [512, 1024, 2048];
% [b, y] = quantify_c(x);
% [a, endblock, numinblock, block, inblock] = decoding_pcm(b(3, :));

接收信号信噪比为4dB,可以在后续实验结果中看到有部分点有较大的失真。

实验结果

PCM基带传输系统(20dB信噪比)

可以看到在尖峰处有较大的量化噪声,这是由于A律13折线量化中,电平越大,量化区间越大,量化噪声就越大,并且在某些点出由于信道噪声,产生了较大的失真。

PCM带通传输系统(10dB信噪比)

可以看出,除了在尖峰处有和基带传输相同的量化噪声外,10dB信噪比的情况下就比基带传输系统恢复的波形要好,所以调制可以提高信息传输的抗信道噪声能力。

DPCM基带、带通传输系统

DPCM信源编码技术

简介

DPCM与PCM的区别就在于DPCM输入进量化器的是前后两个电平的差值,也就是说,量化编码的是前后两个电平的差值,因为大多数信号前后两个相邻抽样值相关性较大,这样不但可以减少所量化信号的冗余量,也可以减少量化范围,在相同量化字长下可以有更高的量噪比。

实际应用中第一个传输的电平需要传输电平本身,或者传输一个相对的参考电平,类似于DPSK,

[x0, x1 - x0, x2 - x1, x3 - x2, ......],译码得到的也是[x0, x1 - x0, x2 - x1, x3 - x2, ......]的形式,只不过此时得到的电平只有量化电平取值。

量化编码部分

类比于PCM,不过就是输入量化器的时前后两个电平的差值序列,所以只需要构建一个电平差值序列即可,该序列的第一个值是原采样序列的第一个值本身。

function [codex, y] = dpcm(X)
    N = length(X); %采样电平个数
    x = zeros(1, N - 1);
    x(1) = X(1);
    for k = 2 : N
        x(k) = X(k) - X(k - 1);
    end
    N = length(X); %采样电平个数
    maxim = max(abs(x));
    y = x / maxim;
    y = y * 2048;
    y_abs = abs(y);
    L = 8; %编码长度
    code = zeros(N, L);
    for i = 1 : N
        if y(i) >= 0
            code(i, 1) = 1;
        elseif y(i) < 0
            code(i, 1) = 0;
        end
        
        if y_abs(i) < 16
            code(i, 2 : 4) = [0, 0, 0];
            temp = floor(y_abs(i) / 1);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 32
            code(i, 2 : 4) = [0, 0, 1];
            y_abs(i) = y_abs(i) - 16;
            temp = floor(y_abs(i) / 1);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 64
            code(i, 2 : 4) = [0, 1, 0]; 
            y_abs(i) = y_abs(i) - 32;
            temp = floor(y_abs(i) / 2);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 128
            code(i, 2 : 4) = [0, 1, 1];
            y_abs(i) = y_abs(i) - 64;
            temp = floor(y_abs(i) / 4);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 256
            code(i, 2 : 4) = [1, 0, 0];
            y_abs(i) = y_abs(i) - 128;
            temp = floor(y_abs(i) / 8);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 512
            code(i, 2 : 4) = [1, 0, 1];
            y_abs(i) = y_abs(i) - 256;
            temp = floor(y_abs(i) / 16);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 1024
            code(i, 2 : 4) = [1, 1, 0];
            y_abs(i) = y_abs(i) - 512;
            temp = floor(y_abs(i) / 32);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) < 2048
            code(i, 2 : 4) = [1, 1, 1];
            y_abs(i) = y_abs(i) - 1024;
            temp = floor(y_abs(i) / 64);
            code(i, 5 : 8) = d2b(temp);
        elseif y_abs(i) == 2048
            code(i, 2 : 8) = [1, 1, 1, 1, 1, 1, 1];
        end
    end
    for k = 1 : N
        codex(1 + (k - 1) * L : k * L) = code(k, :);
    end
end












            

译码部分 

译码的前半部分和PCM相同,都是得到输入进量化器的采样电平的量化电平值,对于DPCM,还需要将译码后的[x0, x1 - x0, x2 - x1, x3 - x2, ......]这种形式转换为[x1, x2, x3, ....],这样整个译码部分就完成,后续只需要跟PCM一样,将Δ单位转变为归一化电平,再去归一化即可。

function [signal, endblock, numinblock, block, inblock] = decoding_dpcm(x)
    L = 8; % 编码长度
    N = length(x); % 总编码长度
    n = N / L; % 一共多少个采样点
    y = zeros(n, L);
    for k = 1 : n
        y(k, :) = x(1 + (k - 1) * L : k * L);
    end
    x = y;
    signal = zeros(1, n);
    for k = 1 : n
        block = b2d(x(k, 2 : 4)); % 编号为几的段落
        inblock = b2d(x(k, 5 : 8));% 编号为几的段内
        numinblock = 15 - inblock + 0.5;
        endblock = (2 ^ 4) * (2 ^ block);
        if block == 0 || block == 1
            facto = 1;
        else
            facto = 2 ^ (block - 1);
        end
        signal(k) = endblock - facto * numinblock;
        polar = b2d(x(k, 1));
        if polar == 0
            signal(k) = - signal(k);
        end
    end

    for k = 2 : n
        signal(k) = signal(k) + signal(k - 1);
    end
end

实验主程序

DPCM基带传输系统

clc;clear;
%% 余弦理想采样信号参数
A = 1;
t1 = 0;
t2 = 5;
fc1 = 1;
fc2 = 2;
fs = 100;
%% 传输使用的基带信号参数
TB = 1;
%% 产生余弦理想采样信号
[x, t] = cosx(A, t1, t2, fc1, fs);
%% DPCM量化编码
d_pcm = dpcm(x);
%% 传输的基带信号
[d_pcm, t_pcm] = SNRZ(d_pcm, TB, fs);
%% 加入噪声
d_pcm = awgn(d_pcm, 20);
%% 接收端抽样判决
dpcmsj = sj_SNRZ(d_pcm, TB, fs);
%% DPCM译码
decoded = decoding_dpcm(dpcmsj);
%% DPCM变换单位并去归一化
decoded = decoded / 2048;
decoded = decoded * max(abs(x));
%% 画图
subplot(2, 1, 1); plot(t, x, 'LineWidth', 1.2); title('余弦理想采样信号');
subplot(2, 1, 2); plot(t, decoded, 'LineWidth', 1.2); title('DPCM译码信号');
%% 测试
% x = [512, 1024, 2048];
% [b, y] = quantify_c(x);
% [a, endblock, numinblock, block, inblock] = decoding_pcm(b(1, :));

DPCM带通传输系统(DPSK调制方式)

clc;clear;
%% 余弦理想采样信号参数
A = 1;
t1 = 0;
t2 = 5;
fB = 1;
TB = 1 / fB;
fc = 50;
fc1 = 1;
fs = 100;
%% 产生余弦理想采样信号
[x, t] = cosx(A, t1, t2, fc1, fs);
%% DPCM量化编码
dpcmx = dpcm(x);
[bdpcm, t_dpcm] = SNRZ(dpcmx, TB, fs);
%% 将编码序列进行DPSK调制
[signal, csignal, baseband, nbaseband, t1 , t2] = tDPSK(dpcmx, TB, fc, fs);
%% 加入信道噪声
signal = awgn(signal, 10);
%% 2DPSK非相干解调
dmode_dco = dDPSK(signal, 1.5 * fB, fc / 1.5, fs, TB);
%% 非相干解调抽样判决
sapsd = sj(dmode_dco, TB, fs);
[dbasebandd, t_dbaseband] = SNRZ(sapsd, TB, fs);
%% DPCM译码
decode = decoding_dpcm(sapsd);
%% DPCM变换单位并去归一化
decode = decode / 2048;
decode = decode * max(abs(x));
%% 余弦信号PCM编译码画图

figure(1);
subplot(4, 1, 1); plot(t, x, 'LineWidth', 1.2); title('余弦理想采样信号');
subplot(4, 1, 2); plot(t_dpcm, bdpcm, 'LineWidth', 1.2); title('发送端编码序列');
subplot(4, 1, 3); plot(t_dbaseband, dbasebandd, 'LineWidth', 1.2); title('接收端抽样判决序列');
subplot(4, 1, 4); plot(t, decode, 'LineWidth', 1.2); title('DPCM译码信号');
%% DPSK调制解调画图
% figure(2);
% subplot(2, 1, 1); plot(t1, baseband, 'LineWidth', 1.2); title('码型变换前信号');
% subplot(2, 1, 2); plot(t1, dbasebandd, 'LineWidth', 1.2); title('码型变换后信号');
%% 测试
% x = [512, 1024, 2048];
% [b, y] = quantify_c(x);
% [a, endblock, numinblock, block, inblock] = decoding_pcm(b(3, :));

实验结果 

DPCM基带传输系统(20dB信噪比)

与上文同样是20dB接收信噪比,基带传输下的PCM相比,DPCM的恢复波形显然要更好,而且尖端处的量化噪声也减小,所以DPCM可以有效减小量化噪声,并且一定程度上提高了抗信道噪声的能力。

DPCM带通传输系统(4dB信噪比)

在与10dB信噪比、DPSK的PCM传输系统相比,DPCM就已经有比PCM更好的恢复波形,不但是在抗信道噪声上,对于量化噪声,DPCM也要优于PCM。 

 

  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值