Jael
2010-06-23, 01:47
大家好,我编了一个程序,如下:
clear all;
clc;
cycl = 50;
snr_db = 0:1:10;
% 输入信息
msg = randint(1,1024);
ber0 = zeros(cycl,length(snr_db));
ber1 = zeros(cycl,length(snr_db));
ber2 = zeros(cycl,length(snr_db));
% Trellises
trel = poly2trellis(3,[5 7]); %Define trellis for rate 1/2 code.
for n = 1:cycl
for x = 1:length(snr_db)
% Code words
code = convenc(msg,trel); % Encode.
% Interleaver
state = 20;
inter = randintrlv(code,state);
% BPSK 调制
s0 = sign(msg - 0.5);
s1 = sign(inter-0.5);
s2 = sign(code-0.5);
% AWGN Channel
add_noise0=awgn(s0,snr_db(x),'measured');
add_noise1=awgn(s1,snr_db(x),'measured');
add_noise2=awgn(s2,snr_db(x),'measured');
% Deinterleaver with noise for soft decoding
deinter_noise = randdeintrlv(add_noise2,state);
% 解调
r_0 = 0.5*sign(add_noise0) + 0.5;
r_1 = 0.5*sign(add_noise1) + 0.5;
r_2 = 0.5*sign(add_noise2) + 0.5;
% Deinterleaver
deinter_1 = randdeintrlv(r_1,state);
% Traceback length
tblen = 5;
% vitdec 硬判决
decoded1 = vitdec(deinter_1,trel,tblen,'cont','hard');
% vitdec 软判决
[y,qcode] = quantiz(deinter_noise,[-.75 -.5 -.25 0 .25 .5 .75],7:-1:0);
decoded2 = vitdec(qcode',trel,tblen,'cont','soft',3);
% 比较误码率
[num0,rat0] = biterr(r_0,msg);
[num1,rat1] = biterr(double(decoded1(tblen+1:end)),msg(1:end-tblen));
[num2,rat2] = biterr(decoded2(tblen+1:end),(msg(1:end-tblen)'));
ber0(n,x) = rat0;
ber1(n,x) = rat1;
ber2(n,x) = rat2;
end
end
ber0 = mean(ber0);
ber1 = mean(ber1);
ber2 = mean(ber2);
semilogy(snr_db,ber0,'b-o',snr_db,ber1,'r-s',snr_db,ber2,'k-p');
xlabel('SNR (dB)');
ylabel('BER');
legend('Uncoded','Hard Coded','Soft Coded');
title('Performance of convolutional code with rate 1/2');
运行后发现软判决为一条直线,不知哪里出错了?应该如何修改程序呢?急啊,请高人指点
另外如果想定义高斯信道,若不想用awgn函数,该如何从定义出发编写高斯信道呢?
clear all;
clc;
cycl = 50;
snr_db = 0:1:10;
% 输入信息
msg = randint(1,1024);
ber0 = zeros(cycl,length(snr_db));
ber1 = zeros(cycl,length(snr_db));
ber2 = zeros(cycl,length(snr_db));
% Trellises
trel = poly2trellis(3,[5 7]); %Define trellis for rate 1/2 code.
for n = 1:cycl
for x = 1:length(snr_db)
% Code words
code = convenc(msg,trel); % Encode.
% Interleaver
state = 20;
inter = randintrlv(code,state);
% BPSK 调制
s0 = sign(msg - 0.5);
s1 = sign(inter-0.5);
s2 = sign(code-0.5);
% AWGN Channel
add_noise0=awgn(s0,snr_db(x),'measured');
add_noise1=awgn(s1,snr_db(x),'measured');
add_noise2=awgn(s2,snr_db(x),'measured');
% Deinterleaver with noise for soft decoding
deinter_noise = randdeintrlv(add_noise2,state);
% 解调
r_0 = 0.5*sign(add_noise0) + 0.5;
r_1 = 0.5*sign(add_noise1) + 0.5;
r_2 = 0.5*sign(add_noise2) + 0.5;
% Deinterleaver
deinter_1 = randdeintrlv(r_1,state);
% Traceback length
tblen = 5;
% vitdec 硬判决
decoded1 = vitdec(deinter_1,trel,tblen,'cont','hard');
% vitdec 软判决
[y,qcode] = quantiz(deinter_noise,[-.75 -.5 -.25 0 .25 .5 .75],7:-1:0);
decoded2 = vitdec(qcode',trel,tblen,'cont','soft',3);
% 比较误码率
[num0,rat0] = biterr(r_0,msg);
[num1,rat1] = biterr(double(decoded1(tblen+1:end)),msg(1:end-tblen));
[num2,rat2] = biterr(decoded2(tblen+1:end),(msg(1:end-tblen)'));
ber0(n,x) = rat0;
ber1(n,x) = rat1;
ber2(n,x) = rat2;
end
end
ber0 = mean(ber0);
ber1 = mean(ber1);
ber2 = mean(ber2);
semilogy(snr_db,ber0,'b-o',snr_db,ber1,'r-s',snr_db,ber2,'k-p');
xlabel('SNR (dB)');
ylabel('BER');
legend('Uncoded','Hard Coded','Soft Coded');
title('Performance of convolutional code with rate 1/2');
运行后发现软判决为一条直线,不知哪里出错了?应该如何修改程序呢?急啊,请高人指点
另外如果想定义高斯信道,若不想用awgn函数,该如何从定义出发编写高斯信道呢?