📄 maxlogmap_seq.m
字号:
%function MaxLogMAP_seq(G)%single user transmission of a coded binary stream over an AWGN channel
%MaxLogMAP algorithm
clear all
pack
clc
warning off
start_time = cputime;
%main parameters
EbN0_dB = 0:0.5:5;%energy per data bit to noise ratio
block_len = 128;
block_nb = 782;
%non systematic convolutional code
G = [1 0 1; 1 1 1];%5, 7 in octal
%G = [1 1 0 1; 1 1 1 1];%15, 17 in octal
%G = [1 0 0 1 1; 1 1 1 0 1];%23, 35 in octal
%G = [1 0 1 0 1 1; 1 1 1 1 0 1];%53, 75 in octal
%G = [1 0 1 1 0 1 1; 1 1 1 1 0 0 1];%133, 171 in octal
%G = [1 0 1; 1 1 1; 1 1 1];%5, 7, 7 in octal
%G = [1 0 1 1 0 1 1;1 1 0 0 1 0 1;1 1 1 1 1 0 1];%133, 145, 175 in octal
K = size(G, 2);%constraint length
n0 = size(G, 1);%code rate R=1/n0
rho = 1/n0;
M = K-1;%memory length
state = zeros(1, M);%initial state
%informational signal
randn('seed', 1)
bits_data = 0.5*(1+sign(randn(1, block_len*block_nb)));
bits_data(find(bits_data==0.5)) = 1;
for n=1:block_nb
bits_in((1:(block_len+M))+(n-1)*(block_len+M)) = [bits_data((1:block_len)+(n-1)*block_len) state];%emitted bits so that the trellis periodically closes (T=block_len)
end
bits_out = [];
for n=1:length(bits_in)
for k=1:n0
bits_out = [bits_out xorsum([bits_in(n) state].*G(k, :))];
end
state(2:M) = state(1:M-1);%shift
state(1) = bits_in(n);
end
sig_em = 2*(bits_out - 0.5);%BPSK modulation (1->1, 0->-1)
for iter = 1:length(EbN0_dB)
disp(['EbN0_dB = ' num2str(EbN0_dB(iter))])
%channel
Ps = mean(abs(sig_em).^2);
Ec = 1*Ps;%coded bit energy
N0 = Ec*10^(-(EbN0_dB(iter) + 10*log10(rho))/10);
sigma2 = N0/2;
noise = sqrt(sigma2)*randn(1, length(sig_em));
sig_rec = sig_em + noise;
%block by block decodification
LLRd = zeros(1, block_nb*block_len);
for n=1:block_nb
LLRd((1:(block_len+M))+(n-1)*(block_len+M)) = MaxLogMAPdec(sig_rec((1:n0*(block_len+M))+(n-1)*n0*(block_len+M)), G, sigma2);
end
%compute BER only using the data bits
buffer = (1+sign(LLRd))/2;
bits_rec = [];
for n=1:block_nb
bits_rec = [bits_rec buffer((1:block_len)+(n-1)*(block_len+M))];
end
clear buffer
BER(iter) = length(find(bits_rec-bits_data))/length(bits_data);
end
%BER
stop_time = cputime - start_time;
figure
semilogy(EbN0_dB, BER, 'o-')
grid on
xlabel('E_b/N_0 [dB]')
ylabel('BER')
%filename = ['MaxLogMAP_' num2str(n0) '_' num2str(K) '_' num2str(sum(sum(G)))];
%save(filename, 'EbN0_dB', 'BER', 'rho', 'G', 'stop_time')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -