我是靠谱客的博主 清新酸奶,这篇文章主要介绍Matlab 编程实现(4,1)二元Repetition Code 基带仿真1 Repeat Code 的简单介绍2 编码与译码的原理3 仿真实现与结果4 总结5 参考资料1 Repeat Code 的简单介绍2 编码与译码的原理3 仿真实现与结果4 总结5 参考资料,现在分享给大家,希望可以做个参考。

1 Repeat Code 的简单介绍

2 编码与译码的原理

         2.1 简单映射

         2.2两种Decoder 算法

3 仿真实现与结果

4 总结

5 参考资料

1 Repeat Code 的简单介绍

       首先,回答一个简单的问题,为什么要进行信道编码?答案显而易见,为了对抗噪声与干扰再

发生错误之后还有一定的纠错与检错能力,提高通信系统的可靠性。我们发送的信息比特,如果不

进行一定的保护措施(信道编码),接收端原本就不知道你所发的具体信息,一旦出错,后果不言

而喻。 重复码(repeating code)是一种简单的信道编码方式,简单易操作。其实质就是将每个要发

送的符号重复发送,比如(4,1)二元重复码,其编码方法就是将原来二进制序列中的每一个“0”编

成“0000”,将每一个“1”编成“1111”

       接下来,提出一个问题,重复码一定有效吗?此处暂时不给出答案,后面会进一步给出答案。

读者稍安勿躁,且听小生慢慢道来。

2 编码与译码的原理

2.1 简单映射

      本次matlab的基带仿真,使用信道为高斯白噪声信道,使用的调制方式BPSK; 再编码一方,很

是简单,由于我们实在GF(2) 上进行操作,重复编码如下:

                                                 0rightarrow 0000

                                                 1 rightarrow 1 1 1 1

采用BPSK,我们设计 映射规则如下:

                                             0 rightarrow 1, 1rightarrow -1

此处的0,1 是码字中的0,1,而不是原始信息序列的0,1;

流程如下:

 

 

 

2.2两种Decoder 算法

(1) Hard Decision Decoder

 

根据接收到的序列直接判0或1,得到码字 b, 接下来使用最小距离译码,得到我们的译码估计序

列 hat{c} ;

 

(2) Maximum Likehood Decoder(Soft  Decision Decoder)

 

       根据接收到的序列 r 不直接判0或1,而是把 r 与需用码字的符号映射做一个相关性的估计,

取相关性最大的作为我们的译码估计序列 hat{c} ;

3 仿真实现与结果

仿真代码如下:

%% (1,4)重复码matlab的基带仿真,使用信道为高斯白噪声信道,使用的调制方式BPSK;
 
clear all;
clc;
snrdB_min = -3; % 最小信噪比
snrdB_max = 6;  % 最大信噪比
snrdB = snrdB_min :1:snrdB_max;
R = 1/4; %码率
EbN0 = 10.^(snrdB/10); % 信噪比数值与dB值之间的运算
% sigma = sqrt(1/(2*R*EbN0));
len = length(snrdB);
 
k = 1; % Message bit
n = 4; % length of codeword
BER_sim1 = zeros(1,len); % 初始化
BER_sim2 = zeros(1,len); % 初始化

%% 
codwords = [ 0     0     0   0;
            
             1     1     1   1];

for j =1:len % 不同信噪比下的仿真
    
    bit_errors_num1 = 0; N_Simulation = 100000;  
    bit_errors_num2 = 0;
    for i=1:N_Simulation 
        msg = randi([0,1]); % 产生信息比特
        codeword1 = [msg msg msg msg]; % 根据生成矩阵生成码字
        codeword2 = msg;     
        
         sigma1 = sqrt(1/(2*R*EbN0(j))); %计算编码之后实际的噪声方差
         sigma2 = sqrt(1/(2*EbN0(j))); %计算出未编码实际的噪声方差
         
         s1 = 1-2*codeword1; % BPSK调制
         s2 =  1-2*codeword2; % BPSK调制
          
          r1 = s1 + sigma1*randn(1,n); %  加入噪声
          r2 = s2 + sigma2*randn(1); %  加入噪声
%%  硬判决
          b2 = (r2<0); 
          
          b1 = (r1<0);  
          % 最小距离译码
          dis = mod(repmat(b1,2,1)+ codwords,2) * ones(4,1);
          [m1, pos1] = min(dis);
          mes_cap1 = codwords(pos1,1);
          
%% 软判决
          corr = (1-2*codwords)*r1';
          [m2,pos2] = max(corr);
          mes_cap2 = codwords(pos2,1);
%% 计算误码率
          %err_num1 = sum(msg ~= mes_cap1); % 编码之后使用硬判决
          err_num1 = sum(msg ~= mes_cap2); % 编码之后使用软判决
          
          err_num2 = sum(msg ~= b2); % 未编码使用硬判决
          if (err_num1 >0)
               bit_errors_num1 = bit_errors_num1 + err_num1;
        
          end
          
           if (err_num2 >0)
               bit_errors_num2 = bit_errors_num2 + err_num2;
        
           end
          BER_sim1(j) =  bit_errors_num1 /  N_Simulation; % 误比特率 
          BER_sim2(j) =  bit_errors_num2 /  N_Simulation; % 误比特率 
    end
end
 
 
%% 画图
semilogy(snrdB,BER_sim1,'b',snrdB,BER_sim2,'*');
axis([snrdB_min snrdB_max 0.0001 1]);
xlabel('SNR in dB');
ylabel('BER');
title('BPSK仿真的1/4repeating code BER曲线图')
legend('code','uncode');

 

仿真结果如下:

repetition code 使用硬判决,uncode 也使用硬判决:

 

 

repetition code 使用软判决,uncode 使用硬判决:

 

 

4 总结

        观察实验结果,得到一个结论,“费力不讨好”,“好心办坏事”,repetition code的误码率反而会

增加,因此这种信道编码方式一般来说是不可取的。

5 参考资料

相关课程:LDPC and Polar Codes in 5G Standard

最后

以上就是清新酸奶最近收集整理的关于Matlab 编程实现(4,1)二元Repetition Code 基带仿真1 Repeat Code 的简单介绍2 编码与译码的原理3 仿真实现与结果4 总结5 参考资料1 Repeat Code 的简单介绍2 编码与译码的原理3 仿真实现与结果4 总结5 参考资料的全部内容,更多相关Matlab内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(137)

评论列表共有 0 条评论

立即
投稿
返回
顶部