📄 卷积码编程.txt
字号:
state_metric=state_metric(:,2:-1:1); %移动state_metric,将临时值移为确定值
end
%开始尾部信道输出解码
for i=depth_of_trellis-L+2:depth_of_trellis
flag=zeros(1,number_of_states);
% 状态数从number_of_states→number_of_states/2→...→2→1
% 程序说明同上,只不过输入矢量只为0
last_stop=number_of_states/(2^((i-depth_of_trellis+L-2)*k));
for j=0:last_stop-1
branch_metric=0;
binary_output=deci2bin(output(j+1,1),n);
for ll=1:n
branch_metric=branch_metric+metric(channel_output_matrix(ll,i),binary_output(ll));
end
if((state_metric(nextstate(j+1,1)+1,2)state_metric(j+1,1)...
+branch_metric)|flag(nextstate(j+1,1)+1)==0)
state_metric(nextstate(j+1,1)+1,2)=state_metric(j+1,1)+branch_metric;
survivor_state(nextstate(j+1,1)+1,i+1)=j;
flag(nextstate(j+1,1)+1)=1;
end
end
state_metric=state_metric(:,2:-1:1);
end
% 从最佳路径中产生解码
% 译码过程可从数组survivor_state的最后一个位置向前逐级译码
state_sequence=zeros(1,depth_of_trellis+1);
% survivor_state数组的最后的输出状态肯定是“0”
state_sequence(1,depth_of_trellis)=survivor_state(1,depth_of_trellis+1);
% 逐级译码过程
for i=1:depth_of_trellis
state_sequence(1,depth_of_trellis-i+1)=survivor_state((state_sequence(1,depth_of_trellis+2-i)...
+1),depth_of_trellis-i+2);
end
decorder_output_matrix=zeros(k,depth_of_trellis-L+1);
for i=1:depth_of_trellis-L+1
% 根据数组input的定义来得出从当前状态到下一个状态的输入信号矢量
dec_output_deci=input(state_sequence(1,i)+1,state_sequence(1,i+1)+1);
% 转成二进制信号
dec_output_bin=deci2bin(dec_output_deci,k);
% 将一次译码存入译码输出矩阵decoder_output_matrix相应的位置
decoder_output_matrix(:,i)=dec_output_bin(k:-1:1)';
end
% 按照一维序列形式重新组织输出
decoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));
% state_metric为网格图最后一个列位置中“0”状态位置的汉明距
% 离,这个值就是整个译码过程中的汉明距离。
cumulated_metric=state_metric(1,1);
%卷积码的维特比译码函数
%nxt_stat.m 记录状态函数
% next_state用于记录下一个状态的值
% memory_contents用于记录
function [next_state,memory_contents]=nxt_stat(current_state,input,L,k)
% 将当前状态值(十进制)转成位数为k*(L-1)的二进制
binary_state=deci2bin(current_state,k*(L-1));
% 将输入状态值(十进制)转成位数为k的二进制序列
binary_input=deci2bin(input,k);
% 寄存器组的下一个状态值(二进制)
next_state_binary=[binary_input,binary_state(1:(L-2)*k)];
% 将寄存器组的下一个状态值(二进制)转成十进制
next_state=bin2deci(next_state_binary);
% 用memory_contents来记录各个寄存器在下一个状态下的信息(二进制)
% 以便与生成矩阵相乘得出输出
memory_contents=[binary_input,binary_state];
%nxt_stat.m 记录状态函数
function y=bin2deci(x)
%bin2dec.m 二进制序列转换十进制数值函数
%x 二进制序列
%y 十进制数值
li=length(x);
y=(li-1:-1:0);
y=2.^y;
y=x*y';
%bin2dec.m 二进制序列转换十进制数值函数
function y=deci2bin(x,li)
%dec2bin.m 十进制数值转换二进制序列函数
y=zeros(1,li);
i=1;
while x=0&i=li
y(i)=rem(x,2);
x=(x-y(i))/2;
i=i+1;
end
y=y(li:-1:1);
% dec2bin.m十进制数值转换二进制序列函数
function distance=metric(x,y)
%metric.m 距离量度函数
%被比较比特 x y
%hamming距离 distance
if x==y
distance=0;
else
distance=1;
end
% metric.m距离量度函数
function [p]=smldPe55_cnv(snr_in_dB)
%smldPe55_cnv.m 二进制双极性(2,1,2)卷积码通信系统的蒙特卡罗仿真函数
%snr_in_dB 信噪比
%p 误码率
E=1;
SNR=exp(snr_in_dB*log(10)/10);%Eb/N0
sgma=E/sqrt(2*SNR);
N=16;
loop=10^4/N;
Ns=N*loop; %仿真序列长度10^4,运行时间约5分钟
dsource=zeros(1,N);
G=[1 0 1;1 1 1], %(2,1,2)卷积码编码矩阵
k=1,
output_convenc=convenc(G,k,dsource);
channel_output=zeros(1,length(output_convenc));
[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output);
numoferr_cnv=0;
for j=1:loop
for i=1:N
temp=rand;
if (temp0.5)
dsource(i)=0;
else
dsource(i)=1;
end
end
%length(dsource)
output_convenc=convenc(G,k,dsource);
%length(output_convenc)
for i=1:length(output_convenc)
if(output_convenc(i)==0)
r=-E+gngauss(sgma);
else
r=E+gngauss(sgma);
end
if (r<0)
channel_output(i)=0;
else
channel_output(i)=1;
end
end
[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output);
%length(decoder_output),pause
for i=1:length(dsource)
if(decoder_output(i)~=dsource(i))
numoferr_cnv=numoferr_cnv+1;
end
end
end
numoferr_cnv,
p=numoferr_cnv/Ns;
%smldPe55_cnv.m 二进制双极性(2,1,2)卷积码通信系统的蒙特卡罗仿真函数
%ce55_cnv.m 二进制双极性(2,1,2)卷积码通信系统的蒙特卡罗仿真绘图
%仿真序列长度10^4,运行时间约2小时
echo on
SNRindB1=0:16;
SNRindB2=0:0.3:16;
smld_err_prb=zeros(1,length(SNRindB1));
smld_err_prb_cnv=zeros(1,length(SNRindB1));
SNR=0;
theo_err_prb=zeros(1,length(SNRindB2));
for i=1:length(SNRindB1)
smld_err_prb(i)=smldPe55(SNRindB1(i));
smld_err_prb_cnv(i)=smldPe55_cnv(SNRindB1(i));
end
for i=1:length(SNRindB2)
SNR=exp(SNRindB2(i)*log(10)/10);
theo_err_prb(i)=(1/2)*erfc(sqrt(2*SNR)/sqrt(2));
%Qfunct y=(1/2)*erfc(x/sqrt(2));
%theo_err_prb(i)=Qfunct(sqrt(2*SNR));
end
%绘图函数
figure;
semilogy(SNRindB1,smld_err_prb,'b*-');
axis([0,16,1e-4,1]);
xlabel('Eb/N0 in dB');
ylabel('Pe');
title('(2,1,2)卷积编码系统仿真结果与未编码系统的比较');
hold on
semilogy(SNRindB1,smld_err_prb_cnv,'ro-');
semilogy(SNRindB2,theo_err_prb,'b:');
%ce55_cnv.m 二进制双极性(2,1,2)卷积码通信系统的蒙特卡罗仿真绘图
运行结果
下图(ce55_cnv的运行结果)给出了不同信噪比条件下,发送100000比特的二进制双极性(2,1,2)卷积编码通信系统的蒙特卡罗仿真结果,以及未编码系统的仿真结果和未编码系统的理论值曲线。
从下图的仿真结果可见,(2,1,2)卷积编码可以降低二进制双极性通信系统的误码率,从而提高通信的有效性。
需要特别指出的是,仿真时每发送一个码组前后都会将卷积器清零,对此我们可以认为是系统在发送端为同步校准而插入比特0的操作,在接收端这些插入的0比特又会被系统自动去掉。因此从用户角度看,仿真序列并未改变,所得到的仿真误码率结果依然正确,只不过更准确地应该称之为用户误码率,而非系统误码率。
为方便比较,下面将(2,1,2卷积编码系统仿真结果、(7,4)HAMMING编码系统仿真结果、未编码系统仿真结果和未编码系统的理论值曲线绘制在一起。
由图可知,相同信噪比条件下,按照仿真结果误码率从高到低顺序依次为:未编码系统、(7,4)HAMMING编码系统、(2,1,2)卷积编码系统,从而可以得出(2,1,2)卷积编码纠错能力优于(7,4)HAMMING编码的结论,与理论结论相符。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -