卷积码编译码程序.docx
《卷积码编译码程序.docx》由会员分享,可在线阅读,更多相关《卷积码编译码程序.docx(7页珍藏版)》请在冰点文库上搜索。
卷积码编译码程序
这是我搜集整理的一个关于卷积编码和Viterbi译码的Matlab程序,现在把它们放在这里,希望对需要的人有些帮助。
卷积编码程序:
function[output,len_tal]=cnv_encd(secrettext,encodetext)
g=[00100100;00000001;10000001;01001101];
k0=1;
%读入文本文件并计算文件长度
frr=fopen(secrettext,'r');
[msg,len]=fread(frr,'ubit1');
msg=msg';
%checktoseeifextrazeropaddingisnecessary
ifrem(length(msg),k0)>0
msg=[msg,zeros(size(1:
k0-rem(length(msg),k0)))];
end
n=length(msg)/k0; %把输入比特按k0分组,n为所得的组数。
%checkthesizeofmatrixg
ifrem(size(g,2),k0)>0
error('Error,gisnotoftherightsize.');
end
%determineLandn0
L=size(g,2)/k0;
n0=size(g,1);
%addextrazeros,以保证编码器是从全0开始,并回到全0状态。
u=[zeros(size(1:
(L-1)*k0)),msg,zeros(size(1:
(L-1)*k0))];
%generateuu,amatrixwhosecolumnsarethecontentsofconv.encoderat
%variousclockcycles.
u1=u(L*k0:
-1:
1);
fori=1:
n+L-2
u1=[u1,u((i+L)*k0:
-1:
i*k0+1)];
end
uu=reshape(u1,L*k0,n+L-1);
%determinetheoutput
output=reshape(rem(g*uu,2),1,n0*(L+n-1));
len_tal=n0*(L+n-1);
%writetheoutputtotheencodetext
result=fopen(encodetext,'w');
fori=1:
n0*(L+n-1)
fwrite(result,output(i),'bit1');
end
fclose(result);
Viterbi译码程序:
function[decoder_output,survivor_state,cumulated_metric]=viterbi(channel_output,decodetext)
tic
G=[00100100;00000001;10000001;01001101];
k=1;
frr=fopen(channel_output,'r');
[msg,len]=fread(frr,'ubit1');
channel_output=msg';
n=size(G,1);
%checkthesizes
ifrem(size(G,2),k)~=0
error('channel_outputnotoftherightsize');
end
L=size(G,2)/k;
number_of_states=2^((L-1)*k);
%generatestatetransitionmatrix,outputmatrix,andinputmatrix
forj=0:
number_of_states-1
fori=0:
2^k-1
[next_state,memory_contents]=nxt_stat(j,i,L,k);
input(j+1,next_state+1)=i;
branch_output=rem(memory_contents*G',2);
nextstate(j+1,i+1)=next_state;
output(j+1,i+1)=bin2deci(branch_output);
end
end
%addtheextrazero,ensurethelengthofchannel_outputisintegral
%timeston.
ifrem(len,n)>0
channel_output=[channel_output,zeros(size(n-rem(len,n):
-1:
1))];
end
state_metric=zeros(number_of_states,2);
depth_of_trellis=length(channel_output)/n;
channel_output_matrix=reshape(channel_output,n,depth_of_trellis);
survivor_state=zeros(number_of_states,depth_of_trellis+1);
%startdecodingofnon-tailchanneloutputs
fori=1:
depth_of_trellis-L+1
flag=zeros(1,number_of_states);
ifi<=L
step=2^((L-i)*k);
else
step=1;
end
forj=0:
step:
number_of_states-1
forl=0:
2^k-1
branch_metric=0;
binary_output=deci2bin(output(j+1,l+1),n);
forr=1:
n
branch_metric=branch_metric+metric(channel_output_matrix(r,i),binary_output(r));
end
if((state_metric(nextstate(j+1,l+1)+1,2)>state_metric(j+1,1)...
+branch_metric)|flag(nextstate(j+1,l+1)+1)==0)
state_metric(nextstate(j+1,l+1)+1,2)=state_metric(j+1,1)+branch_metric;
suvivor_state(nextstate(j+1,l+1)+1,i+1)=j;
flag(nextstate(j+1,l+1)+1)=1;
end
end
end
state_metric=state_metric(:
2:
-1:
1);
end
%startdecodingofthetailchannel-outputs
fori=depth_of_trellis-L+2:
depth_of_trellis
flag=zeros(1,number_of_states);
last_stop=number_of_states/(2^((i-depth_of_trellis+L-2)*k));
forj=0:
last_stop-1
branch_metric=0;
binary_output=deci2bin(output(j+1,1),n);
forr=1:
n
branch_metric=branch_metric+metric(channel_output_matrix(r,i),binary_output(r));
end
if((state_metric(nextstate(j+1,l+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;
suvivor_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
%generatethedecodeoutputfromtheoptimalpath
state_sequence=zeros(1,depth_of_trellis+1);
state_sequence(1,depth_of_trellis)=survivor_state(1,depth_of_trellis+1);
fori=1:
depth_of_trellis
state_sequence(1,depth_of_trellis-i+1)=suvivor_state((state_sequence(1,depth_of_trellis+2-i)...
+1),depth_of_trellis-i+2);
end
decoder_output_matrix=zeros(k,depth_of_trellis-L+1);
fori=1:
depth_of_trellis-L+1
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(:
i)=dec_output_bin(k:
-1:
1)';
end
decoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));
cumulated_metric=state_metric(1,1);
%writetheoutputtotheencodetext
result=fopen(decodetext,'w');
fori=1:
k*(depth_of_trellis-L+1)
fwrite(result,decoder_output(i),'bit1');
end
fclose(result);
toc
%*************************************************************************%
functiondistance=metric(x,y)
ifx==y
distance=0;
else
distance=1;
end
%************************************************************************%
function[next_state,memory_contents]=nxt_stat(current_state,input,L,k)
binary_state=deci2bin(current_state,k*(L-1));
binary_input=deci2bin(input,k);
next_state_binary=[binary_input,binary_state(1:
(L-2)*k)];
next_state=bin2deci(next_state_binary);
memory_contents=[binary_input,binary_state];
%************************************************************************%
functiony=bin2deci(x)
l=length(x);
y=(l-1:
-1:
0);
y=2.^y;
y=x*y';
%************************************************************************%
functiony=deci2bin(x,L)
y=zeros(1,L);
i=1;
whilex>=0&i<=L
y(i)=rem(x,2);
x=(x-y(i))/2;
i=i+1;
end