MATLAB实现卷积码编译码(7)

2019-04-21 14:34

聊城大学本科毕业论文(设计)

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


MATLAB实现卷积码编译码(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《培养小学生数学阅读能力的实践与研究》总报告

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: