聊城大学本科毕业论文(设计)
binary_output=deci2bin(output(j+1,m+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,m+1)+1,2)>state_metric(j+1,1)+branch_metric)| flag(nextstate(j+1,m+1)+1)==0 )
state_metric(nextstate(j+1,m+1)+1,2)=state_metric(j+1,1)+branch_metric;
survivor_state(nextstate(j+1,m+1)+1,i+1)=j; flag(nextstate(j+1,m+1)+1)=1; end end end
state_metric=state_metric(:,2:-1:1); end
for i=depth_of_trellis-N+2:depth_of_trellis flag=zeros(1,number_of_states);
last_stop=number_of_states/(2^(k*(i-depth_of_trellis+N-2))); 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));
26
聊城大学本科毕业论文(设计)
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);
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
decoder_output_matrix=zeros(k,depth_of_trellis-N+1); for i=1:depth_of_trellis-N+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相应的位置 decoder_output_matrix(:,i)=dec_output_bin(k:-1:1)'; end
decoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-N
27
聊城大学本科毕业论文(设计)
+1));
cumulated_metric=state_metric(1,1); 3.4.3 viterbi译码matlab仿真
将程序在matlab中进行仿真,对于(2,1,3)译码,G=[1 1 1;1 0 1],channel_output=recv,此时令信噪比snr_db=12,得到仿真图形如图3-5所示:
snr_db12
图3-5 信源编码及viterbi译码
输出的是正确结果[1 1 0 1],由理论分析知,信道编码经过bpsk调制,由于信道噪声的干扰,在信号解调后会产生一定的差错,维特比译码虽然有具有纠错功能,但是毕竟是有限的,所以信噪比对viterbi译码性能将产生影响,且信噪比越大,维特比译码越准确。为了验证上述推论,将信噪比减小,令SNR=6。Matalb仿真结果如图3-6所示:当信噪比降低到SNR=6时,译码输出变为[0 1 1 1],产生了差错。验证了上述推论。
snr_db=6
图3-6 信道编码及viterbi译码
3.4.4信噪比对卷积码译码性能的影响
28
聊城大学本科毕业论文(设计)
上述过程只是可以看出信噪比会影响维特比译码的性能,为了进一步得到两者更加直观的联系,我们可以通过编程得到信噪比与误码率之间的函数关系,同时将没有进行卷积码的信号也计算其误码率。代码如下: clear all; clc;
snr_db = 0:10; %信息源
msg = randint(1,1e3);
ber0 = zeros(1,length(snr_db)); ber1 = zeros(1,length(snr_db)); % Trellises
trel = poly2trellis(3,[7 5]); Tfine trellis for rate 1/2 code. for n=1:length(msg)/2; for x=1:length(snr_db) % Code words
code = convenc(msg,trel); % Encode. state = 20;
inter = randintrlv(code,state); % BPSK 调制
s0 = sign(msg-0.5); s1 = sign(inter-0.5); % AWGN Channel
add_noise0=awgn(s0,snr_db(x),'measured'); add_noise1=awgn(s1,snr_db(x),'measured'); % Deinterleaver with noise for soft decoding deinter_noise = randdeintrlv(add_noise1,state); % 解调
r_0 = 0.5*sign(add_noise0) + 0.5; r_1 = 0.5*sign(add_noise1) + 0.5; % Deinterleaver
29
聊城大学本科毕业论文(设计)
deinter_1 = randdeintrlv(r_1,state); % Traceback length tblen = 5; % vitdec 判决
decoded1 = vitdec(deinter_1,trel,tblen,'cont','hard'); % vitdec 判决 % 比较误码率
[num0,rat0] = biterr(r_0,msg);
[num1,rat1] = biterr(double(decoded1(tblen+1:end)),msg(1:end-tblen)); ber0(n,x) = rat0; ber1(n,x) = rat1; end end
ber0 = mean(ber0); ber1 = mean(ber1);
程序在matlab中运行,得到仿真图如图3-7所示,该图直观的反映了经过卷积码编码和没有经过卷积码编码的误码率之间的区别。从图中可以看出,当信噪比较小时,未编码的误码率反而比采用编码的误码率低,这是因为误比特太多导致接收到的信息几乎无效。但是当信噪比稍高后卷积码编码译码的误码率就大大降低了。
没有卷积
卷积
图3-7 误码率比较图形
3.4.5码率对卷积码译码性能的影响
卷积码的码率 R=k/n,它是卷积码的一个重要参数,当改变卷积码的码率时,
30