通信系统仿真实验

通信系统仿真

有具体实验要求可以私聊定制

实验目的

  1. 掌握常见的信道编码方式
  2. 掌握误码率、丢包率的计算方法

实验要求

  1. 运用MATLAB进行无编码、(3,1)简单重复码、(7,4)汉明码三种信道编码的仿真
  2. 输入:长度N(仿真次数足够多),信源0、1出现的概率(可以等概率),二进制对称信道BSC的差错概率
    输出:不同差错概率情况下的误码率BER,丢包率BLER

实验环境

MATLAB

实验原理

信道编码概念

  • 由于信道中随机噪声或干扰的存在,输入输出之间是统计依赖的关系而不是确定的关系。因此信道输出要唯一译成输入一般将无法避免可能的差错,发生译码错误的概率称为译码错误概率。
  • 译码错误概率取决于信道的统计特性。对于有噪信道,如果把要发送的消息在传送之前进行编码,并在接收端采用适当的方式进行译码,则消息有可能得到几乎无误的传输。由于移动通信存在干扰和衰落,在信号传输过程中将出现差错,故对数字信号必须采用纠、检错技术,即纠、检错编码技术,以增强数据在信道中传输时抵御各种干扰的能力,提高系统的可靠性。对要在信道中传送的数字信号进行的纠、检错编码就是信道编码。
  • 信源编码是降低冗余,针对信源的统计特性;
  • 信道编码是增加特定冗余,针对信道的统计特性。
  • 信源信道分离定理:可以独立地设计信源码和信道码,然后结合两者的结果以达到最优的效果。

简单重复编码

  • 简单重复编码实质就是将每个要发送的符号重复发送,或者说是将原来的每一个信源符号编成多个相同的码元符号,其值与原来的符号取值相同,这个过程可以看成离散无记忆信道的三次扩展信道。比如(3,1)二元重复码,其编码方法就是将原来二进制序列中的每一个“0”编成“000”,将每一个“1”编成“111”。

  • 译码时译码时根据码字中“0”“1”的数目选择数目多的进行译码。比如(3,1)二元重复码的译码,可以将接收到的“000”、“001”、“010”和“100”译为“0”,将接收到的“011”、“101”、“110”和“111”译为“1”。这样,每个码字对于传输过程中发生的任一位错误,通过译码都可以进行自动纠正。可以证明,一个(n,1)重复码可以纠正传输过程中可能出现的不多于个差错。

  • 随着信道扩展次数 n n n(编码后的长度)的增加,平均错误概率随之减少; 但是信息传输率 R = l o g M / n R=logM/n R=logM/n也随之减少(M为信源符号数)。因此在一个二元信道的 n n n次无记忆扩展信道中,输入端有 2 n 2^{n} 2n个符号系列可作为消息。如果选出其中的 M M M个作为消息传递,则当 M M M大一些,R就大一些, P E P_{E} PE 也大些; M M M取小一些, R R R就要降低, P E P_{E} PE也降低。对于简单重复编码来说,这似乎是个不可调和的矛盾。

(7,4)汉明码

  • (7,4)汉明码的本质是一种线性分组码,线性分组码的编码方式是将信源输出序列分组,分组是长为 k k k的信息序列,然后按照一定的编码规则插入 n − k n-k nk位的校验位,校验位是所有信息位的线性组合,组成 n n n长的码字序列

  • 校验位生成的方式我们以生成矩阵来表示。给定长度为 M = 2 k M = 2^{k} M=2k个信息序列映射到长度为 n n n 2 n 2^{n} 2n个对应码字可以用一个矩阵 G G G表示,称其生成矩阵: c m = u m G c_{m} = u_{m}G cm=umG,其中 1 ≤ m ≤ 2 k 1\leq m\leq2^{k} 1m2k u m u_{m} um表示长度为 k k k的二进制矢量(行向量),即信息序列; c m c_{m} cm表示对应码字。可见,生成矩阵为 k × n k\times n k×n阶的。为使得线性分组码为系统,必须生成矩阵行满秩。故我们一般设定生成矩阵形式如下: G = [ I k ∣ P ] G=[I_{k}|P] G=[IkP]

  • 如果无误码,则 G H T = 0 GH^{T}=0 GHT=0,则校验矩阵 H = [ P T ∣ I m ] H=[P^{T}|I_{m}] H=[PTIm],设接收码字为 b b b,则由 b H T bH^{T} bHT可得到三位校验子 S S S,根据校验子可纠正 1 b i t 1bit 1bit错误,但如果错误位数大于位则不能改正甚至可能因错误的更改位导致更多的错误。根据给出的生成矩阵和校验矩阵可以得出如下表所示的校验子与错误位的对应关系

    G = [ 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 1 1 ] G={\left[ {\begin{matrix} 1&0&0&0&1&0&1\\ 0&1&0&0&1&1&0\\ 0&0&1&0&1&1&1\\ 0&0&0&0&0&1&1 \end{matrix}} \right]} G= 1000010000100000111001111011 H = [ 1 1 1 0 1 0 0 0 1 1 1 0 1 1 0 0 0 1 0 1 1 ] H={\left[ {\begin{matrix} 1&1&1&0&1&0&0\\ 0&1&1&1&0&1&1\\ 0&0&0&1&0&1&1 \end{matrix}} \right]} H= 100110110011100011011

校验子错误位
000-
0011
0102
1003
0114
1115
1106
1017

误码率

误码率是衡量数据在规定时间内数据传输精确性的指标,误码率=传输中的误码/所传输的总码数*100%。

丢包率

数据是被分成一个个数据包传输的,每个数据包中有表示数据信息和提供数据路由的帧。而数据包在一般介质中传播是总有一小部分由于两个终端的距离过大会丢失,而大部分数据包会到达目的端。
丢包率是指传输中所丢失数据包数量占所发送数据包的比率,通常在吞吐量范围内测试。丢包率与数据包长度以及包发送频率相关。丢包率(packet loss rate)是三种基准指标(丢包率,时延,吞吐量)之一。无编码和简单重复编码的丢包率与误码率相同,在汉明码传输过程中,一个数据包中只要有一位错误则整个数据包出现错误。

在这个试验中因为没有信源编码,是直接对01串进行传输并通过对称BSC信道添加错误概率,因此误码率实际上就是通常意义上的误比特率,并在该试验中经过无编码和简单重复信道编码的误码率与丢包率相同。

实验结果与分析

在错误概率为0.01情况下,分别对信源进行无编码,简单重复编码和(7,4)汉明码编码后解码,可得到部分图像如下在这里插入图片描述

并得到误码率和丢包率如下:
在这里插入图片描述

接着以在0到0.6的区间内0.001为差错概率的步长,每个实验点取200000个信号进行统计分析并绘图,可得到如下的误码率和丢包率曲线:
在这里插入图片描述
在这里插入图片描述

可以发现在错误概率很小的时候,汉明码和简单重复编码都可以十分有效的对差错概率进行控制,但当错误概率超过某个阈值,信道编码甚至将导致更高的误码率和丢包率,当然,过高的差错概率同样不符合实际情况。

附录

添加错误概率时用到了异或运算,实际测试中对比循环语句会对运算速度有一定的提高

clc
clear

N = input('请输入信源长度:\n') % 信源长度
% N = 200000

prob = input('请输入信源0出现的概率:\n')
% prob = 0.5

error = input('请输入错误概率:\n')
% error = 0.01


decode_simrep = zeros(1, N); % 初始化译码矩阵
num = 0; % 0计数器
prob_01 = [prob, (1-prob)] %01出现概率
prob_error = [(1-error), error];
alphabet = [0, 1];
k = N*3
Ori = randsrc(1, N, [alphabet; prob_01]); %离散信源
error_simple_repeat = randsrc(1, k, [alphabet; prob_error]); % 利用异或运算进行差错模拟,可提高效率
Ori


%% 无编码

error_none = randsrc(1, N, [alphabet; prob_error]);
none_result = xor(Ori, error_none);


%% 简单重复编码

simple_repeat = reshape((repmat(Ori', [1, 3]))', 1, N*3) % 扩展矩阵
simple_repeat_result = xor(simple_repeat, error_simple_repeat)
simple_repeat_result = strrep(num2str(simple_repeat_result), ' ', '')

for i = 1:N
    if Ori(i) == 0
        num = num+1;
    end
    simrep = simple_repeat_result(1, (3*i-2):(3*i));
    switch simrep
        case{'000','001','010','100'}
            decode_simrep(1, i) = 0;
        case{'111','110','101','011'}
            decode_simrep(1, i) = 1;
    end  
end
decode_simrep


%%7,4)汉明码

u = Ori
num_Ham = 0
row_num = N/4
H = [1 1 1 0 1 0 0; 0 1 1 1 0 1 0; 1 0 1 1 0 0 1] % 校验矩阵
G = [1 0 0 0 1 0 1; 0 1 0 0 1 1 0; 0 0 1 0 1 1 1; 0 0 0 1 0 1 1] % 生成矩阵
u_re = (reshape(u', [4, N/4]))'
decode_Hamming = zeros(1, N);



for row = 1:row_num
    u_div = u_re(row, :);
    c = mod(u_div*G, 2); % 生成                                                                                                                                                                                                                               
    error_Hamming = randsrc(1, 7, [alphabet; prob_error]); % 利用异或运算进行差错模拟,可提高效率
    b = xor(c, error_Hamming);
    % b = c;
    % b = [1 1 0 1 1 0 0]
    result_div = b(:, 1:4);

    S = mod(b*(H'), 2);
    veri = strrep(num2str(S), ' ', ''); % 校验
    switch veri
        case {'000', '001', '010', '100'} % 无错,错误为分别为1,2,3位,不做调整            
        case '011' 
            result_div = xor(result_div, [0 0 0 1]);
        case '111'    
            result_div = xor(result_div, [0 0 1 0]);
        case '110'
            result_div = xor(result_div, [0 1 0 0]);
        case '101'
            result_div = xor(result_div, [1 0 0 0]);
    end
    num_Ham = num_Ham+(~isequal(xor(result_div, u_div), [0 0 0 0]));
    decode_Hamming(1, (row*4-3):row*4) = result_div;
    
    
end
Ori
decode_Hamming

%% 校验

pro_real = num/N % 实际0出现概率
dif_non = xor(Ori, none_result);
dif_sim = xor(Ori, decode_simrep);
dif_Ham = xor(Ori, decode_Hamming);

BER_non = length(find(dif_non(1,:)==1))/N;
BER_sim = length(find(dif_sim(1,:)==1))/N;
BER_Ham = length(find(dif_Ham(1,:)==1))/N;

BLER_non = BER_non;
BLER_sim = BER_sim;
BLER_Ham = num_Ham/N*4;


%% 绘图,结果显示

figure
subplot(4, 1, 1); stairs(0:(N-1), Ori); grid on; axis([0 20 -1 2]); title('信源');
subplot(4, 1, 2); stairs(0:(N-1), none_result); grid on; axis([0 20 -1 2]); title('无编码译码');
subplot(4, 1, 3); stairs(0:(N-1), decode_simrep); grid on; axis([0 20 -1 2]); title('简单重复编码译码');
subplot(4, 1, 4); stairs(0:(N-1), decode_Hamming); grid on; axis([0 20 -1 2]); title('(7,4)汉明码译码');

disp('无编码误码率:'); disp(BER_non);
disp('简单重复编码误码率:'); disp(BER_sim);
disp('(7,4)汉明码误码率:'); disp(BER_Ham);
disp('无编码丢包率:'); disp(BLER_non);
disp('简单重复编码丢包率:'); disp(BLER_sim);
disp('(7,4)汉明码丢包率:'); disp(BLER_Ham);

'无编码误码率:'); disp(BER_non);
disp('简单重复编码误码率:'); disp(BER_sim);
disp('(7,4)汉明码误码率:'); disp(BER_Ham);
disp('无编码丢包率:'); disp(BLER_non);
disp('简单重复编码丢包率:'); disp(BLER_sim);
disp('(7,4)汉明码丢包率:'); disp(BLER_Ham);
《通信专业综合实验(数字通信系统仿真)》教学大纲 一、实验教学的目的 数字通信系统仿真实验是通信专业的一门实验选修课,是将学生所学过的专业知识(信号与系统、通信原理)、专业技能(数字电路、模拟电路、电工电子)及常用开发工具相结合,在实际中进行综合运用。是通信专业课的实验环节,适合在四年级上学期时开设。 学生通过本实验课程的学习,掌握数字通信系统的SystemView仿真软件的使用方法。并利用该软件完成通信系统的仿真。 二、实验教学的任务 本课程的实验任务主要包括: 1、学习数字通信系统的SystemView仿真软件; 2、利用数字通信系统的SystemView仿真软件实现通信电路功能模块和通信综合系统仿真模型; 3、分析各点数据及波形; 三、具体实习项目名称和学时分配适用专业及实验性质(设计性、综合性、验证性) 序号 实验项目名称 学时 适用专业 实验性质 必开/选开 备注 1 学习SystemView仿真软件 10 通信工程 综合性 必开 2 通信电路功能模块和通信综合系统仿真模型 20 通信工程 综合性 必开 合计 30 四、单项实验的内容、要求 实验内容: 1、SystemView仿真软件 学习数字通信系统SystemView仿真软件的使用方法。 2、通信电路功能模块和通信综合系统仿真模型 利用数字通信系统SystemView仿真软件,实现通信电路功能模块和通信综合系统仿真模型,分析数据及各点波形。 实验要求: 1、掌握数字通信系统SystemView仿真软件基本使用方法; 2、利用数字通信系统SystemView仿真软件,通信电路功能模块和通信综合系统仿真模型; 3、纪录并分析数据及各点波形。......
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想取名字的飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值